~aleteoryx/muditaos

ref: 5ca8e9e5cf96ed95f7e62b2d42194dcc50ec8ad8 muditaos/module-apps/application-alarm-clock/models/AlarmsRepository.cpp -rw-r--r-- 3.1 KiB
5ca8e9e5 — Lefucjusz [MOS-1004] Fix autolock on SMS template call rejection 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "AlarmsRepository.hpp"
#include <service-time/include/service-time/AlarmMessage.hpp>
#include <service-time/Constants.hpp>

#include "AsyncTask.hpp"
#include "log/log.hpp"

namespace app::alarmClock
{
    auto async = app::AsyncRequest::createFromMessage;

    AlarmsDBRepository::AlarmsDBRepository(ApplicationCommon *application)
        : AsyncCallbackReceiver{application}, application{application}
    {}

    void AlarmsDBRepository::getLimited(std::uint32_t offset, std::uint32_t limit, const OnGetCallback &callback)
    {
        auto request = std::make_unique<alarms::AlarmsGetInRangeRequestMessage>(offset, limit);
        auto task    = async(std::move(request), service::name::service_time); // -> std::unique_ptr<AsyncRequest>;
        auto cb      = [callback](auto response) {
            auto result = dynamic_cast<alarms::AlarmsGetInRangeResponseMessage *>(response);
            if (result == nullptr) {
                LOG_ERROR("BAD RESULT");
                return false;
            }
            if (callback) {
                callback(result->alarms, result->count);
            }
            return true;
        };
        task->execute(application, this, cb);
    }

    template <class Request, class Result, typename... Args>
    void AlarmsDBRepository::GetQuery(const AbstractAlarmsRepository::OnResultCallback &callback, Args &&...args)
    {
        auto task = async(std::make_unique<Request>(std::forward<Args>(args)...), service::name::service_time);
        auto cb   = [callback](auto response) {
            auto result = dynamic_cast<Result *>(response);
            if (result == nullptr) {
                LOG_ERROR("BAD RESULT");
                return false;
            }
            if (callback) {
                callback(result->success);
            }
            return true;
        };
        task->execute(application, this, cb);
    }

    void AlarmsDBRepository::add(const AlarmEventRecord &alarm,
                                 const AbstractAlarmsRepository::OnResultCallback &callback)
    {
        GetQuery<alarms::AlarmAddRequestMessage, alarms::AlarmAddResponseMessage>(callback, alarm);
    }

    void AlarmsDBRepository::remove(const AlarmEventRecord &alarm,
                                    const AbstractAlarmsRepository::OnResultCallback &callback)
    {
        GetQuery<alarms::AlarmRemoveRequestMessage, alarms::AlarmRemoveResponseMessage>(callback, alarm.ID);
    }

    void AlarmsDBRepository::update(const AlarmEventRecord &alarm,
                                    const AbstractAlarmsRepository::OnResultCallback &callback)
    {
        GetQuery<alarms::AlarmUpdateRequestMessage, alarms::AlarmUpdateResponseMessage>(callback, alarm);
    }

    void AlarmsDBRepository::turnOffAll(const AbstractAlarmsRepository::OnResultCallback &callback)
    {
        GetQuery<alarms::AlarmToggleAllRequestMessage, alarms::AlarmToggleAllResponseMessage>(callback, false);
    }
} // namespace app::alarmClock