From a2b07e7b952c66e31e8e8ebdb9722a905a091a37 Mon Sep 17 00:00:00 2001 From: Jonas L Date: Mon, 4 Mar 2019 00:00:00 +0000 Subject: [PATCH] Add action to update blocking all notifications flag --- src/action/index.ts | 1 + src/action/serialization/parentaction.ts | 4 ++ .../updatecategoryblockallnotifications.ts | 49 +++++++++++++++++++ src/api/validator.ts | 26 ++++++++++ .../dispatch-parent-action/index.ts | 4 ++ .../updatecategoryblockallnotifications.ts | 39 +++++++++++++++ 6 files changed, 123 insertions(+) create mode 100644 src/action/updatecategoryblockallnotifications.ts create mode 100644 src/function/sync/apply-actions/dispatch-parent-action/updatecategoryblockallnotifications.ts diff --git a/src/action/index.ts b/src/action/index.ts index 6b68291..0d00ef7 100644 --- a/src/action/index.ts +++ b/src/action/index.ts @@ -49,6 +49,7 @@ export { SetUserDisableLimitsUntilAction } from './setuserdisablelimitsuntil' export { SetUserTimezoneAction } from './setusertimezone' export { SignOutAtDeviceAction } from './signoutatdevice' export { TriedDisablingDeviceAdminAction } from './trieddisablingdeviceadmin' +export { UpdateCategoryBlockAllNotificationsAction } from './updatecategoryblockallnotifications' export { UpdateCategoryBlockedTimesAction } from './updatecategoryblockedtimes' export { UpdateCategoryTemporarilyBlockedAction } from './updatecategorytemporarilyblocked' export { UpdateCategoryTitleAction } from './updatecategorytitle' diff --git a/src/action/serialization/parentaction.ts b/src/action/serialization/parentaction.ts index ff156da..228e5e2 100644 --- a/src/action/serialization/parentaction.ts +++ b/src/action/serialization/parentaction.ts @@ -41,6 +41,7 @@ import { SerializedSetRelaxPrimaryDeviceAction, SetRelaxPrimaryDeviceAction } fr import { SerializedSetSendDeviceConnected, SetSendDeviceConnected } from '../setsenddeviceconnected' import { SerializedSetUserDisableLimitsUntilAction, SetUserDisableLimitsUntilAction } from '../setuserdisablelimitsuntil' import { SerializedSetUserTimezoneAction, SetUserTimezoneAction } from '../setusertimezone' +import { SerializedUpdateCategoryBlockAllNotificationsAction, UpdateCategoryBlockAllNotificationsAction } from '../updatecategoryblockallnotifications' import { SerializedUpdateCategoryBlockedTimesAction, UpdateCategoryBlockedTimesAction } from '../updatecategoryblockedtimes' import { SerializedUpdateCategoryTemporarilyBlockedAction, UpdateCategoryTemporarilyBlockedAction } from '../updatecategorytemporarilyblocked' import { SerializedUpdateCategoryTitleAction, UpdateCategoryTitleAction } from '../updatecategorytitle' @@ -75,6 +76,7 @@ export type SerializedParentAction = SerializedSetSendDeviceConnected | SerializedSetUserDisableLimitsUntilAction | SerializedSetUserTimezoneAction | + SerializedUpdateCategoryBlockAllNotificationsAction | SerializedUpdateCategoryBlockedTimesAction | SerializedUpdateCategoryTemporarilyBlockedAction | SerializedUpdateCategoryTitleAction | @@ -134,6 +136,8 @@ export const parseParentAction = (action: SerializedParentAction): ParentAction return SetUserDisableLimitsUntilAction.parse(action) } else if (action.type === 'SET_USER_TIMEZONE') { return SetUserTimezoneAction.parse(action) + } else if (action.type === 'UPDATE_CATEGORY_BLOCK_ALL_NOTIFICATIONS') { + return UpdateCategoryBlockAllNotificationsAction.parse(action) } else if (action.type === 'UPDATE_CATEGORY_BLOCKED_TIMES') { return UpdateCategoryBlockedTimesAction.parse(action) } else if (action.type === 'UPDATE_CATEGORY_TITLE') { diff --git a/src/action/updatecategoryblockallnotifications.ts b/src/action/updatecategoryblockallnotifications.ts new file mode 100644 index 0000000..3cbb558 --- /dev/null +++ b/src/action/updatecategoryblockallnotifications.ts @@ -0,0 +1,49 @@ +/* + * server component for the TimeLimit App + * Copyright (C) 2019 Jonas Lochmann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { assertIdWithinFamily } from '../util/token' +import { ParentAction } from './basetypes' + +export class UpdateCategoryBlockAllNotificationsAction extends ParentAction { + readonly categoryId: string + readonly blocked: boolean + + constructor ({ categoryId, blocked }: {categoryId: string, blocked: boolean}) { + super() + + assertIdWithinFamily(categoryId) + + this.categoryId = categoryId + this.blocked = blocked + } + + serialize = (): SerializedUpdateCategoryBlockAllNotificationsAction => ({ + type: 'UPDATE_CATEGORY_BLOCK_ALL_NOTIFICATIONS', + categoryId: this.categoryId, + blocked: this.blocked + }) + + static parse = ({ categoryId, blocked }: SerializedUpdateCategoryBlockAllNotificationsAction) => ( + new UpdateCategoryBlockAllNotificationsAction({ categoryId, blocked }) + ) +} + +export interface SerializedUpdateCategoryBlockAllNotificationsAction { + type: 'UPDATE_CATEGORY_BLOCK_ALL_NOTIFICATIONS' + categoryId: string + blocked: boolean +} diff --git a/src/api/validator.ts b/src/api/validator.ts index 7b2a808..be24725 100644 --- a/src/api/validator.ts +++ b/src/api/validator.ts @@ -740,6 +740,29 @@ const definitions = { "userId" ] }, + "SerializedUpdateCategoryBlockAllNotificationsAction": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "UPDATE_CATEGORY_BLOCK_ALL_NOTIFICATIONS" + ] + }, + "categoryId": { + "type": "string" + }, + "blocked": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "blocked", + "categoryId", + "type" + ] + }, "SerializedUpdateCategoryBlockedTimesAction": { "type": "object", "properties": { @@ -1424,6 +1447,9 @@ export const isSerializedParentAction: (value: object) => value is SerializedPar { "$ref": "#/definitions/SerializedSetUserTimezoneAction" }, + { + "$ref": "#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction" + }, { "$ref": "#/definitions/SerializedUpdateCategoryBlockedTimesAction" }, diff --git a/src/function/sync/apply-actions/dispatch-parent-action/index.ts b/src/function/sync/apply-actions/dispatch-parent-action/index.ts index cfb3fb0..c0869da 100644 --- a/src/function/sync/apply-actions/dispatch-parent-action/index.ts +++ b/src/function/sync/apply-actions/dispatch-parent-action/index.ts @@ -42,6 +42,7 @@ import { SetSendDeviceConnected, SetUserDisableLimitsUntilAction, SetUserTimezoneAction, + UpdateCategoryBlockAllNotificationsAction, UpdateCategoryBlockedTimesAction, UpdateCategoryTemporarilyBlockedAction, UpdateCategoryTitleAction, @@ -76,6 +77,7 @@ import { dispatchSetRelaxPrimaryDevice } from './setrelaxprimarydevice' import { dispatchSetSendDeviceConnected } from './setsenddeviceconnected' import { dispatchUserSetDisableLimitsUntil } from './setuserdisablelmitsuntil' import { dispatchSetUserTimezone } from './setusertimezone' +import { dispatchUpdateCategoryBlockAllNotifications } from './updatecategoryblockallnotifications' import { dispatchUpdateCategoryBlockedTimes } from './updatecategoryblockedtimes' import { dispatchUpdateCategoryTemporarilyBlocked } from './updatecategorytemporarilyblocked' import { dispatchUpdateCategoryTitle } from './updatecategorytitle' @@ -130,6 +132,8 @@ export const dispatchParentAction = async ({ action, cache, parentUserId, source await dispatchUserSetDisableLimitsUntil({ action, cache }) } else if (action instanceof SetUserTimezoneAction) { await dispatchSetUserTimezone({ action, cache }) + } else if (action instanceof UpdateCategoryBlockAllNotificationsAction) { + await dispatchUpdateCategoryBlockAllNotifications({ action, cache }) } else if (action instanceof UpdateCategoryBlockedTimesAction) { await dispatchUpdateCategoryBlockedTimes({ action, cache }) } else if (action instanceof IncrementCategoryExtraTimeAction) { diff --git a/src/function/sync/apply-actions/dispatch-parent-action/updatecategoryblockallnotifications.ts b/src/function/sync/apply-actions/dispatch-parent-action/updatecategoryblockallnotifications.ts new file mode 100644 index 0000000..542dd41 --- /dev/null +++ b/src/function/sync/apply-actions/dispatch-parent-action/updatecategoryblockallnotifications.ts @@ -0,0 +1,39 @@ +/* + * server component for the TimeLimit App + * Copyright (C) 2019 Jonas Lochmann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { UpdateCategoryBlockAllNotificationsAction } from '../../../../action' +import { Cache } from '../cache' + +export async function dispatchUpdateCategoryBlockAllNotifications ({ action, cache }: { + action: UpdateCategoryBlockAllNotificationsAction + cache: Cache +}) { + const [affectedRows] = await cache.database.category.update({ + blockAllNotifications: action.blocked + }, { + where: { + familyId: cache.familyId, + categoryId: action.categoryId + }, + transaction: cache.transaction + }) + + if (affectedRows !== 0) { + cache.categoriesWithModifiedBaseData.push(action.categoryId) + cache.areChangesImportant = true + } +}