summaryrefslogtreecommitdiff
path: root/packages/backend/src/server
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2022-12-18 01:59:59 +0900
committerGitHub <noreply@github.com>2022-12-18 01:59:59 +0900
commit4ecc42744c3c8b68e38f58bfe03919bf437f137a (patch)
tree094230a6992c05cf39136913d02400fae27931d7 /packages/backend/src/server
parentfix(server): GitHubログインしようとするとreply.setCookie is not a ... (diff)
downloadsharkey-4ecc42744c3c8b68e38f58bfe03919bf437f137a.tar.gz
sharkey-4ecc42744c3c8b68e38f58bfe03919bf437f137a.tar.bz2
sharkey-4ecc42744c3c8b68e38f58bfe03919bf437f137a.zip
enhance: Implement the toggle to (or not to) close push notifications when notifications or messages are read (#9219)
* create file * wip * fix * wip * tabun dekita * :v: * implement subscribe push notification button to tutorial * check-exists→show-registration * add column sendReadMessage * fix migration file * sw api * change PushNotificationService * wip * :v: * fix tutorial footer flex
Diffstat (limited to 'packages/backend/src/server')
-rw-r--r--packages/backend/src/server/api/EndpointsModule.ts6
-rw-r--r--packages/backend/src/server/api/endpoints.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/sw/register.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/sw/show-registration.ts66
-rw-r--r--packages/backend/src/server/api/endpoints/sw/unregister.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/sw/update-registration.ts82
6 files changed, 180 insertions, 2 deletions
diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts
index e41ed388b4..647f60317a 100644
--- a/packages/backend/src/server/api/EndpointsModule.ts
+++ b/packages/backend/src/server/api/EndpointsModule.ts
@@ -272,6 +272,8 @@ import * as ep___resetDb from './endpoints/reset-db.js';
import * as ep___resetPassword from './endpoints/reset-password.js';
import * as ep___serverInfo from './endpoints/server-info.js';
import * as ep___stats from './endpoints/stats.js';
+import * as ep___sw_show_registration from './endpoints/sw/show-registration.js';
+import * as ep___sw_update_registration from './endpoints/sw/update-registration.js';
import * as ep___sw_register from './endpoints/sw/register.js';
import * as ep___sw_unregister from './endpoints/sw/unregister.js';
import * as ep___test from './endpoints/test.js';
@@ -588,6 +590,8 @@ const $resetDb: Provider = { provide: 'ep:reset-db', useClass: ep___resetDb.defa
const $resetPassword: Provider = { provide: 'ep:reset-password', useClass: ep___resetPassword.default };
const $serverInfo: Provider = { provide: 'ep:server-info', useClass: ep___serverInfo.default };
const $stats: Provider = { provide: 'ep:stats', useClass: ep___stats.default };
+const $sw_show_registration: Provider = { provide: 'ep:sw/show-registration', useClass: ep___sw_show_registration.default };
+const $sw_update_registration: Provider = { provide: 'ep:sw/update-registration', useClass: ep___sw_update_registration.default };
const $sw_register: Provider = { provide: 'ep:sw/register', useClass: ep___sw_register.default };
const $sw_unregister: Provider = { provide: 'ep:sw/unregister', useClass: ep___sw_unregister.default };
const $test: Provider = { provide: 'ep:test', useClass: ep___test.default };
@@ -908,6 +912,8 @@ const $fetchRss: Provider = { provide: 'ep:fetch-rss', useClass: ep___fetchRss.d
$resetPassword,
$serverInfo,
$stats,
+ $sw_show_registration,
+ $sw_update_registration,
$sw_register,
$sw_unregister,
$test,
diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts
index b2ab36e070..6d10cb8f35 100644
--- a/packages/backend/src/server/api/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints.ts
@@ -271,6 +271,8 @@ import * as ep___resetDb from './endpoints/reset-db.js';
import * as ep___resetPassword from './endpoints/reset-password.js';
import * as ep___serverInfo from './endpoints/server-info.js';
import * as ep___stats from './endpoints/stats.js';
+import * as ep___sw_show_registration from './endpoints/sw/show-registration.js';
+import * as ep___sw_update_registration from './endpoints/sw/update-registration.js';
import * as ep___sw_register from './endpoints/sw/register.js';
import * as ep___sw_unregister from './endpoints/sw/unregister.js';
import * as ep___test from './endpoints/test.js';
@@ -585,6 +587,8 @@ const eps = [
['reset-password', ep___resetPassword],
['server-info', ep___serverInfo],
['stats', ep___stats],
+ ['sw/show-registration', ep___sw_show_registration],
+ ['sw/update-registration', ep___sw_update_registration],
['sw/register', ep___sw_register],
['sw/unregister', ep___sw_unregister],
['test', ep___test],
diff --git a/packages/backend/src/server/api/endpoints/sw/register.ts b/packages/backend/src/server/api/endpoints/sw/register.ts
index ddec877dd4..bfd5de7b00 100644
--- a/packages/backend/src/server/api/endpoints/sw/register.ts
+++ b/packages/backend/src/server/api/endpoints/sw/register.ts
@@ -25,6 +25,18 @@ export const meta = {
type: 'string',
optional: false, nullable: true,
},
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ endpoint: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ sendReadMessage: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
},
},
} as const;
@@ -35,6 +47,7 @@ export const paramDef = {
endpoint: { type: 'string' },
auth: { type: 'string' },
publickey: { type: 'string' },
+ sendReadMessage: { type: 'boolean', default: false },
},
required: ['endpoint', 'auth', 'publickey'],
} as const;
@@ -64,6 +77,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
return {
state: 'already-subscribed' as const,
key: instance.swPublicKey,
+ userId: me.id,
+ endpoint: exist.endpoint,
+ sendReadMessage: exist.sendReadMessage,
};
}
@@ -74,11 +90,15 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
endpoint: ps.endpoint,
auth: ps.auth,
publickey: ps.publickey,
+ sendReadMessage: ps.sendReadMessage,
});
return {
state: 'subscribed' as const,
key: instance.swPublicKey,
+ userId: me.id,
+ endpoint: ps.endpoint,
+ sendReadMessage: ps.sendReadMessage,
};
});
}
diff --git a/packages/backend/src/server/api/endpoints/sw/show-registration.ts b/packages/backend/src/server/api/endpoints/sw/show-registration.ts
new file mode 100644
index 0000000000..bede10be5c
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/sw/show-registration.ts
@@ -0,0 +1,66 @@
+import { Inject, Injectable } from '@nestjs/common';
+import type { SwSubscriptionsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
+
+export const meta = {
+ tags: ['account'],
+
+ requireCredential: true,
+
+ description: 'Check push notification registration exists.',
+
+ res: {
+ type: 'object',
+ optional: false, nullable: true,
+ properties: {
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ endpoint: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ sendReadMessage: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ },
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
+ },
+ required: ['endpoint'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.swSubscriptionsRepository)
+ private swSubscriptionsRepository: SwSubscriptionsRepository,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // if already subscribed
+ const exist = await this.swSubscriptionsRepository.findOneBy({
+ userId: me.id,
+ endpoint: ps.endpoint,
+ });
+
+ if (exist != null) {
+ return {
+ userId: exist.userId,
+ endpoint: exist.endpoint,
+ sendReadMessage: exist.sendReadMessage,
+ };
+ }
+
+ return null;
+ });
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/sw/unregister.ts b/packages/backend/src/server/api/endpoints/sw/unregister.ts
index 5772eeee26..f12b98617d 100644
--- a/packages/backend/src/server/api/endpoints/sw/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/sw/unregister.ts
@@ -6,7 +6,7 @@ import { DI } from '@/di-symbols.js';
export const meta = {
tags: ['account'],
- requireCredential: true,
+ requireCredential: false,
description: 'Unregister from receiving push notifications.',
} as const;
@@ -28,7 +28,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
) {
super(meta, paramDef, async (ps, me) => {
await this.swSubscriptionsRepository.delete({
- userId: me.id,
+ ...(me ? { userId: me.id } : {}),
endpoint: ps.endpoint,
});
});
diff --git a/packages/backend/src/server/api/endpoints/sw/update-registration.ts b/packages/backend/src/server/api/endpoints/sw/update-registration.ts
new file mode 100644
index 0000000000..9f08c8148d
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/sw/update-registration.ts
@@ -0,0 +1,82 @@
+import { Inject, Injectable } from '@nestjs/common';
+import type { SwSubscriptionsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
+import { ApiError } from '../../error.js';
+
+export const meta = {
+ tags: ['account'],
+
+ requireCredential: true,
+
+ description: 'Update push notification registration.',
+
+ res: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ userId: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ endpoint: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ sendReadMessage: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ },
+ },
+ errors: {
+ noSuchRegistration: {
+ message: 'No such registration.',
+ code: 'NO_SUCH_REGISTRATION',
+ id: ' b09d8066-8064-5613-efb6-0e963b21d012',
+ },
+ }
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
+ sendReadMessage: { type: 'boolean' },
+ },
+ required: ['endpoint'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.swSubscriptionsRepository)
+ private swSubscriptionsRepository: SwSubscriptionsRepository,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const swSubscription = await this.swSubscriptionsRepository.findOneBy({
+ userId: me.id,
+ endpoint: ps.endpoint,
+ });
+
+ if (swSubscription === null) {
+ throw new ApiError(meta.errors.noSuchRegistration);
+ }
+
+ if (ps.sendReadMessage !== undefined) {
+ swSubscription.sendReadMessage = ps.sendReadMessage;
+ }
+
+ await this.swSubscriptionsRepository.update(swSubscription.id, {
+ sendReadMessage: swSubscription.sendReadMessage,
+ });
+
+ return {
+ userId: swSubscription.userId,
+ endpoint: swSubscription.endpoint,
+ sendReadMessage: swSubscription.sendReadMessage,
+ };
+ });
+ }
+}