From d3ecb02644843dbb29c68953271916870862dd5e Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 10 May 2023 15:50:15 +0000 Subject: [PATCH] wip --- .../backend/src/core/AchievementService.ts | 78 +-------- .../entities/NotificationEntityService.ts | 2 +- .../backend/src/models/entities/MutedNote.ts | 2 +- packages/backend/src/models/entities/Note.ts | 2 +- .../src/models/entities/Notification.ts | 2 +- packages/backend/src/models/entities/Poll.ts | 2 +- .../src/models/entities/UserProfile.ts | 2 +- .../src/models/json-schema/notification.ts | 2 +- .../api/endpoints/i/claim-achievement.ts | 3 +- .../server/api/endpoints/i/notifications.ts | 2 +- .../src/server/api/endpoints/i/update.ts | 2 +- packages/backend/src/types.ts | 8 - .../components/MkAchievements.stories.impl.ts | 2 +- .../src/components/MkAchievements.vue | 6 +- .../MkNotificationSettingWindow.vue | 2 +- .../src/components/MkNotifications.vue | 2 +- packages/frontend/src/const.ts | 3 - packages/frontend/src/pages/notifications.vue | 2 +- .../src/pages/settings/notifications.vue | 2 +- packages/frontend/src/scripts/achievements.ts | 77 -------- packages/misskey-js/src/consts.ts | 80 ++++++++- packages/misskey-js/src/index.ts | 2 + packages/misskey-js/src/schemas.ts | 2 +- .../misskey-js/src/schemas/note-reaction.ts | 27 ++- .../misskey-js/src/schemas/notification.ts | 165 ++++++++++++------ 25 files changed, 225 insertions(+), 254 deletions(-) delete mode 100644 packages/backend/src/types.ts diff --git a/packages/backend/src/core/AchievementService.ts b/packages/backend/src/core/AchievementService.ts index 9e223f1492..ad861b093c 100644 --- a/packages/backend/src/core/AchievementService.ts +++ b/packages/backend/src/core/AchievementService.ts @@ -4,83 +4,7 @@ import type { User } from '@/models/entities/User.js'; import { DI } from '@/di-symbols.js'; import { bindThis } from '@/decorators.js'; import { NotificationService } from '@/core/NotificationService.js'; - -export const ACHIEVEMENT_TYPES = [ - 'notes1', - 'notes10', - 'notes100', - 'notes500', - 'notes1000', - 'notes5000', - 'notes10000', - 'notes20000', - 'notes30000', - 'notes40000', - 'notes50000', - 'notes60000', - 'notes70000', - 'notes80000', - 'notes90000', - 'notes100000', - 'login3', - 'login7', - 'login15', - 'login30', - 'login60', - 'login100', - 'login200', - 'login300', - 'login400', - 'login500', - 'login600', - 'login700', - 'login800', - 'login900', - 'login1000', - 'passedSinceAccountCreated1', - 'passedSinceAccountCreated2', - 'passedSinceAccountCreated3', - 'loggedInOnBirthday', - 'loggedInOnNewYearsDay', - 'noteClipped1', - 'noteFavorited1', - 'myNoteFavorited1', - 'profileFilled', - 'markedAsCat', - 'following1', - 'following10', - 'following50', - 'following100', - 'following300', - 'followers1', - 'followers10', - 'followers50', - 'followers100', - 'followers300', - 'followers500', - 'followers1000', - 'collectAchievements30', - 'viewAchievements3min', - 'iLoveMisskey', - 'foundTreasure', - 'client30min', - 'client60min', - 'noteDeletedWithin1min', - 'postedAtLateNight', - 'postedAt0min0sec', - 'selfQuote', - 'htl20npm', - 'viewInstanceChart', - 'outputHelloWorldOnScratchpad', - 'open3windows', - 'driveFolderCircularReference', - 'reactWithoutRead', - 'clickedClickHere', - 'justPlainLucky', - 'setNameToSyuilo', - 'cookieClicked', - 'brainDiver', -] as const; +import { ACHIEVEMENT_TYPES } from 'misskey-js'; @Injectable() export class AchievementService { diff --git a/packages/backend/src/core/entities/NotificationEntityService.ts b/packages/backend/src/core/entities/NotificationEntityService.ts index d76b863957..d6ead01363 100644 --- a/packages/backend/src/core/entities/NotificationEntityService.ts +++ b/packages/backend/src/core/entities/NotificationEntityService.ts @@ -9,7 +9,7 @@ import type { Note } from '@/models/entities/Note.js'; import type { Packed } from '@/misc/json-schema.js'; import { bindThis } from '@/decorators.js'; import { isNotNull } from '@/misc/is-not-null.js'; -import { notificationTypes } from '@/types.js'; +import { notificationTypes } from 'misskey-js'; import type { OnModuleInit } from '@nestjs/common'; import type { CustomEmojiService } from '../CustomEmojiService.js'; import type { UserEntityService } from './UserEntityService.js'; diff --git a/packages/backend/src/models/entities/MutedNote.ts b/packages/backend/src/models/entities/MutedNote.ts index 78347d8917..cacc5955e8 100644 --- a/packages/backend/src/models/entities/MutedNote.ts +++ b/packages/backend/src/models/entities/MutedNote.ts @@ -1,6 +1,6 @@ import { Entity, Index, JoinColumn, Column, ManyToOne, PrimaryColumn } from 'typeorm'; import { id } from '../id.js'; -import { mutedNoteReasons } from '../../types.js'; +import { mutedNoteReasons } from 'misskey-js'; import { Note } from './Note.js'; import { User } from './User.js'; diff --git a/packages/backend/src/models/entities/Note.ts b/packages/backend/src/models/entities/Note.ts index df508b4dca..2a532e5451 100644 --- a/packages/backend/src/models/entities/Note.ts +++ b/packages/backend/src/models/entities/Note.ts @@ -1,6 +1,6 @@ import { Entity, Index, JoinColumn, Column, PrimaryColumn, ManyToOne } from 'typeorm'; import { id } from '../id.js'; -import { noteVisibilities } from '../../types.js'; +import { noteVisibilities } from 'misskey-js'; import { User } from './User.js'; import { Channel } from './Channel.js'; import type { DriveFile } from './DriveFile.js'; diff --git a/packages/backend/src/models/entities/Notification.ts b/packages/backend/src/models/entities/Notification.ts index aa6f997124..e0bd80425e 100644 --- a/packages/backend/src/models/entities/Notification.ts +++ b/packages/backend/src/models/entities/Notification.ts @@ -1,4 +1,4 @@ -import { notificationTypes } from '@/types.js'; +import { notificationTypes } from 'misskey-js'; import { User } from './User.js'; import { Note } from './Note.js'; import { FollowRequest } from './FollowRequest.js'; diff --git a/packages/backend/src/models/entities/Poll.ts b/packages/backend/src/models/entities/Poll.ts index ee1d646020..820c012eac 100644 --- a/packages/backend/src/models/entities/Poll.ts +++ b/packages/backend/src/models/entities/Poll.ts @@ -1,6 +1,6 @@ import { PrimaryColumn, Entity, Index, JoinColumn, Column, OneToOne } from 'typeorm'; import { id } from '../id.js'; -import { noteVisibilities } from '../../types.js'; +import { noteVisibilities } from 'misskey-js'; import { Note } from './Note.js'; import type { User } from './User.js'; diff --git a/packages/backend/src/models/entities/UserProfile.ts b/packages/backend/src/models/entities/UserProfile.ts index 2cebc56096..d5cc3dc3fd 100644 --- a/packages/backend/src/models/entities/UserProfile.ts +++ b/packages/backend/src/models/entities/UserProfile.ts @@ -1,5 +1,5 @@ import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm'; -import { obsoleteNotificationTypes, ffVisibility, notificationTypes } from '@/types.js'; +import { obsoleteNotificationTypes, ffVisibility, notificationTypes } from 'misskey-js'; import { id } from '../id.js'; import { User } from './User.js'; import { Page } from './Page.js'; diff --git a/packages/backend/src/models/json-schema/notification.ts b/packages/backend/src/models/json-schema/notification.ts index e88ca61ba0..8034214588 100644 --- a/packages/backend/src/models/json-schema/notification.ts +++ b/packages/backend/src/models/json-schema/notification.ts @@ -1,4 +1,4 @@ -import { notificationTypes } from '@/types.js'; +import { notificationTypes } from 'misskey-js'; export const packedNotificationSchema = { type: 'object', diff --git a/packages/backend/src/server/api/endpoints/i/claim-achievement.ts b/packages/backend/src/server/api/endpoints/i/claim-achievement.ts index 4eef496385..ddc963c4bb 100644 --- a/packages/backend/src/server/api/endpoints/i/claim-achievement.ts +++ b/packages/backend/src/server/api/endpoints/i/claim-achievement.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; -import { AchievementService, ACHIEVEMENT_TYPES } from '@/core/AchievementService.js'; +import { AchievementService } from '@/core/AchievementService.js'; +import { ACHIEVEMENT_TYPES } from 'misskey-js'; export const meta = { requireCredential: true, diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts index e141be764a..5f60b2444b 100644 --- a/packages/backend/src/server/api/endpoints/i/notifications.ts +++ b/packages/backend/src/server/api/endpoints/i/notifications.ts @@ -2,7 +2,7 @@ import { Brackets, In } from 'typeorm'; import * as Redis from 'ioredis'; import { Inject, Injectable } from '@nestjs/common'; import type { UsersRepository, FollowingsRepository, MutingsRepository, UserProfilesRepository, NotesRepository } from '@/models/index.js'; -import { obsoleteNotificationTypes, notificationTypes } from '@/types.js'; +import { obsoleteNotificationTypes, notificationTypes } from 'misskey-js'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { QueryService } from '@/core/QueryService.js'; import { NoteReadService } from '@/core/NoteReadService.js'; diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index 4cc173c2d0..ce10f13e15 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -8,7 +8,7 @@ import type { UsersRepository, DriveFilesRepository, UserProfilesRepository, Pag import type { User } from '@/models/entities/User.js'; import { birthdaySchema, descriptionSchema, locationSchema, nameSchema } from '@/models/entities/User.js'; import type { UserProfile } from '@/models/entities/UserProfile.js'; -import { notificationTypes } from '@/types.js'; +import { notificationTypes } from 'misskey-js'; import { normalizeForSearch } from '@/misc/normalize-for-search.js'; import { langmap } from '@/misc/langmap.js'; import { Endpoint } from '@/server/api/endpoint-base.js'; diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts deleted file mode 100644 index 7c6a1e5199..0000000000 --- a/packages/backend/src/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const notificationTypes = ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app'] as const; -export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const; - -export const noteVisibilities = ['public', 'home', 'followers', 'specified'] as const; - -export const mutedNoteReasons = ['word', 'manual', 'spam', 'other'] as const; - -export const ffVisibility = ['public', 'followers', 'private'] as const; diff --git a/packages/frontend/src/components/MkAchievements.stories.impl.ts b/packages/frontend/src/components/MkAchievements.stories.impl.ts index 477152a47b..505c23fe98 100644 --- a/packages/frontend/src/components/MkAchievements.stories.impl.ts +++ b/packages/frontend/src/components/MkAchievements.stories.impl.ts @@ -4,7 +4,7 @@ import { rest } from 'msw'; import { userDetailed } from '../../.storybook/fakes'; import { commonHandlers } from '../../.storybook/mocks'; import MkAchievements from './MkAchievements.vue'; -import { ACHIEVEMENT_TYPES } from '@/scripts/achievements'; +import { ACHIEVEMENT_TYPES } from 'misskey-js'; export const Empty = { render(args) { return { diff --git a/packages/frontend/src/components/MkAchievements.vue b/packages/frontend/src/components/MkAchievements.vue index d30037dcf9..6734a89643 100644 --- a/packages/frontend/src/components/MkAchievements.vue +++ b/packages/frontend/src/components/MkAchievements.vue @@ -44,7 +44,7 @@ import * as misskey from 'misskey-js'; import { onMounted } from 'vue'; import * as os from '@/os'; import { i18n } from '@/i18n'; -import { ACHIEVEMENT_TYPES, ACHIEVEMENT_BADGES, claimAchievement } from '@/scripts/achievements'; +import { ACHIEVEMENT_BADGES, claimAchievement } from '@/scripts/achievements'; const props = withDefaults(defineProps<{ user: misskey.entities.User; @@ -56,12 +56,12 @@ const props = withDefaults(defineProps<{ }); let achievements = $ref(); -const lockedAchievements = $computed(() => ACHIEVEMENT_TYPES.filter(x => !(achievements ?? []).some(a => a.name === x))); +const lockedAchievements = $computed(() => misskey.ACHIEVEMENT_TYPES.filter(x => !(achievements ?? []).some(a => a.name === x))); function fetch() { os.api('users/achievements', { userId: props.user.id }).then(res => { achievements = []; - for (const t of ACHIEVEMENT_TYPES) { + for (const t of misskey.ACHIEVEMENT_TYPES) { const a = res.find(x => x.name === t); if (a) achievements.push(a); } diff --git a/packages/frontend/src/components/MkNotificationSettingWindow.vue b/packages/frontend/src/components/MkNotificationSettingWindow.vue index f6d0e5681d..1d48898130 100644 --- a/packages/frontend/src/components/MkNotificationSettingWindow.vue +++ b/packages/frontend/src/components/MkNotificationSettingWindow.vue @@ -38,7 +38,7 @@ import MkSwitch from './MkSwitch.vue'; import MkInfo from './MkInfo.vue'; import MkButton from './MkButton.vue'; import MkModalWindow from '@/components/MkModalWindow.vue'; -import { notificationTypes } from '@/const'; +import { notificationTypes } from 'misskey-js'; import { i18n } from '@/i18n'; type TypesMap = Record> diff --git a/packages/frontend/src/components/MkNotifications.vue b/packages/frontend/src/components/MkNotifications.vue index 1aea95fe0e..400f186edf 100644 --- a/packages/frontend/src/components/MkNotifications.vue +++ b/packages/frontend/src/components/MkNotifications.vue @@ -25,7 +25,7 @@ import MkNote from '@/components/MkNote.vue'; import { stream } from '@/stream'; import { $i } from '@/account'; import { i18n } from '@/i18n'; -import { notificationTypes } from '@/const'; +import { notificationTypes } from 'misskey-js'; const props = defineProps<{ includeTypes?: typeof notificationTypes[number][]; diff --git a/packages/frontend/src/const.ts b/packages/frontend/src/const.ts index aaa3d10302..364afa825f 100644 --- a/packages/frontend/src/const.ts +++ b/packages/frontend/src/const.ts @@ -49,9 +49,6 @@ https://github.com/sindresorhus/file-type/blob/main/core.js https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers */ -export const notificationTypes = ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app'] as const; -export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const; - export const ROLE_POLICIES = [ 'gtlAvailable', 'ltlAvailable', diff --git a/packages/frontend/src/pages/notifications.vue b/packages/frontend/src/pages/notifications.vue index 1789606cd8..b76d07f3ba 100644 --- a/packages/frontend/src/pages/notifications.vue +++ b/packages/frontend/src/pages/notifications.vue @@ -22,7 +22,7 @@ import MkNotes from '@/components/MkNotes.vue'; import * as os from '@/os'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; -import { notificationTypes } from '@/const'; +import { notificationTypes } from 'misskey-js'; let tab = $ref('all'); let includeTypes = $ref(null); diff --git a/packages/frontend/src/pages/settings/notifications.vue b/packages/frontend/src/pages/settings/notifications.vue index 2cf2f6d7f6..dfa6e4e3a4 100644 --- a/packages/frontend/src/pages/settings/notifications.vue +++ b/packages/frontend/src/pages/settings/notifications.vue @@ -35,7 +35,7 @@ import { $i } from '@/account'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import MkPushNotificationAllowButton from '@/components/MkPushNotificationAllowButton.vue'; -import { notificationTypes } from '@/const'; +import { notificationTypes } from 'misskey-js'; let allowButton = $shallowRef>(); let pushRegistrationInServer = $computed(() => allowButton?.pushRegistrationInServer); diff --git a/packages/frontend/src/scripts/achievements.ts b/packages/frontend/src/scripts/achievements.ts index fbca005769..3127e0aa86 100644 --- a/packages/frontend/src/scripts/achievements.ts +++ b/packages/frontend/src/scripts/achievements.ts @@ -1,83 +1,6 @@ import * as os from '@/os'; import { $i } from '@/account'; -export const ACHIEVEMENT_TYPES = [ - 'notes1', - 'notes10', - 'notes100', - 'notes500', - 'notes1000', - 'notes5000', - 'notes10000', - 'notes20000', - 'notes30000', - 'notes40000', - 'notes50000', - 'notes60000', - 'notes70000', - 'notes80000', - 'notes90000', - 'notes100000', - 'login3', - 'login7', - 'login15', - 'login30', - 'login60', - 'login100', - 'login200', - 'login300', - 'login400', - 'login500', - 'login600', - 'login700', - 'login800', - 'login900', - 'login1000', - 'passedSinceAccountCreated1', - 'passedSinceAccountCreated2', - 'passedSinceAccountCreated3', - 'loggedInOnBirthday', - 'loggedInOnNewYearsDay', - 'noteClipped1', - 'noteFavorited1', - 'myNoteFavorited1', - 'profileFilled', - 'markedAsCat', - 'following1', - 'following10', - 'following50', - 'following100', - 'following300', - 'followers1', - 'followers10', - 'followers50', - 'followers100', - 'followers300', - 'followers500', - 'followers1000', - 'collectAchievements30', - 'viewAchievements3min', - 'iLoveMisskey', - 'foundTreasure', - 'client30min', - 'client60min', - 'noteDeletedWithin1min', - 'postedAtLateNight', - 'postedAt0min0sec', - 'selfQuote', - 'htl20npm', - 'viewInstanceChart', - 'outputHelloWorldOnScratchpad', - 'open3windows', - 'driveFolderCircularReference', - 'reactWithoutRead', - 'clickedClickHere', - 'justPlainLucky', - 'setNameToSyuilo', - 'cookieClicked', - 'brainDiver', -] as const; - export const ACHIEVEMENT_BADGES = { 'notes1': { img: '/fluent-emoji/1f4dd.png', diff --git a/packages/misskey-js/src/consts.ts b/packages/misskey-js/src/consts.ts index 261ecd33f4..a101f56317 100644 --- a/packages/misskey-js/src/consts.ts +++ b/packages/misskey-js/src/consts.ts @@ -1,4 +1,5 @@ -export const notificationTypes = ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app'] as const; +export const notificationTypes = ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app'] as const; +export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const; export const noteVisibilities = ['public', 'home', 'followers', 'specified'] as const; @@ -40,3 +41,80 @@ export const permissions = [ 'read:gallery-likes', 'write:gallery-likes', ]; + +export const ACHIEVEMENT_TYPES = [ + 'notes1', + 'notes10', + 'notes100', + 'notes500', + 'notes1000', + 'notes5000', + 'notes10000', + 'notes20000', + 'notes30000', + 'notes40000', + 'notes50000', + 'notes60000', + 'notes70000', + 'notes80000', + 'notes90000', + 'notes100000', + 'login3', + 'login7', + 'login15', + 'login30', + 'login60', + 'login100', + 'login200', + 'login300', + 'login400', + 'login500', + 'login600', + 'login700', + 'login800', + 'login900', + 'login1000', + 'passedSinceAccountCreated1', + 'passedSinceAccountCreated2', + 'passedSinceAccountCreated3', + 'loggedInOnBirthday', + 'loggedInOnNewYearsDay', + 'noteClipped1', + 'noteFavorited1', + 'myNoteFavorited1', + 'profileFilled', + 'markedAsCat', + 'following1', + 'following10', + 'following50', + 'following100', + 'following300', + 'followers1', + 'followers10', + 'followers50', + 'followers100', + 'followers300', + 'followers500', + 'followers1000', + 'collectAchievements30', + 'viewAchievements3min', + 'iLoveMisskey', + 'foundTreasure', + 'client30min', + 'client60min', + 'noteDeletedWithin1min', + 'postedAtLateNight', + 'postedAt0min0sec', + 'selfQuote', + 'htl20npm', + 'viewInstanceChart', + 'outputHelloWorldOnScratchpad', + 'open3windows', + 'driveFolderCircularReference', + 'reactWithoutRead', + 'clickedClickHere', + 'justPlainLucky', + 'setNameToSyuilo', + 'cookieClicked', + 'brainDiver', +] as const; diff --git a/packages/misskey-js/src/index.ts b/packages/misskey-js/src/index.ts index bdd0d04455..d5cb5123df 100644 --- a/packages/misskey-js/src/index.ts +++ b/packages/misskey-js/src/index.ts @@ -14,9 +14,11 @@ export { export const permissions = consts.permissions; export const notificationTypes = consts.notificationTypes; +export const obsoleteNotificationTypes = consts.obsoleteNotificationTypes; export const noteVisibilities = consts.noteVisibilities; export const mutedNoteReasons = consts.mutedNoteReasons; export const ffVisibility = consts.ffVisibility; +export const ACHIEVEMENT_TYPES = consts.ACHIEVEMENT_TYPES; // api extractor not supported yet //export * as api from './api.js'; diff --git a/packages/misskey-js/src/schemas.ts b/packages/misskey-js/src/schemas.ts index 4fdabd63de..8aa40ac3a9 100644 --- a/packages/misskey-js/src/schemas.ts +++ b/packages/misskey-js/src/schemas.ts @@ -64,7 +64,7 @@ export const refs = { EmojiSimple: packedEmojiSimpleSchema, EmojiDetailed: packedEmojiDetailedSchema, Flash: packedFlashSchema, -} as const satisfies { [x: string]: JSONSchema7Definition }; +} as const /*satisfies { [x: string]: JSONSchema7Definition }*/; type Refs = typeof packedAntennaSchema | typeof packedNoteSchema; // TODO: typeof refs[keyof typeof refs]; diff --git a/packages/misskey-js/src/schemas/note-reaction.ts b/packages/misskey-js/src/schemas/note-reaction.ts index 0d8fc5449b..a591cabd73 100644 --- a/packages/misskey-js/src/schemas/note-reaction.ts +++ b/packages/misskey-js/src/schemas/note-reaction.ts @@ -1,25 +1,24 @@ +import type { JSONSchema7Definition } from 'schema-type'; + export const packedNoteReactionSchema = { + $id: 'https://misskey-hub.net/api/schemas/NoteReaction', + type: 'object', properties: { - id: { - type: 'string', - optional: false, nullable: false, - format: 'id', - example: 'xxxxxxxxxx', - }, + id: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, createdAt: { type: 'string', - optional: false, nullable: false, format: 'date-time', }, - user: { - type: 'object', - optional: false, nullable: false, - ref: 'UserLite', - }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, type: { type: 'string', - optional: false, nullable: false, }, }, -} as const; + required: [ + 'id', + 'createdAt', + 'user', + 'type', + ], +} as const satisfies JSONSchema7Definition; diff --git a/packages/misskey-js/src/schemas/notification.ts b/packages/misskey-js/src/schemas/notification.ts index 522379a986..ea566645a0 100644 --- a/packages/misskey-js/src/schemas/notification.ts +++ b/packages/misskey-js/src/schemas/notification.ts @@ -1,62 +1,117 @@ -import { notificationTypes } from '../consts'; +import type { JSONSchema7Definition } from 'schema-type'; +import { ACHIEVEMENT_TYPES } from '../consts'; export const packedNotificationSchema = { + $id: 'https://misskey-hub.net/api/schemas/Notification', + type: 'object', - properties: { - id: { - type: 'string', - optional: false, nullable: false, - format: 'id', - example: 'xxxxxxxxxx', + allOf: [{ + type: 'object', + properties: { + id: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + createdAt: { + type: 'string', + format: 'date-time', + }, }, - createdAt: { - type: 'string', - optional: false, nullable: false, - format: 'date-time', - }, - type: { - type: 'string', - optional: false, nullable: false, - enum: [...notificationTypes], - }, - user: { + required: ['id', 'createdAt'], + }, { + oneOf: [ + { type: 'object', - ref: 'UserLite', - optional: true, nullable: true, - }, - userId: { - type: 'string', - optional: true, nullable: true, - format: 'id', - }, - note: { + properties: { + type: { const: 'follow' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + }, + required: ['type', 'userId', 'user'], + }, { type: 'object', - ref: 'Note', - optional: true, nullable: true, - }, - reaction: { - type: 'string', - optional: true, nullable: true, - }, - choice: { - type: 'number', - optional: true, nullable: true, - }, - invitation: { + properties: { + type: { const: 'mention' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + note: { $ref: 'https://misskey-hub.net/api/schemas/Note' }, + }, + required: ['type', 'userId', 'user', 'note'], + }, { type: 'object', - optional: true, nullable: true, - }, - body: { - type: 'string', - optional: true, nullable: true, - }, - header: { - type: 'string', - optional: true, nullable: true, - }, - icon: { - type: 'string', - optional: true, nullable: true, - }, - }, -} as const; + properties: { + type: { const: 'reply' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + note: { $ref: 'https://misskey-hub.net/api/schemas/Note' }, + }, + required: ['type', 'userId', 'user', 'note'], + }, { + type: 'object', + properties: { + type: { const: 'renote' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + note: { $ref: 'https://misskey-hub.net/api/schemas/Note' }, + }, + required: ['type', 'userId', 'user', 'note'], + }, { + type: 'object', + properties: { + type: { const: 'quote' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + note: { $ref: 'https://misskey-hub.net/api/schemas/Note' }, + }, + required: ['type', 'userId', 'user', 'note'], + }, { + type: 'object', + properties: { + type: { const: 'reaction' }, + reaction: { type: 'string' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + note: { $ref: 'https://misskey-hub.net/api/schemas/Note' }, + }, + required: ['type', 'reaction', 'userId', 'user', 'note'], + }, { + type: 'object', + properties: { + type: { const: 'pollEnded' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + note: { $ref: 'https://misskey-hub.net/api/schemas/Note' }, + }, + required: ['type', 'userId', 'user', 'note'], + }, { + type: 'object', + properties: { + type: { const: 'receiveFollowRequest' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + }, + required: ['type', 'userId', 'user'], + }, { + type: 'object', + properties: { + type: { const: 'followRequestAccepted' }, + userId: { $ref: 'https://misskey-hub.net/api/schemas/Id' }, + user: { $ref: 'https://misskey-hub.net/api/schemas/UserLite' }, + }, + required: ['type', 'userId', 'user'], + }, { + type: 'object', + properties: { + type: { const: 'achievementEarned' }, + achievement: { enum: [...ACHIEVEMENT_TYPES] }, + }, + required: ['type', 'achievement'], + }, { + type: 'object', + properties: { + type: { const: 'app' }, + header: { type: ['string', 'null'] }, + body: { type: 'string' }, + icon: { type: ['string', 'null'] }, + }, + required: ['type'], + }], + }], +} as const satisfies JSONSchema7Definition;