summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2024-01-23 10:51:59 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2024-01-23 10:51:59 +0900
commite8ba0b3f54c2f25566f467d27c45c66139cbf102 (patch)
treec45b699d83806eb2086efef6c0efa482f76c4212 /packages/backend/src/server/api/endpoints
parent:art: (diff)
downloadsharkey-e8ba0b3f54c2f25566f467d27c45c66139cbf102.tar.gz
sharkey-e8ba0b3f54c2f25566f467d27c45c66139cbf102.tar.bz2
sharkey-e8ba0b3f54c2f25566f467d27c45c66139cbf102.zip
enhance(reversi): improve desync handling
Diffstat (limited to 'packages/backend/src/server/api/endpoints')
-rw-r--r--packages/backend/src/server/api/endpoints/reversi/verify.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/endpoints/reversi/verify.ts b/packages/backend/src/server/api/endpoints/reversi/verify.ts
new file mode 100644
index 0000000000..5f5af6ce67
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/reversi/verify.ts
@@ -0,0 +1,64 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { ReversiService } from '@/core/ReversiService.js';
+import { ReversiGameEntityService } from '@/core/entities/ReversiGameEntityService.js';
+import { ApiError } from '../../error.js';
+
+export const meta = {
+ errors: {
+ noSuchGame: {
+ message: 'No such game.',
+ code: 'NO_SUCH_GAME',
+ id: '8fb05624-b525-43dd-90f7-511852bdfeee',
+ },
+ },
+
+ res: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ desynced: { type: 'boolean' },
+ game: {
+ type: 'object',
+ optional: true, nullable: true,
+ ref: 'ReversiGameDetailed',
+ },
+ },
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ gameId: { type: 'string', format: 'misskey:id' },
+ crc32: { type: 'string' },
+ },
+ required: ['gameId', 'crc32'],
+} as const;
+
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
+ constructor(
+ private reversiService: ReversiService,
+ private reversiGameEntityService: ReversiGameEntityService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const game = await this.reversiService.checkCrc(ps.gameId, ps.crc32);
+ if (game) {
+ return {
+ desynced: true,
+ game: await this.reversiGameEntityService.packDetail(game),
+ };
+ } else {
+ return {
+ desynced: false,
+ };
+ }
+ });
+ }
+}