summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2022-03-04 15:56:43 +0900
committertamaina <tamaina@hotmail.co.jp>2022-03-04 15:56:43 +0900
commita4de5aa94b9b318b1a286d36406e11e0e7f27590 (patch)
tree6c0cd908b7e8f68fc300b9cb102f69b8ec2f5adc /packages/backend/src/server/api/endpoints
parentMerge branch 'develop' into pizzax-indexeddb (diff)
parentfix federation chart pubsub (diff)
downloadmisskey-a4de5aa94b9b318b1a286d36406e11e0e7f27590.tar.gz
misskey-a4de5aa94b9b318b1a286d36406e11e0e7f27590.tar.bz2
misskey-a4de5aa94b9b318b1a286d36406e11e0e7f27590.zip
Merge branch 'develop' into pizzax-indexeddb
Diffstat (limited to 'packages/backend/src/server/api/endpoints')
-rw-r--r--packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts69
-rw-r--r--packages/backend/src/server/api/endpoints/admin/accounts/create.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/admin/accounts/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/create.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/list.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/update.ts52
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/create.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/list.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/update.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/files.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/show-file.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/add.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/copy.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts51
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/list.ts49
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/update.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/get-index-stats.ts11
-rw-r--r--packages/backend/src/server/api/endpoints/admin/get-table-stats.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/admin/invite.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/admin/moderators/add.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/admin/moderators/remove.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/admin/promo/create.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/clear.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/jobs.ts82
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/stats.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/admin/relays/add.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/admin/relays/list.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/admin/relays/remove.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/reset-password.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/admin/resync-chart.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/admin/send-email.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/admin/server-info.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-user.ts160
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-users.ts78
-rw-r--r--packages/backend/src/server/api/endpoints/admin/silence-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/suspend-user.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/admin/unsilence-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/admin/update-meta.ts399
-rw-r--r--packages/backend/src/server/api/endpoints/admin/vacuum.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/announcements.ts49
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/create.ts88
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/notes.ts68
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/update.ts91
-rw-r--r--packages/backend/src/server/api/endpoints/ap/get.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/ap/show.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/app/create.ts46
-rw-r--r--packages/backend/src/server/api/endpoints/app/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/auth/accept.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/auth/session/generate.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/auth/session/show.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/auth/session/userkey.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/blocking/create.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/blocking/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/blocking/list.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/channels/create.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/channels/featured.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/channels/follow.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/channels/followed.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/channels/owned.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/channels/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/channels/timeline.ts64
-rw-r--r--packages/backend/src/server/api/endpoints/channels/unfollow.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/channels/update.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/charts/active-users.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/ap-request.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/charts/drive.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/federation.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/hashtag.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/charts/instance.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/charts/network.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/charts/notes.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/drive.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/following.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/notes.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/reactions.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/users.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/clips/add-note.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/clips/create.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/clips/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/clips/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/clips/notes.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/clips/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/clips/update.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/drive.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files.ts48
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/check-existence.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/create.ts62
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/find.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/show.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/update.ts59
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts55
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/create.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/find.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/update.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/drive/stream.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/email-address/available.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/endpoint.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/endpoints.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/export-custom-emojis.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/federation/followers.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/federation/following.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/federation/instances.ts76
-rw-r--r--packages/backend/src/server/api/endpoints/federation/show-instance.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/federation/update-remote-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/federation/users.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/following/create.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/following/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/following/invalidate.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/accept.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/cancel.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/reject.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/featured.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/popular.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/create.ts48
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/like.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/update.ts51
-rw-r--r--packages/backend/src/server/api/endpoints/get-online-users-count.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/list.ts60
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/search.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/show.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/trend.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/users.ts62
-rw-r--r--packages/backend/src/server/api/endpoints/i.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/done.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/key-done.ts46
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/password-less.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/register-key.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/register.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/unregister.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/i/apps.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/i/authorized-apps.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/i/change-password.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/i/delete-account.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-blocking.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-following.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-mute.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-notes.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-user-lists.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/favorites.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/i/gallery/likes.ts65
-rw-r--r--packages/backend/src/server/api/endpoints/i/gallery/posts.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-blocking.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-following.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-muting.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-user-lists.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/notifications.ts85
-rw-r--r--packages/backend/src/server/api/endpoints/i/page-likes.ts66
-rw-r--r--packages/backend/src/server/api/endpoints/i/pages.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/i/pin.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/i/read-announcement.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/i/regenerate-token.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-all.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-detail.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/remove.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/scopes.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/set.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/i/revoke-token.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/signin-history.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/i/unpin.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/update-email.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts222
-rw-r--r--packages/backend/src/server/api/endpoints/i/user-group-invites.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/history.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages.ts61
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages/create.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages/read.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/meta.ts48
-rw-r--r--packages/backend/src/server/api/endpoints/miauth/gen-token.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/mute/create.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/mute/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/mute/list.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/my/apps.ts71
-rw-r--r--packages/backend/src/server/api/endpoints/notes.ts70
-rw-r--r--packages/backend/src/server/api/endpoints/notes/children.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/notes/clips.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/conversation.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.ts153
-rw-r--r--packages/backend/src/server/api/endpoints/notes/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/notes/favorites/create.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/notes/favorites/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/featured.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/notes/global-timeline.ts78
-rw-r--r--packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts98
-rw-r--r--packages/backend/src/server/api/endpoints/notes/local-timeline.ts93
-rw-r--r--packages/backend/src/server/api/endpoints/notes/mentions.ts66
-rw-r--r--packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/notes/polls/vote.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions/create.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/renotes.ts60
-rw-r--r--packages/backend/src/server/api/endpoints/notes/replies.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/notes/search-by-tag.ts92
-rw-r--r--packages/backend/src/server/api/endpoints/notes/search.ts81
-rw-r--r--packages/backend/src/server/api/endpoints/notes/show.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/state.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/timeline.ts94
-rw-r--r--packages/backend/src/server/api/endpoints/notes/translate.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/notes/unrenote.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts89
-rw-r--r--packages/backend/src/server/api/endpoints/notes/watching/create.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/watching/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/create.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/read.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/page-push.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/pages/create.ts80
-rw-r--r--packages/backend/src/server/api/endpoints/pages/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/pages/featured.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/pages/like.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/pages/show.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/pages/unlike.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/pages/update.ts78
-rw-r--r--packages/backend/src/server/api/endpoints/ping.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/pinned-users.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/promo/read.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/request-reset-password.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/reset-db.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/reset-password.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/server-info.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/stats.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/sw/register.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/sw/unregister.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/test.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/username/available.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/users.ts68
-rw-r--r--packages/backend/src/server/api/endpoints/users/clips.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/users/followers.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/following.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/gallery/posts.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/create.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invite.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/joined.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/leave.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/owned.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/pull.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/transfer.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/update.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/create.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/pull.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/push.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/update.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/users/notes.ts103
-rw-r--r--packages/backend/src/server/api/endpoints/users/pages.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/users/reactions.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/recommendation.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/users/relation.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/users/report-abuse.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/search.ts55
-rw-r--r--packages/backend/src/server/api/endpoints/users/show.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/users/stats.ts24
305 files changed, 4742 insertions, 6359 deletions
diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
index ed7b146d03..333746f423 100644
--- a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
+++ b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { AbuseUserReports } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { AbuseUserReports } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,49 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- state: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- reporterOrigin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'combined',
- },
-
- targetUserOrigin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'combined',
- },
-
- forwarded: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -115,8 +70,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ state: { type: 'string', nullable: true, default: null },
+ reporterOrigin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "combined" },
+ targetUserOrigin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "combined" },
+ forwarded: { type: 'boolean', default: false },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(AbuseUserReports.createQueryBuilder('report'), ps.sinceId, ps.untilId);
switch (ps.state) {
@@ -134,7 +103,7 @@ export default define(meta, async (ps) => {
case 'remote': query.andWhere('report.targetUserHost IS NOT NULL'); break;
}
- const reports = await query.take(ps.limit!).getMany();
+ const reports = await query.take(ps.limit).getMany();
return await AbuseUserReports.packMany(reports);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
index 20f1232959..2820c7993d 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
@@ -1,20 +1,10 @@
-import define from '../../../define';
-import { Users } from '@/models/index';
-import { signup } from '../../../common/signup';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
+import { signup } from '../../../common/signup.js';
export const meta = {
tags: ['admin'],
- params: {
- username: {
- validator: Users.validateLocalUsername,
- },
-
- password: {
- validator: Users.validatePassword,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -28,8 +18,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: Users.localUsernameSchema,
+ password: Users.passwordSchema,
+ },
+ required: ['username', 'password'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, _me) => {
+export default define(meta, paramDef, async (ps, _me) => {
const me = _me ? await Users.findOneOrFail(_me.id) : null;
const noUsers = (await Users.count({
host: null,
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts b/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
index 1701c1e3a7..01754ec8f3 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
@@ -1,26 +1,26 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Users } from '@/models/index';
-import { doPostSuspend } from '@/services/suspend-user';
-import { publishUserEvent } from '@/services/stream';
-import { createDeleteAccountJob } from '@/queue';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
+import { doPostSuspend } from '@/services/suspend-user.js';
+import { publishUserEvent } from '@/services/stream.js';
+import { createDeleteAccountJob } from '@/queue/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/create.ts b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
index 00ad2012fe..ab2c50b50f 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
@@ -1,41 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Ads } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- url: {
- validator: $.str.min(1),
- },
- memo: {
- validator: $.str,
- },
- place: {
- validator: $.str,
- },
- priority: {
- validator: $.str,
- },
- ratio: {
- validator: $.num.int().min(0),
- },
- expiresAt: {
- validator: $.num.int(),
- },
- imageUrl: {
- validator: $.str.min(1),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ url: { type: 'string', minLength: 1 },
+ memo: { type: 'string' },
+ place: { type: 'string' },
+ priority: { type: 'string' },
+ ratio: { type: 'integer' },
+ expiresAt: { type: 'integer' },
+ imageUrl: { type: 'string', minLength: 1 },
},
+ required: ['url', 'memo', 'place', 'priority', 'ratio', 'expiresAt', 'imageUrl'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await Ads.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/delete.ts b/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
index c0124e2484..3663d974c5 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Ads } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,12 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAd: {
message: 'No such ad.',
@@ -25,8 +17,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['id'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ad = await Ads.findOne(ps.id);
if (ad == null) throw new ApiError(meta.errors.noSuchAd);
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/list.ts b/packages/backend/src/server/api/endpoints/admin/ad/list.ts
index 7a83637f3b..74f154f272 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/list.ts
@@ -1,37 +1,30 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Ads } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Ads.createQueryBuilder('ad'), ps.sinceId, ps.untilId)
.andWhere('ad.expiresAt > :now', { now: new Date() });
- const ads = await query.take(ps.limit!).getMany();
+ const ads = await query.take(ps.limit).getMany();
return ads;
});
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/update.ts b/packages/backend/src/server/api/endpoints/admin/ad/update.ts
index c2b09ab9cf..89c421db66 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Ads } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,33 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- memo: {
- validator: $.str,
- },
- url: {
- validator: $.str.min(1),
- },
- imageUrl: {
- validator: $.str.min(1),
- },
- place: {
- validator: $.str,
- },
- priority: {
- validator: $.str,
- },
- ratio: {
- validator: $.num.int().min(0),
- },
- expiresAt: {
- validator: $.num.int(),
- },
- },
-
errors: {
noSuchAd: {
message: 'No such ad.',
@@ -46,8 +17,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ memo: { type: 'string' },
+ url: { type: 'string', minLength: 1 },
+ imageUrl: { type: 'string', minLength: 1 },
+ place: { type: 'string' },
+ priority: { type: 'string' },
+ ratio: { type: 'integer' },
+ expiresAt: { type: 'integer' },
+ },
+ required: ['id', 'memo', 'url', 'imageUrl', 'place', 'priority', 'ratio', 'expiresAt'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ad = await Ads.findOne(ps.id);
if (ad == null) throw new ApiError(meta.errors.noSuchAd);
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
index 24c4caa37d..41570078d4 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Announcements } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Announcements } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['admin'],
@@ -9,18 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- title: {
- validator: $.str.min(1),
- },
- text: {
- validator: $.str.min(1),
- },
- imageUrl: {
- validator: $.nullable.str.min(1),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -57,8 +44,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ title: { type: 'string', minLength: 1 },
+ text: { type: 'string', minLength: 1 },
+ imageUrl: { type: 'string', nullable: true, minLength: 1 },
+ },
+ required: ['title', 'text', 'imageUrl'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const announcement = await Announcements.insert({
id: genId(),
createdAt: new Date(),
@@ -68,5 +65,5 @@ export default define(meta, async (ps) => {
imageUrl: ps.imageUrl,
}).then(x => Announcements.findOneOrFail(x.identifiers[0]));
- return announcement;
+ return Object.assign({}, announcement, { createdAt: announcement.createdAt.toISOString(), updatedAt: null });
});
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts b/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
index 5548f99006..4871dc4e12 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Announcements } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Announcements } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,12 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAnnouncement: {
message: 'No such announcement.',
@@ -25,8 +17,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['id'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const announcement = await Announcements.findOne(ps.id);
if (announcement == null) throw new ApiError(meta.errors.noSuchAnnouncement);
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
index e5cc53ccdd..0ba0a8ee08 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Announcements, AnnouncementReads } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { Announcements, AnnouncementReads } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,21 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -69,11 +52,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Announcements.createQueryBuilder('announcement'), ps.sinceId, ps.untilId);
- const announcements = await query.take(ps.limit!).getMany();
+ const announcements = await query.take(ps.limit).getMany();
for (const announcement of announcements) {
(announcement as any).reads = await AnnouncementReads.count({
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
index f66293bb18..138337ef5b 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Announcements } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Announcements } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,21 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- title: {
- validator: $.str.min(1),
- },
- text: {
- validator: $.str.min(1),
- },
- imageUrl: {
- validator: $.nullable.str.min(1),
- },
- },
-
errors: {
noSuchAnnouncement: {
message: 'No such announcement.',
@@ -34,8 +17,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ title: { type: 'string', minLength: 1 },
+ text: { type: 'string', minLength: 1 },
+ imageUrl: { type: 'string', nullable: true, minLength: 1 },
+ },
+ required: ['id', 'title', 'text', 'imageUrl'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const announcement = await Announcements.findOne(ps.id);
if (announcement == null) throw new ApiError(meta.errors.noSuchAnnouncement);
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts b/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
index 249e63a0f8..90e65ec4cd 100644
--- a/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
@@ -1,24 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { deleteFile } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const files = await DriveFiles.find({
userId: ps.userId,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
index acabbfef5c..bab149532e 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { createCleanRemoteFilesJob } from '@/queue/index';
+import define from '../../../define.js';
+import { createCleanRemoteFilesJob } from '@/queue/index.js';
export const meta = {
tags: ['admin'],
@@ -8,7 +8,13 @@ export const meta = {
requireModerator: true,
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
createCleanRemoteFilesJob();
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
index 452e7069a8..3e7d43fb0b 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
@@ -1,7 +1,7 @@
import { IsNull } from 'typeorm';
-import define from '../../../define';
-import { deleteFile } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -10,8 +10,14 @@ export const meta = {
requireModerator: true,
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const files = await DriveFiles.find({
userId: IsNull(),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/files.ts b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
index 264f549867..646d85a1e0 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,39 +8,6 @@ export const meta = {
requireCredential: false,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- type: {
- validator: $.optional.nullable.str.match(/^[a-zA-Z0-9\/\-*]+$/),
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
-
- hostname: {
- validator: $.optional.nullable.str,
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -54,8 +19,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ type: { type: 'string', nullable: true, pattern: /^[a-zA-Z0-9\/\-*]+$/.toString().slice(1, -1) },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ hostname: { type: 'string', nullable: true, default: null },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId);
if (ps.origin === 'local') {
@@ -76,7 +54,7 @@ export default define(meta, async (ps, me) => {
}
}
- const files = await query.take(ps.limit!).getMany();
+ const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: true, withUser: true, self: true });
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
index 5d9a1f2703..e821160095 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -10,16 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- fileId: {
- validator: $.optional.type(ID),
- },
-
- url: {
- validator: $.optional.str,
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -161,8 +149,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ url: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const file = ps.fileId ? await DriveFiles.findOne(ps.fileId) : await DriveFiles.findOne({
where: [{
url: ps.url,
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
index f0fd73c276..77a4adea61 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
@@ -1,29 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- aliases: {
- validator: $.arr($.str),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
},
+ required: ['ids', 'aliases'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const emojis = await Emojis.find({
id: In(ps.ids),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
index 1dfeae262f..c5787d59dc 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
@@ -1,13 +1,11 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis, DriveFiles } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Emojis, DriveFiles } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
import { getConnection } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { ApiError } from '../../../error';
-import { ID } from '@/misc/cafy-id';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { ApiError } from '../../../error.js';
import rndstr from 'rndstr';
-import { publishBroadcastStream } from '@/services/stream';
+import { publishBroadcastStream } from '@/services/stream.js';
export const meta = {
tags: ['admin'],
@@ -15,12 +13,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -30,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
index 17cbf208aa..a0eaa61258 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
@@ -1,13 +1,11 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
import { getConnection } from 'typeorm';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
-import { ID } from '@/misc/cafy-id';
-import { uploadFromUrl } from '@/services/drive/upload-from-url';
-import { publishBroadcastStream } from '@/services/stream';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
+import { publishBroadcastStream } from '@/services/stream.js';
export const meta = {
tags: ['admin'],
@@ -15,12 +13,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- emojiId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchEmoji: {
message: 'No such emoji.',
@@ -42,8 +34,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ emojiId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['emojiId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const emoji = await Emojis.findOne(ps.emojiId);
if (emoji == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
index 797a5de672..38a2d65cf6 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
@@ -1,26 +1,28 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { ApiError } from '../../../error';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
},
+ required: ['ids'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const emojis = await Emojis.find({
id: In(ps.ids),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
index 1580439024..a0cffb47f8 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { ApiError } from '../../../error';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -12,12 +10,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchEmoji: {
message: 'No such emoji.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['id'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const emoji = await Emojis.findOne(ps.id);
if (emoji == null) throw new ApiError(meta.errors.noSuchEmoji);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
index 8856a38f24..3f03dc2da4 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { createImportCustomEmojisJob } from '@/queue/index';
+import define from '../../../define.js';
+import { createImportCustomEmojisJob } from '@/queue/index.js';
import ms from 'ms';
-import { ID } from '@/misc/cafy-id';
export const meta = {
secure: true,
requireCredential: true,
requireModerator: true,
- params: {
- fileId: {
- validator: $.type(ID),
- },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
},
+ required: ['fileId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createImportCustomEmojisJob(user, ps.fileId);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
index 6e502547f5..f19c3ddbd8 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -11,31 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- query: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- host: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -77,8 +50,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string', nullable: true, default: null },
+ host: { type: 'string', nullable: true, default: null },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const q = makePaginationQuery(Emojis.createQueryBuilder('emoji'), ps.sinceId, ps.untilId);
if (ps.host == null) {
@@ -93,7 +78,7 @@ export default define(meta, async (ps) => {
const emojis = await q
.orderBy('emoji.id', 'DESC')
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return Emojis.packMany(emojis);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
index 76ef190f94..f488a71a00 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '@/misc/cafy-id';
-import { Emoji } from '@/models/entities/emoji';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
+import { Emoji } from '@/models/entities/emoji.js';
export const meta = {
tags: ['admin'],
@@ -11,26 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- query: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -72,8 +50,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string', nullable: true, default: null },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const q = makePaginationQuery(Emojis.createQueryBuilder('emoji'), ps.sinceId, ps.untilId)
.andWhere(`emoji.host IS NULL`);
@@ -81,7 +70,7 @@ export default define(meta, async (ps) => {
if (ps.query) {
//q.andWhere('emoji.name ILIKE :q', { q: `%${ps.query}%` });
- //const emojis = await q.take(ps.limit!).getMany();
+ //const emojis = await q.take(ps.limit).getMany();
emojis = await q.getMany();
@@ -90,9 +79,9 @@ export default define(meta, async (ps) => {
emoji.aliases.some(a => a.includes(ps.query!)) ||
emoji.category?.includes(ps.query!));
- emojis.splice(ps.limit! + 1);
+ emojis.splice(ps.limit + 1);
} else {
- emojis = await q.take(ps.limit!).getMany();
+ emojis = await q.take(ps.limit).getMany();
}
return Emojis.packMany(emojis);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
index c49f84b7fb..dbad93d336 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
@@ -1,29 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- aliases: {
- validator: $.arr($.str),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
},
+ required: ['ids', 'aliases'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const emojis = await Emojis.find({
id: In(ps.ids),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
index 06197820f0..470b9bef08 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
@@ -1,29 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- aliases: {
- validator: $.arr($.str),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
},
+ required: ['ids', 'aliases'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await Emojis.update({
id: In(ps.ids),
}, {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
index f0645f111b..40e4c0199e 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
@@ -1,29 +1,28 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- category: {
- validator: $.optional.nullable.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ category: { type: 'string', nullable: true },
},
+ required: ['ids'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await Emojis.update({
id: In(ps.ids),
}, {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
index 54a2cf9517..c6d07e16fa 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -11,24 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str,
- },
-
- category: {
- validator: $.optional.nullable.str,
- },
-
- aliases: {
- validator: $.arr($.str),
- },
- },
-
errors: {
noSuchEmoji: {
message: 'No such emoji.',
@@ -38,8 +18,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string' },
+ category: { type: 'string', nullable: true },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
+ },
+ required: ['id', 'name', 'aliases'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const emoji = await Emojis.findOne(ps.id);
if (emoji == null) throw new ApiError(meta.errors.noSuchEmoji);
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts b/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
index db023c6f0b..d4251f2feb 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
@@ -1,23 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { deleteFile } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const files = await DriveFiles.find({
userHost: ps.host,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts b/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
index b68252ef2e..86978cc309 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
@@ -1,24 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Instances } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
-import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata';
+import define from '../../../define.js';
+import { Instances } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await Instances.findOne({ host: toPuny(ps.host) });
if (instance == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
index 4de8ad1336..ccd07489cb 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
@@ -1,23 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import deleteFollowing from '@/services/following/delete';
-import { Followings, Users } from '@/models/index';
+import define from '../../../define.js';
+import deleteFollowing from '@/services/following/delete.js';
+import { Followings, Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const followings = await Followings.find({
followerHost: ps.host,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
index 6ac2f1f467..1981082428 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
@@ -1,27 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Instances } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
+import define from '../../../define.js';
+import { Instances } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
-
- isSuspended: {
- validator: $.bool,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ isSuspended: { type: 'boolean' },
},
+ required: ['host', 'isSuspended'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await Instances.findOne({ host: toPuny(ps.host) });
if (instance == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts b/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
index 9a2bccec77..37878c4143 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
@@ -1,4 +1,4 @@
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
export const meta = {
@@ -6,13 +6,16 @@ export const meta = {
requireModerator: true,
tags: ['admin'],
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const stats = await
getConnection().query(`SELECT * FROM pg_indexes;`)
.then(recs => {
diff --git a/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts b/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
index 1c5f250676..7cf2d5ffd4 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
@@ -1,4 +1,4 @@
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
export const meta = {
@@ -7,9 +7,6 @@ export const meta = {
tags: ['admin'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -22,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const sizes = await
getConnection().query(`
SELECT relname AS "table", reltuples as "count", pg_total_relation_size(C.oid) AS "size"
diff --git a/packages/backend/src/server/api/endpoints/admin/invite.ts b/packages/backend/src/server/api/endpoints/admin/invite.ts
index 3428709c04..7e950cf87b 100644
--- a/packages/backend/src/server/api/endpoints/admin/invite.ts
+++ b/packages/backend/src/server/api/endpoints/admin/invite.ts
@@ -1,7 +1,7 @@
import rndstr from 'rndstr';
-import define from '../../define';
-import { RegistrationTickets } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../define.js';
+import { RegistrationTickets } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['admin'],
@@ -9,8 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {},
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -26,8 +24,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const code = rndstr({
length: 8,
chars: '2-9A-HJ-NP-Z', // [0-9A-Z] w/o [01IO] (32 patterns)
diff --git a/packages/backend/src/server/api/endpoints/admin/moderators/add.ts b/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
index 0308cf2761..4206e3a3c2 100644
--- a/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Users } from '@/models/index';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts b/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
index bdb976e9ec..143119bfe4 100644
--- a/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
+++ b/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Users } from '@/models/index';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/promo/create.ts b/packages/backend/src/server/api/endpoints/admin/promo/create.ts
index f2735ac9f8..2eec5bf0db 100644
--- a/packages/backend/src/server/api/endpoints/admin/promo/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/promo/create.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { PromoNotes } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { PromoNotes } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -11,16 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- expiresAt: {
- validator: $.num.int(),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -36,8 +24,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ expiresAt: { type: 'integer' },
+ },
+ required: ['noteId', 'expiresAt'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -51,7 +48,6 @@ export default define(meta, async (ps, user) => {
await PromoNotes.insert({
noteId: note.id,
- createdAt: new Date(),
expiresAt: new Date(ps.expiresAt),
userId: note.userId,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
index 3c8e7a27a2..8f015c280a 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
@@ -1,18 +1,22 @@
-import define from '../../../define';
-import { destroy } from '@/queue/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import define from '../../../define.js';
+import { destroy } from '@/queue/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {},
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
destroy();
insertModerationLog(me, 'clearQueue');
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
index 4760e2c310..70f7d77de4 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
@@ -1,6 +1,6 @@
-import { deliverQueue } from '@/queue/queues';
-import { URL } from 'url';
-import define from '../../../define';
+import { deliverQueue } from '@/queue/queues.js';
+import { URL } from 'node:url';
+import define from '../../../define.js';
export const meta = {
tags: ['admin'],
@@ -8,9 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -35,8 +32,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const jobs = await deliverQueue.getJobs(['delayed']);
const res = [] as [string, number][];
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
index a95aabc506..2235ce8f97 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
@@ -1,6 +1,6 @@
-import { URL } from 'url';
-import define from '../../../define';
-import { inboxQueue } from '@/queue/queues';
+import { URL } from 'node:url';
+import define from '../../../define.js';
+import { inboxQueue } from '@/queue/queues.js';
export const meta = {
tags: ['admin'],
@@ -8,9 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -35,8 +32,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const jobs = await inboxQueue.getJobs(['delayed']);
const res = [] as [string, number][];
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts b/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts
deleted file mode 100644
index df0b4a8f13..0000000000
--- a/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues';
-import $ from 'cafy';
-import define from '../../../define';
-
-export const meta = {
- tags: ['admin'],
-
- requireCredential: true,
- requireModerator: true,
-
- params: {
- domain: {
- validator: $.str.or(['deliver', 'inbox', 'db', 'objectStorage']),
- },
-
- state: {
- validator: $.str.or(['active', 'waiting', 'delayed']),
- },
-
- limit: {
- validator: $.optional.num,
- default: 50,
- },
- },
-
- res: {
- type: 'array',
- optional: false, nullable: false,
- items: {
- type: 'object',
- optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- format: 'id',
- },
- data: {
- type: 'object',
- optional: false, nullable: false,
- },
- attempts: {
- type: 'number',
- optional: false, nullable: false,
- },
- maxAttempts: {
- type: 'number',
- optional: false, nullable: false,
- },
- timestamp: {
- type: 'number',
- optional: false, nullable: false,
- },
- },
- },
- },
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- const queue =
- ps.domain === 'deliver' ? deliverQueue :
- ps.domain === 'inbox' ? inboxQueue :
- ps.domain === 'db' ? dbQueue :
- ps.domain === 'objectStorage' ? objectStorageQueue :
- null as never;
-
- const jobs = await queue.getJobs([ps.state], 0, ps.limit!);
-
- return jobs.map(job => {
- const data = job.data;
- delete data.content;
- delete data.user;
- return {
- id: job.id,
- data,
- attempts: job.attemptsMade,
- maxAttempts: job.opts ? job.opts.attempts : 0,
- timestamp: job.timestamp,
- };
- });
-});
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
index dab0be5dbc..988b5a5e35 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
@@ -1,5 +1,5 @@
-import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues';
-import define from '../../../define';
+import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues.js';
+import define from '../../../define.js';
export const meta = {
tags: ['admin'],
@@ -7,8 +7,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {},
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -33,8 +31,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const deliverJobCounts = await deliverQueue.getJobCounts();
const inboxJobCounts = await inboxQueue.getJobCounts();
const dbJobCounts = await dbQueue.getJobCounts();
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/add.ts b/packages/backend/src/server/api/endpoints/admin/relays/add.ts
index 65890a00f7..348e9baca1 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/add.ts
@@ -1,8 +1,7 @@
-import { URL } from 'url';
-import $ from 'cafy';
-import define from '../../../define';
-import { addRelay } from '@/services/relay';
-import { ApiError } from '../../../error';
+import { URL } from 'node:url';
+import define from '../../../define.js';
+import { addRelay } from '@/services/relay.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,12 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- inbox: {
- validator: $.str,
- },
- },
-
errors: {
invalidUrl: {
message: 'Invalid URL',
@@ -52,8 +45,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ inbox: { type: 'string' },
+ },
+ required: ['inbox'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
try {
if (new URL(ps.inbox).protocol !== 'https:') throw 'https only';
} catch {
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/list.ts b/packages/backend/src/server/api/endpoints/admin/relays/list.ts
index bdddf13374..89ec651e61 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { listRelay } from '@/services/relay';
+import define from '../../../define.js';
+import { listRelay } from '@/services/relay.js';
export const meta = {
tags: ['admin'],
@@ -7,9 +7,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,7 +39,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
return await listRelay();
});
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/remove.ts b/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
index 4b04e620c1..b59cf72c58 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { removeRelay } from '@/services/relay';
+import define from '../../../define.js';
+import { removeRelay } from '@/services/relay.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- inbox: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ inbox: { type: 'string' },
},
+ required: ['inbox'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
return await removeRelay(ps.inbox);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/reset-password.ts b/packages/backend/src/server/api/endpoints/admin/reset-password.ts
index b6cf1ee2d0..1fd5c8d5a5 100644
--- a/packages/backend/src/server/api/endpoints/admin/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/admin/reset-password.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import * as bcrypt from 'bcryptjs';
+import define from '../../define.js';
+import bcrypt from 'bcryptjs';
import rndstr from 'rndstr';
-import { Users, UserProfiles } from '@/models/index';
+import { Users, UserProfiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -11,12 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -31,8 +23,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
index b00457f092..a9e5658413 100644
--- a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
+++ b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
@@ -1,33 +1,28 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { AbuseUserReports, Users } from '@/models/index';
-import { getInstanceActor } from '@/services/instance-actor';
-import { deliver } from '@/queue/index';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { renderFlag } from '@/remote/activitypub/renderer/flag';
+import define from '../../define.js';
+import { AbuseUserReports, Users } from '@/models/index.js';
+import { getInstanceActor } from '@/services/instance-actor.js';
+import { deliver } from '@/queue/index.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { renderFlag } from '@/remote/activitypub/renderer/flag.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- reportId: {
- validator: $.type(ID),
- },
-
- forward: {
- validator: $.optional.boolean,
- required: false,
- default: false,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ reportId: { type: 'string', format: 'misskey:id' },
+ forward: { type: 'boolean', default: false },
},
+ required: ['reportId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const report = await AbuseUserReports.findOne(ps.reportId);
if (report == null) {
@@ -36,9 +31,9 @@ export default define(meta, async (ps, me) => {
if (ps.forward && report.targetUserHost != null) {
const actor = await getInstanceActor();
- const targetUser = await Users.findOne(report.targetUserId);
+ const targetUser = await Users.findOneOrFail(report.targetUserId);
- deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri], report.comment)), targetUser.inbox);
+ deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri!], report.comment)), targetUser.inbox);
}
await AbuseUserReports.update(report.id, {
diff --git a/packages/backend/src/server/api/endpoints/admin/resync-chart.ts b/packages/backend/src/server/api/endpoints/admin/resync-chart.ts
deleted file mode 100644
index d80d2b0426..0000000000
--- a/packages/backend/src/server/api/endpoints/admin/resync-chart.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import define from '../../define';
-import { driveChart, notesChart, usersChart } from '@/services/chart/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-
-export const meta = {
- tags: ['admin'],
-
- requireCredential: true,
- requireModerator: true,
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
- insertModerationLog(me, 'chartResync');
-
- driveChart.resync();
- notesChart.resync();
- usersChart.resync();
-
- // TODO: ユーザーごとのチャートもキューに入れて更新する
- // TODO: インスタンスごとのチャートもキューに入れて更新する
-});
diff --git a/packages/backend/src/server/api/endpoints/admin/send-email.ts b/packages/backend/src/server/api/endpoints/admin/send-email.ts
index c2972c35fa..bbdd66e4c9 100644
--- a/packages/backend/src/server/api/endpoints/admin/send-email.ts
+++ b/packages/backend/src/server/api/endpoints/admin/send-email.ts
@@ -1,27 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { sendEmail } from '@/services/send-email';
+import define from '../../define.js';
+import { sendEmail } from '@/services/send-email.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- to: {
- validator: $.str,
- },
- subject: {
- validator: $.str,
- },
- text: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ to: { type: 'string' },
+ subject: { type: 'string' },
+ text: { type: 'string' },
},
+ required: ['to', 'subject', 'text'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await sendEmail(ps.to, ps.subject, ps.text, ps.text);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/server-info.ts b/packages/backend/src/server/api/endpoints/admin/server-info.ts
index cd282e364c..8bf1c4341c 100644
--- a/packages/backend/src/server/api/endpoints/admin/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/admin/server-info.ts
@@ -1,8 +1,8 @@
-import * as os from 'os';
-import * as si from 'systeminformation';
+import * as os from 'node:os';
+import si from 'systeminformation';
import { getConnection } from 'typeorm';
-import define from '../../define';
-import { redisClient } from '../../../../db/redis';
+import define from '../../define.js';
+import { redisClient } from '../../../../db/redis.js';
export const meta = {
requireCredential: true,
@@ -10,9 +10,6 @@ export const meta = {
tags: ['admin', 'meta'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -90,8 +87,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const memStats = await si.mem();
const fsStats = await si.fsSize();
const netInterface = await si.networkInterfaceDefault();
diff --git a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
index 84e2b84bb5..3545536aa2 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ModerationLogs } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { ModerationLogs } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,21 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -65,11 +48,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(ModerationLogs.createQueryBuilder('report'), ps.sinceId, ps.untilId);
- const reports = await query.take(ps.limit!).getMany();
+ const reports = await query.take(ps.limit).getMany();
return await ModerationLogs.packMany(reports);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts
index c2a6a294b5..a435dcc288 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts
@@ -1,7 +1,5 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -9,158 +7,22 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
nullable: false, optional: false,
- properties: {
- id: {
- type: 'string',
- nullable: false, optional: false,
- format: 'id',
- },
- createdAt: {
- type: 'string',
- nullable: false, optional: false,
- format: 'date-time',
- },
- updatedAt: {
- type: 'string',
- nullable: true, optional: false,
- format: 'date-time',
- },
- lastFetchedAt: {
- type: 'string',
- nullable: true, optional: false,
- },
- username: {
- type: 'string',
- nullable: false, optional: false,
- },
- name: {
- type: 'string',
- nullable: true, optional: false,
- },
- folowersCount: {
- type: 'number',
- nullable: false, optional: true,
- },
- followingCount: {
- type: 'number',
- nullable: false, optional: false,
- },
- notesCount: {
- type: 'number',
- nullable: false, optional: false,
- },
- avatarId: {
- type: 'string',
- nullable: true, optional: false,
- },
- bannerId: {
- type: 'string',
- nullable: true, optional: false,
- },
- tags: {
- type: 'array',
- nullable: false, optional: false,
- items: {
- type: 'string',
- nullable: false, optional: false,
- },
- },
- avatarUrl: {
- type: 'string',
- nullable: true, optional: false,
- format: 'url',
- },
- bannerUrl: {
- type: 'string',
- nullable: true, optional: false,
- format: 'url',
- },
- avatarBlurhash: {
- type: 'any',
- nullable: true, optional: false,
- default: null,
- },
- bannerBlurhash: {
- type: 'any',
- nullable: true, optional: false,
- default: null,
- },
- isSuspended: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isSilenced: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isLocked: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isBot: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isCat: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isAdmin: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isModerator: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- emojis: {
- type: 'array',
- nullable: false, optional: false,
- items: {
- type: 'string',
- nullable: false, optional: false,
- },
- },
- host: {
- type: 'string',
- nullable: true, optional: false,
- },
- inbox: {
- type: 'string',
- nullable: true, optional: false,
- },
- sharedInbox: {
- type: 'string',
- nullable: true, optional: false,
- },
- featured: {
- type: 'string',
- nullable: true, optional: false,
- },
- uri: {
- type: 'string',
- nullable: true, optional: false,
- },
- token: {
- type: 'string',
- nullable: true, optional: false,
- default: '<MASKED>',
- },
- },
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/show-users.ts b/packages/backend/src/server/api/endpoints/admin/show-users.ts
index d3dde99b72..1ec86fef2e 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-users.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-users.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Users } from '@/models/index';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -8,61 +7,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str.or([
- '+follower',
- '-follower',
- '+createdAt',
- '-createdAt',
- '+updatedAt',
- '-updatedAt',
- ]),
- },
-
- state: {
- validator: $.optional.str.or([
- 'all',
- 'available',
- 'admin',
- 'moderator',
- 'adminOrModerator',
- 'silenced',
- 'suspended',
- ]),
- default: 'all',
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
-
- username: {
- validator: $.optional.str,
- default: null,
- },
-
- hostname: {
- validator: $.optional.str,
- default: null,
- },
- },
-
res: {
type: 'array',
nullable: false, optional: false,
@@ -74,8 +18,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
+ state: { type: 'string', enum: ['all', 'available', 'admin', 'moderator', 'adminOrModerator', 'silenced', 'suspended'], default: "all" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ username: { type: 'string', default: null },
+ hostname: { type: 'string', default: null },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user');
switch (ps.state) {
@@ -111,7 +69,7 @@ export default define(meta, async (ps, me) => {
default: query.orderBy('user.id', 'ASC'); break;
}
- query.take(ps.limit!);
+ query.take(ps.limit);
query.skip(ps.offset);
const users = await query.getMany();
diff --git a/packages/backend/src/server/api/endpoints/admin/silence-user.ts b/packages/backend/src/server/api/endpoints/admin/silence-user.ts
index 872bd2a6ac..4a74c3fb00 100644
--- a/packages/backend/src/server/api/endpoints/admin/silence-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/silence-user.ts
@@ -1,24 +1,24 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
index 2bb1875fc0..adaa7b86ce 100644
--- a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
@@ -1,28 +1,28 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import deleteFollowing from '@/services/following/delete';
-import { Users, Followings, Notifications } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { doPostSuspend } from '@/services/suspend-user';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import deleteFollowing from '@/services/following/delete.js';
+import { Users, Followings, Notifications } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { doPostSuspend } from '@/services/suspend-user.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts b/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
index a4c6ff2ade..4e6366aa18 100644
--- a/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
@@ -1,24 +1,24 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts b/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
index 5ab56d51c7..3b9e0a94e0 100644
--- a/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
@@ -1,25 +1,25 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { doPostUnsuspend } from '@/services/unsuspend-user';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { doPostUnsuspend } from '@/services/unsuspend-user.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index aa2d1222f7..66b634c877 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -1,306 +1,107 @@
-import $ from 'cafy';
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
-import { Meta } from '@/models/entities/meta';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
-import { ID } from '@/misc/cafy-id';
+import { Meta } from '@/models/entities/meta.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
+} as const;
- params: {
- disableRegistration: {
- validator: $.optional.nullable.bool,
- },
-
- disableLocalTimeline: {
- validator: $.optional.nullable.bool,
- },
-
- disableGlobalTimeline: {
- validator: $.optional.nullable.bool,
- },
-
- useStarForReactionFallback: {
- validator: $.optional.nullable.bool,
- },
-
- pinnedUsers: {
- validator: $.optional.nullable.arr($.str),
- },
-
- hiddenTags: {
- validator: $.optional.nullable.arr($.str),
- },
-
- blockedHosts: {
- validator: $.optional.nullable.arr($.str),
- },
-
- mascotImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- bannerUrl: {
- validator: $.optional.nullable.str,
- },
-
- errorImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- iconUrl: {
- validator: $.optional.nullable.str,
- },
-
- backgroundImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- logoImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- name: {
- validator: $.optional.nullable.str,
- },
-
- description: {
- validator: $.optional.nullable.str,
- },
-
- maxNoteTextLength: {
- validator: $.optional.num.min(0).max(DB_MAX_NOTE_TEXT_LENGTH),
- },
-
- localDriveCapacityMb: {
- validator: $.optional.num.min(0),
- },
-
- remoteDriveCapacityMb: {
- validator: $.optional.num.min(0),
- },
-
- cacheRemoteFiles: {
- validator: $.optional.bool,
- },
-
- proxyRemoteFiles: {
- validator: $.optional.bool,
- },
-
- emailRequiredForSignup: {
- validator: $.optional.bool,
- },
-
- enableHcaptcha: {
- validator: $.optional.bool,
- },
-
- hcaptchaSiteKey: {
- validator: $.optional.nullable.str,
- },
-
- hcaptchaSecretKey: {
- validator: $.optional.nullable.str,
- },
-
- enableRecaptcha: {
- validator: $.optional.bool,
- },
-
- recaptchaSiteKey: {
- validator: $.optional.nullable.str,
- },
-
- recaptchaSecretKey: {
- validator: $.optional.nullable.str,
- },
-
- proxyAccountId: {
- validator: $.optional.nullable.type(ID),
- },
-
- maintainerName: {
- validator: $.optional.nullable.str,
- },
-
- maintainerEmail: {
- validator: $.optional.nullable.str,
- },
-
- pinnedPages: {
- validator: $.optional.arr($.str),
- },
-
- pinnedClipId: {
- validator: $.optional.nullable.type(ID),
- },
-
- langs: {
- validator: $.optional.arr($.str),
- },
-
- summalyProxy: {
- validator: $.optional.nullable.str,
- },
-
- deeplAuthKey: {
- validator: $.optional.nullable.str,
- },
-
- deeplIsPro: {
- validator: $.optional.bool,
- },
-
- enableTwitterIntegration: {
- validator: $.optional.bool,
- },
-
- twitterConsumerKey: {
- validator: $.optional.nullable.str,
- },
-
- twitterConsumerSecret: {
- validator: $.optional.nullable.str,
- },
-
- enableGithubIntegration: {
- validator: $.optional.bool,
- },
-
- githubClientId: {
- validator: $.optional.nullable.str,
- },
-
- githubClientSecret: {
- validator: $.optional.nullable.str,
- },
-
- enableDiscordIntegration: {
- validator: $.optional.bool,
- },
-
- discordClientId: {
- validator: $.optional.nullable.str,
- },
-
- discordClientSecret: {
- validator: $.optional.nullable.str,
- },
-
- enableEmail: {
- validator: $.optional.bool,
- },
-
- email: {
- validator: $.optional.nullable.str,
- },
-
- smtpSecure: {
- validator: $.optional.bool,
- },
-
- smtpHost: {
- validator: $.optional.nullable.str,
- },
-
- smtpPort: {
- validator: $.optional.nullable.num,
- },
-
- smtpUser: {
- validator: $.optional.nullable.str,
- },
-
- smtpPass: {
- validator: $.optional.nullable.str,
- },
-
- enableServiceWorker: {
- validator: $.optional.bool,
- },
-
- swPublicKey: {
- validator: $.optional.nullable.str,
- },
-
- swPrivateKey: {
- validator: $.optional.nullable.str,
- },
-
- tosUrl: {
- validator: $.optional.nullable.str,
- },
-
- repositoryUrl: {
- validator: $.optional.str,
- },
-
- feedbackUrl: {
- validator: $.optional.str,
- },
-
- useObjectStorage: {
- validator: $.optional.bool,
- },
-
- objectStorageBaseUrl: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageBucket: {
- validator: $.optional.nullable.str,
- },
-
- objectStoragePrefix: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageEndpoint: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageRegion: {
- validator: $.optional.nullable.str,
- },
-
- objectStoragePort: {
- validator: $.optional.nullable.num,
- },
-
- objectStorageAccessKey: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageSecretKey: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageUseSSL: {
- validator: $.optional.bool,
- },
-
- objectStorageUseProxy: {
- validator: $.optional.bool,
- },
-
- objectStorageSetPublicRead: {
- validator: $.optional.bool,
- },
-
- objectStorageS3ForcePathStyle: {
- validator: $.optional.bool,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ disableRegistration: { type: 'boolean', nullable: true },
+ disableLocalTimeline: { type: 'boolean', nullable: true },
+ disableGlobalTimeline: { type: 'boolean', nullable: true },
+ useStarForReactionFallback: { type: 'boolean', nullable: true },
+ pinnedUsers: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ hiddenTags: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ blockedHosts: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ themeColor: { type: 'string', nullable: true },
+ mascotImageUrl: { type: 'string', nullable: true },
+ bannerUrl: { type: 'string', nullable: true },
+ errorImageUrl: { type: 'string', nullable: true },
+ iconUrl: { type: 'string', nullable: true },
+ backgroundImageUrl: { type: 'string', nullable: true },
+ logoImageUrl: { type: 'string', nullable: true },
+ name: { type: 'string', nullable: true },
+ description: { type: 'string', nullable: true },
+ defaultLightTheme: { type: 'string', nullable: true },
+ defaultDarkTheme: { type: 'string', nullable: true },
+ localDriveCapacityMb: { type: 'integer' },
+ remoteDriveCapacityMb: { type: 'integer' },
+ cacheRemoteFiles: { type: 'boolean' },
+ emailRequiredForSignup: { type: 'boolean' },
+ enableHcaptcha: { type: 'boolean' },
+ hcaptchaSiteKey: { type: 'string', nullable: true },
+ hcaptchaSecretKey: { type: 'string', nullable: true },
+ enableRecaptcha: { type: 'boolean' },
+ recaptchaSiteKey: { type: 'string', nullable: true },
+ recaptchaSecretKey: { type: 'string', nullable: true },
+ proxyAccountId: { type: 'string', format: 'misskey:id', nullable: true },
+ maintainerName: { type: 'string', nullable: true },
+ maintainerEmail: { type: 'string', nullable: true },
+ pinnedPages: { type: 'array', items: {
+ type: 'string',
+ } },
+ pinnedClipId: { type: 'string', format: 'misskey:id', nullable: true },
+ langs: { type: 'array', items: {
+ type: 'string',
+ } },
+ summalyProxy: { type: 'string', nullable: true },
+ deeplAuthKey: { type: 'string', nullable: true },
+ deeplIsPro: { type: 'boolean' },
+ enableTwitterIntegration: { type: 'boolean' },
+ twitterConsumerKey: { type: 'string', nullable: true },
+ twitterConsumerSecret: { type: 'string', nullable: true },
+ enableGithubIntegration: { type: 'boolean' },
+ githubClientId: { type: 'string', nullable: true },
+ githubClientSecret: { type: 'string', nullable: true },
+ enableDiscordIntegration: { type: 'boolean' },
+ discordClientId: { type: 'string', nullable: true },
+ discordClientSecret: { type: 'string', nullable: true },
+ enableEmail: { type: 'boolean' },
+ email: { type: 'string', nullable: true },
+ smtpSecure: { type: 'boolean' },
+ smtpHost: { type: 'string', nullable: true },
+ smtpPort: { type: 'integer', nullable: true },
+ smtpUser: { type: 'string', nullable: true },
+ smtpPass: { type: 'string', nullable: true },
+ enableServiceWorker: { type: 'boolean' },
+ swPublicKey: { type: 'string', nullable: true },
+ swPrivateKey: { type: 'string', nullable: true },
+ tosUrl: { type: 'string', nullable: true },
+ repositoryUrl: { type: 'string' },
+ feedbackUrl: { type: 'string' },
+ useObjectStorage: { type: 'boolean' },
+ objectStorageBaseUrl: { type: 'string', nullable: true },
+ objectStorageBucket: { type: 'string', nullable: true },
+ objectStoragePrefix: { type: 'string', nullable: true },
+ objectStorageEndpoint: { type: 'string', nullable: true },
+ objectStorageRegion: { type: 'string', nullable: true },
+ objectStoragePort: { type: 'integer', nullable: true },
+ objectStorageAccessKey: { type: 'string', nullable: true },
+ objectStorageSecretKey: { type: 'string', nullable: true },
+ objectStorageUseSSL: { type: 'boolean' },
+ objectStorageUseProxy: { type: 'boolean' },
+ objectStorageSetPublicRead: { type: 'boolean' },
+ objectStorageS3ForcePathStyle: { type: 'boolean' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const set = {} as Partial<Meta>;
if (typeof ps.disableRegistration === 'boolean') {
@@ -331,6 +132,10 @@ export default define(meta, async (ps, me) => {
set.blockedHosts = ps.blockedHosts.filter(Boolean);
}
+ if (ps.themeColor !== undefined) {
+ set.themeColor = ps.themeColor;
+ }
+
if (ps.mascotImageUrl !== undefined) {
set.mascotImageUrl = ps.mascotImageUrl;
}
@@ -359,8 +164,12 @@ export default define(meta, async (ps, me) => {
set.description = ps.description;
}
- if (ps.maxNoteTextLength) {
- set.maxNoteTextLength = ps.maxNoteTextLength;
+ if (ps.defaultLightTheme !== undefined) {
+ set.defaultLightTheme = ps.defaultLightTheme;
+ }
+
+ if (ps.defaultDarkTheme !== undefined) {
+ set.defaultDarkTheme = ps.defaultDarkTheme;
}
if (ps.localDriveCapacityMb !== undefined) {
@@ -375,10 +184,6 @@ export default define(meta, async (ps, me) => {
set.cacheRemoteFiles = ps.cacheRemoteFiles;
}
- if (ps.proxyRemoteFiles !== undefined) {
- set.proxyRemoteFiles = ps.proxyRemoteFiles;
- }
-
if (ps.emailRequiredForSignup !== undefined) {
set.emailRequiredForSignup = ps.emailRequiredForSignup;
}
diff --git a/packages/backend/src/server/api/endpoints/admin/vacuum.ts b/packages/backend/src/server/api/endpoints/admin/vacuum.ts
index 4229ef0d29..4c04e019da 100644
--- a/packages/backend/src/server/api/endpoints/admin/vacuum.ts
+++ b/packages/backend/src/server/api/endpoints/admin/vacuum.ts
@@ -1,26 +1,25 @@
-import $ from 'cafy';
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- full: {
- validator: $.bool,
- },
- analyze: {
- validator: $.bool,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ full: { type: 'boolean' },
+ analyze: { type: 'boolean' },
},
+ required: ['full', 'analyze'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const params: string[] = [];
if (ps.full) {
diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts
index 0bd29607d6..bba66e98cf 100644
--- a/packages/backend/src/server/api/endpoints/announcements.ts
+++ b/packages/backend/src/server/api/endpoints/announcements.ts
@@ -1,34 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../define';
-import { Announcements, AnnouncementReads } from '@/models/index';
-import { makePaginationQuery } from '../common/make-pagination-query';
+import define from '../define.js';
+import { Announcements, AnnouncementReads } from '@/models/index.js';
+import { makePaginationQuery } from '../common/make-pagination-query.js';
export const meta = {
tags: ['meta'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- withUnreads: {
- validator: $.optional.boolean,
- default: false,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -73,11 +51,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ withUnreads: { type: 'boolean', default: false },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Announcements.createQueryBuilder('announcement'), ps.sinceId, ps.untilId);
- const announcements = await query.take(ps.limit!).getMany();
+ const announcements = await query.take(ps.limit).getMany();
if (user) {
const reads = (await AnnouncementReads.find({
@@ -89,5 +78,9 @@ export default define(meta, async (ps, user) => {
}
}
- return ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements;
+ return (ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements).map((a) => ({
+ ...a,
+ createdAt: a.createdAt.toISOString(),
+ updatedAt: a.updatedAt?.toISOString() ?? null,
+ }));
});
diff --git a/packages/backend/src/server/api/endpoints/antennas/create.ts b/packages/backend/src/server/api/endpoints/antennas/create.ts
index 2092d177ba..92cbba817e 100644
--- a/packages/backend/src/server/api/endpoints/antennas/create.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import define from '../../define';
-import { genId } from '@/misc/gen-id';
-import { Antennas, UserLists, UserGroupJoinings } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
-import { ApiError } from '../../error';
-import { publishInternalEvent } from '@/services/stream';
+import define from '../../define.js';
+import { genId } from '@/misc/gen-id.js';
+import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
+import { ApiError } from '../../error.js';
+import { publishInternalEvent } from '@/services/stream.js';
export const meta = {
tags: ['antennas'],
@@ -13,52 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
-
- src: {
- validator: $.str.or(['home', 'all', 'users', 'list', 'group']),
- },
-
- userListId: {
- validator: $.nullable.optional.type(ID),
- },
-
- userGroupId: {
- validator: $.nullable.optional.type(ID),
- },
-
- keywords: {
- validator: $.arr($.arr($.str)),
- },
-
- excludeKeywords: {
- validator: $.arr($.arr($.str)),
- },
-
- users: {
- validator: $.arr($.str),
- },
-
- caseSensitive: {
- validator: $.bool,
- },
-
- withReplies: {
- validator: $.bool,
- },
-
- withFile: {
- validator: $.bool,
- },
-
- notify: {
- validator: $.bool,
- },
- },
-
errors: {
noSuchUserList: {
message: 'No such user list.',
@@ -80,8 +32,36 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'group'] },
+ userListId: { type: 'string', format: 'misskey:id', nullable: true },
+ userGroupId: { type: 'string', format: 'misskey:id', nullable: true },
+ keywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ excludeKeywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ users: { type: 'array', items: {
+ type: 'string',
+ } },
+ caseSensitive: { type: 'boolean' },
+ withReplies: { type: 'boolean' },
+ withFile: { type: 'boolean' },
+ notify: { type: 'boolean' },
+ },
+ required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile', 'notify'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let userList;
let userGroupJoining;
diff --git a/packages/backend/src/server/api/endpoints/antennas/delete.ts b/packages/backend/src/server/api/endpoints/antennas/delete.ts
index b2793fc70d..4e6b8b3d2e 100644
--- a/packages/backend/src/server/api/endpoints/antennas/delete.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Antennas } from '@/models/index';
-import { publishInternalEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Antennas } from '@/models/index.js';
+import { publishInternalEvent } from '@/services/stream.js';
export const meta = {
tags: ['antennas'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['antennaId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const antenna = await Antennas.findOne({
id: ps.antennaId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/antennas/list.ts b/packages/backend/src/server/api/endpoints/antennas/list.ts
index bb58912612..accca5de76 100644
--- a/packages/backend/src/server/api/endpoints/antennas/list.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/list.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Antennas } from '@/models/index';
+import define from '../../define.js';
+import { Antennas } from '@/models/index.js';
export const meta = {
tags: ['antennas', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const antennas = await Antennas.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/antennas/notes.ts b/packages/backend/src/server/api/endpoints/antennas/notes.ts
index eb7de901c5..f0cb2ba3c0 100644
--- a/packages/backend/src/server/api/endpoints/antennas/notes.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/notes.ts
@@ -1,13 +1,11 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import readNote from '@/services/note/read';
-import { Antennas, Notes, AntennaNotes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { ApiError } from '../../error';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import readNote from '@/services/note/read.js';
+import { Antennas, Notes, AntennaNotes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { ApiError } from '../../error.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['antennas', 'account', 'notes'],
@@ -16,33 +14,6 @@ export const meta = {
kind: 'read:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -62,8 +33,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: ['antennaId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const antenna = await Antennas.findOne({
id: ps.antennaId,
userId: user.id,
@@ -81,10 +65,16 @@ export default define(meta, async (ps, user) => {
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere(`note.id IN (${ antennaQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(antennaQuery.getParameters());
generateVisibilityQuery(query, user);
@@ -92,7 +82,7 @@ export default define(meta, async (ps, user) => {
generateBlockedUserQuery(query, user);
const notes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
if (notes.length > 0) {
diff --git a/packages/backend/src/server/api/endpoints/antennas/show.ts b/packages/backend/src/server/api/endpoints/antennas/show.ts
index a37d37d31c..36c4da81b7 100644
--- a/packages/backend/src/server/api/endpoints/antennas/show.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Antennas } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Antennas } from '@/models/index.js';
export const meta = {
tags: ['antennas', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['antennaId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the antenna
const antenna = await Antennas.findOne({
id: ps.antennaId,
diff --git a/packages/backend/src/server/api/endpoints/antennas/update.ts b/packages/backend/src/server/api/endpoints/antennas/update.ts
index 900f725505..a99964555b 100644
--- a/packages/backend/src/server/api/endpoints/antennas/update.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Antennas, UserLists, UserGroupJoinings } from '@/models/index';
-import { publishInternalEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
+import { publishInternalEvent } from '@/services/stream.js';
export const meta = {
tags: ['antennas'],
@@ -12,56 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
-
- src: {
- validator: $.str.or(['home', 'all', 'users', 'list', 'group']),
- },
-
- userListId: {
- validator: $.nullable.optional.type(ID),
- },
-
- userGroupId: {
- validator: $.nullable.optional.type(ID),
- },
-
- keywords: {
- validator: $.arr($.arr($.str)),
- },
-
- excludeKeywords: {
- validator: $.arr($.arr($.str)),
- },
-
- users: {
- validator: $.arr($.str),
- },
-
- caseSensitive: {
- validator: $.bool,
- },
-
- withReplies: {
- validator: $.bool,
- },
-
- withFile: {
- validator: $.bool,
- },
-
- notify: {
- validator: $.bool,
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -89,8 +37,37 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'group'] },
+ userListId: { type: 'string', format: 'misskey:id', nullable: true },
+ userGroupId: { type: 'string', format: 'misskey:id', nullable: true },
+ keywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ excludeKeywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ users: { type: 'array', items: {
+ type: 'string',
+ } },
+ caseSensitive: { type: 'boolean' },
+ withReplies: { type: 'boolean' },
+ withFile: { type: 'boolean' },
+ notify: { type: 'boolean' },
+ },
+ required: ['antennaId', 'name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile', 'notify'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the antenna
const antenna = await Antennas.findOne({
id: ps.antennaId,
diff --git a/packages/backend/src/server/api/endpoints/ap/get.ts b/packages/backend/src/server/api/endpoints/ap/get.ts
index ff8c677b91..0cbe7ebc67 100644
--- a/packages/backend/src/server/api/endpoints/ap/get.ts
+++ b/packages/backend/src/server/api/endpoints/ap/get.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import Resolver from '@/remote/activitypub/resolver';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import Resolver from '@/remote/activitypub/resolver.js';
+import { ApiError } from '../../error.js';
import ms from 'ms';
export const meta = {
@@ -14,12 +13,6 @@ export const meta = {
max: 30,
},
- params: {
- uri: {
- validator: $.str,
- },
- },
-
errors: {
},
@@ -29,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ uri: { type: 'string' },
+ },
+ required: ['uri'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const resolver = new Resolver();
const object = await resolver.resolve(ps.uri);
return object;
diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts
index 7d17d8edce..7595c38e8a 100644
--- a/packages/backend/src/server/api/endpoints/ap/show.ts
+++ b/packages/backend/src/server/api/endpoints/ap/show.ts
@@ -1,18 +1,17 @@
-import $ from 'cafy';
-import define from '../../define';
-import config from '@/config/index';
-import { createPerson } from '@/remote/activitypub/models/person';
-import { createNote } from '@/remote/activitypub/models/note';
-import Resolver from '@/remote/activitypub/resolver';
-import { ApiError } from '../../error';
-import { extractDbHost } from '@/misc/convert-host';
-import { Users, Notes } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { isActor, isPost, getApId } from '@/remote/activitypub/type';
+import define from '../../define.js';
+import config from '@/config/index.js';
+import { createPerson } from '@/remote/activitypub/models/person.js';
+import { createNote } from '@/remote/activitypub/models/note.js';
+import Resolver from '@/remote/activitypub/resolver.js';
+import { ApiError } from '../../error.js';
+import { extractDbHost } from '@/misc/convert-host.js';
+import { Users, Notes } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { isActor, isPost, getApId } from '@/remote/activitypub/type.js';
import ms from 'ms';
-import { SchemaType } from '@/misc/schema';
+import { SchemaType } from '@/misc/schema.js';
export const meta = {
tags: ['federation'],
@@ -24,12 +23,6 @@ export const meta = {
max: 30,
},
- params: {
- uri: {
- validator: $.str,
- },
- },
-
errors: {
noSuchObject: {
message: 'No such object.',
@@ -75,8 +68,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ uri: { type: 'string' },
+ },
+ required: ['uri'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const object = await fetchAny(ps.uri);
if (object) {
return object;
diff --git a/packages/backend/src/server/api/endpoints/app/create.ts b/packages/backend/src/server/api/endpoints/app/create.ts
index fbe6690f1d..e0cf8632fb 100644
--- a/packages/backend/src/server/api/endpoints/app/create.ts
+++ b/packages/backend/src/server/api/endpoints/app/create.ts
@@ -1,35 +1,14 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Apps } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { unique } from '@/prelude/array';
-import { secureRndstr } from '@/misc/secure-rndstr';
+import define from '../../define.js';
+import { Apps } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { unique } from '@/prelude/array.js';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export const meta = {
tags: ['app'],
requireCredential: false,
- params: {
- name: {
- validator: $.str,
- },
-
- description: {
- validator: $.str,
- },
-
- permission: {
- validator: $.arr($.str).unique(),
- },
-
- // TODO: Check it is valid url
- callbackUrl: {
- validator: $.optional.nullable.str,
- default: null,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -37,8 +16,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ description: { type: 'string' },
+ permission: { type: 'array', uniqueItems: true, items: {
+ type: 'string',
+ } },
+ callbackUrl: { type: 'string', nullable: true },
+ },
+ required: ['name', 'description', 'permission'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Generate secret
const secret = secureRndstr(32, true);
diff --git a/packages/backend/src/server/api/endpoints/app/show.ts b/packages/backend/src/server/api/endpoints/app/show.ts
index 9f4777b383..54e714e193 100644
--- a/packages/backend/src/server/api/endpoints/app/show.ts
+++ b/packages/backend/src/server/api/endpoints/app/show.ts
@@ -1,18 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Apps } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Apps } from '@/models/index.js';
export const meta = {
tags: ['app'],
- params: {
- appId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchApp: {
message: 'No such app.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ appId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['appId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, token) => {
+export default define(meta, paramDef, async (ps, user, token) => {
const isSecure = user != null && token == null;
// Lookup app
diff --git a/packages/backend/src/server/api/endpoints/auth/accept.ts b/packages/backend/src/server/api/endpoints/auth/accept.ts
index f028135ca5..0760eef52b 100644
--- a/packages/backend/src/server/api/endpoints/auth/accept.ts
+++ b/packages/backend/src/server/api/endpoints/auth/accept.ts
@@ -1,10 +1,9 @@
-import * as crypto from 'crypto';
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { AuthSessions, AccessTokens, Apps } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { secureRndstr } from '@/misc/secure-rndstr';
+import * as crypto from 'node:crypto';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { AuthSessions, AccessTokens, Apps } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export const meta = {
tags: ['auth'],
@@ -13,12 +12,6 @@ export const meta = {
secure: true,
- params: {
- token: {
- validator: $.str,
- },
- },
-
errors: {
noSuchSession: {
message: 'No such session.',
@@ -28,8 +21,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
+ },
+ required: ['token'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch token
const session = await AuthSessions
.findOne({ token: ps.token });
diff --git a/packages/backend/src/server/api/endpoints/auth/session/generate.ts b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
index 98987eba5b..bd571327d2 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/generate.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
@@ -1,22 +1,15 @@
import { v4 as uuid } from 'uuid';
-import $ from 'cafy';
-import config from '@/config/index';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { Apps, AuthSessions } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import config from '@/config/index.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { Apps, AuthSessions } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['auth'],
requireCredential: false,
- params: {
- appSecret: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -42,8 +35,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ appSecret: { type: 'string' },
+ },
+ required: ['appSecret'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
// Lookup app
const app = await Apps.findOne({
secret: ps.appSecret,
diff --git a/packages/backend/src/server/api/endpoints/auth/session/show.ts b/packages/backend/src/server/api/endpoints/auth/session/show.ts
index ae0d016cea..d40c9363c6 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/show.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/show.ts
@@ -1,19 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { AuthSessions } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { AuthSessions } from '@/models/index.js';
export const meta = {
tags: ['auth'],
requireCredential: false,
- params: {
- token: {
- validator: $.str,
- },
- },
-
errors: {
noSuchSession: {
message: 'No such session.',
@@ -44,8 +37,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
+ },
+ required: ['token'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Lookup session
const session = await AuthSessions.findOne({
token: ps.token,
diff --git a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
index fe0211ebe3..b699c6fa25 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
@@ -1,23 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { Apps, AuthSessions, AccessTokens, Users } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { Apps, AuthSessions, AccessTokens, Users } from '@/models/index.js';
export const meta = {
tags: ['auth'],
requireCredential: false,
- params: {
- appSecret: {
- validator: $.str,
- },
-
- token: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -56,8 +45,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ appSecret: { type: 'string' },
+ token: { type: 'string' },
+ },
+ required: ['appSecret', 'token'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
// Lookup app
const app = await Apps.findOne({
secret: ps.appSecret,
diff --git a/packages/backend/src/server/api/endpoints/blocking/create.ts b/packages/backend/src/server/api/endpoints/blocking/create.ts
index 6d555ff569..c5e73c0131 100644
--- a/packages/backend/src/server/api/endpoints/blocking/create.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/create.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import create from '@/services/blocking/create';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Blockings, NoteWatchings, Users } from '@/models/index';
+import create from '@/services/blocking/create.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Blockings, NoteWatchings, Users } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:blocks',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const blocker = await Users.findOneOrFail(user.id);
// 自分自身
diff --git a/packages/backend/src/server/api/endpoints/blocking/delete.ts b/packages/backend/src/server/api/endpoints/blocking/delete.ts
index 942cddaedf..a45547290c 100644
--- a/packages/backend/src/server/api/endpoints/blocking/delete.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/delete.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import deleteBlocking from '@/services/blocking/delete';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Blockings, Users } from '@/models/index';
+import deleteBlocking from '@/services/blocking/delete.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Blockings, Users } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:blocks',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const blocker = await Users.findOneOrFail(user.id);
// Check if the blockee is yourself
diff --git a/packages/backend/src/server/api/endpoints/blocking/list.ts b/packages/backend/src/server/api/endpoints/blocking/list.ts
index 9a4f662140..29095ebe21 100644
--- a/packages/backend/src/server/api/endpoints/blocking/list.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/list.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Blockings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Blockings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:blocks',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Blockings.createQueryBuilder('blocking'), ps.sinceId, ps.untilId)
.andWhere(`blocking.blockerId = :meId`, { meId: me.id });
const blockings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Blockings.packMany(blockings, me);
diff --git a/packages/backend/src/server/api/endpoints/channels/create.ts b/packages/backend/src/server/api/endpoints/channels/create.ts
index 68cdf1143e..16456b9c01 100644
--- a/packages/backend/src/server/api/endpoints/channels/create.ts
+++ b/packages/backend/src/server/api/endpoints/channels/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, DriveFiles } from '@/models/index';
-import { Channel } from '@/models/entities/channel';
-import { genId } from '@/misc/gen-id';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, DriveFiles } from '@/models/index.js';
+import { Channel } from '@/models/entities/channel.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['channels'],
@@ -13,20 +11,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- name: {
- validator: $.str.range(1, 128),
- },
-
- description: {
- validator: $.nullable.optional.str.range(1, 2048),
- },
-
- bannerId: {
- validator: $.nullable.optional.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -42,8 +26,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 128 },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ bannerId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let banner = null;
if (ps.bannerId != null) {
banner = await DriveFiles.findOne({
diff --git a/packages/backend/src/server/api/endpoints/channels/featured.ts b/packages/backend/src/server/api/endpoints/channels/featured.ts
index ceadde907c..73980c0fad 100644
--- a/packages/backend/src/server/api/endpoints/channels/featured.ts
+++ b/packages/backend/src/server/api/endpoints/channels/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Channels } from '@/models/index';
+import define from '../../define.js';
+import { Channels } from '@/models/index.js';
export const meta = {
tags: ['channels'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Channels.createQueryBuilder('channel')
.where('channel.lastNotedAt IS NOT NULL')
.orderBy('channel.lastNotedAt', 'DESC');
diff --git a/packages/backend/src/server/api/endpoints/channels/follow.ts b/packages/backend/src/server/api/endpoints/channels/follow.ts
index bf580eea60..4372c283cb 100644
--- a/packages/backend/src/server/api/endpoints/channels/follow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/follow.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, ChannelFollowings } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, ChannelFollowings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['channels'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- channelId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchChannel: {
message: 'No such channel.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/channels/followed.ts b/packages/backend/src/server/api/endpoints/channels/followed.ts
index 9e4c942af2..e4aa4d1614 100644
--- a/packages/backend/src/server/api/endpoints/channels/followed.ts
+++ b/packages/backend/src/server/api/endpoints/channels/followed.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Channels, ChannelFollowings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Channels, ChannelFollowings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['channels', 'account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:channels',
- params: {
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 5,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 5 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(ChannelFollowings.createQueryBuilder(), ps.sinceId, ps.untilId)
.andWhere({ followerId: me.id });
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Promise.all(followings.map(x => Channels.pack(x.followeeId, me)));
diff --git a/packages/backend/src/server/api/endpoints/channels/owned.ts b/packages/backend/src/server/api/endpoints/channels/owned.ts
index 5473636a85..ed7e41cac2 100644
--- a/packages/backend/src/server/api/endpoints/channels/owned.ts
+++ b/packages/backend/src/server/api/endpoints/channels/owned.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Channels } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Channels } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['channels', 'account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:channels',
- params: {
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 5,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 5 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Channels.createQueryBuilder(), ps.sinceId, ps.untilId)
.andWhere({ userId: me.id });
const channels = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Promise.all(channels.map(x => Channels.pack(x, me)));
diff --git a/packages/backend/src/server/api/endpoints/channels/show.ts b/packages/backend/src/server/api/endpoints/channels/show.ts
index 598a87ec4e..ea4e013073 100644
--- a/packages/backend/src/server/api/endpoints/channels/show.ts
+++ b/packages/backend/src/server/api/endpoints/channels/show.ts
@@ -1,20 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels } from '@/models/index.js';
export const meta = {
tags: ['channels'],
requireCredential: false,
- params: {
- channelId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -30,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts
index 927ce7c741..57a9fa44b8 100644
--- a/packages/backend/src/server/api/endpoints/channels/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Notes, Channels } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Notes, Channels } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
export const meta = {
tags: ['notes', 'channels'],
requireCredential: false,
- params: {
- channelId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -57,8 +28,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
@@ -71,16 +55,22 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('note.channelId = :channelId', { channelId: channel.id })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.leftJoinAndSelect('note.channel', 'channel');
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
- if (user) activeUsersChart.update(user);
+ if (user) activeUsersChart.read(user);
return await Notes.packMany(timeline, user);
});
diff --git a/packages/backend/src/server/api/endpoints/channels/unfollow.ts b/packages/backend/src/server/api/endpoints/channels/unfollow.ts
index ada0cb29fd..32beb24d6f 100644
--- a/packages/backend/src/server/api/endpoints/channels/unfollow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/unfollow.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, ChannelFollowings } from '@/models/index';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, ChannelFollowings } from '@/models/index.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['channels'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- channelId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchChannel: {
message: 'No such channel.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/channels/update.ts b/packages/backend/src/server/api/endpoints/channels/update.ts
index 1f7108a1cb..2f2b4aeeb2 100644
--- a/packages/backend/src/server/api/endpoints/channels/update.ts
+++ b/packages/backend/src/server/api/endpoints/channels/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, DriveFiles } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['channels'],
@@ -11,24 +9,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- channelId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.optional.str.range(1, 128),
- },
-
- description: {
- validator: $.nullable.optional.str.range(1, 2048),
- },
-
- bannerId: {
- validator: $.nullable.optional.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -56,8 +36,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 128 },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ bannerId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts
index f7eadc7089..97f7885dbe 100644
--- a/packages/backend/src/server/api/endpoints/charts/active-users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { activeUsersChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(activeUsersChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(activeUsersChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await activeUsersChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await activeUsersChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/ap-request.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
new file mode 100644
index 0000000000..4477bfc987
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
@@ -0,0 +1,24 @@
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { apRequestChart } from '@/services/chart/index.js';
+
+export const meta = {
+ tags: ['charts'],
+
+ res: getJsonSchema(apRequestChart.schema),
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ },
+ required: ['span'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps) => {
+ return await apRequestChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
+});
diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts
index 364279da95..fd6033392f 100644
--- a/packages/backend/src/server/api/endpoints/charts/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/drive.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { driveChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { driveChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'drive'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(driveChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(driveChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await driveChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await driveChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts
index 6feb82b6d9..f842f574ec 100644
--- a/packages/backend/src/server/api/endpoints/charts/federation.ts
+++ b/packages/backend/src/server/api/endpoints/charts/federation.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { federationChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { federationChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(federationChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(federationChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await federationChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await federationChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
index 99dc77998e..01407defdd 100644
--- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts
+++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
@@ -1,35 +1,25 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { hashtagChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { hashtagChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'hashtags'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(hashtagChart.schema),
+} as const;
- tag: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ tag: { type: 'string' },
},
-
- res: convertLog(hashtagChart.schema),
+ required: ['span', 'tag'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.tag);
+export default define(meta, paramDef, async (ps) => {
+ return await hashtagChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.tag);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts
index 23e6fbf2b0..2d12951c6c 100644
--- a/packages/backend/src/server/api/endpoints/charts/instance.ts
+++ b/packages/backend/src/server/api/endpoints/charts/instance.ts
@@ -1,35 +1,25 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { instanceChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { instanceChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(instanceChart.schema),
+} as const;
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ host: { type: 'string' },
},
-
- res: convertLog(instanceChart.schema),
+ required: ['span', 'host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await instanceChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.host);
+export default define(meta, paramDef, async (ps) => {
+ return await instanceChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.host);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/network.ts b/packages/backend/src/server/api/endpoints/charts/network.ts
deleted file mode 100644
index c5a39bbd76..0000000000
--- a/packages/backend/src/server/api/endpoints/charts/network.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { networkChart } from '@/services/chart/index';
-
-export const meta = {
- tags: ['charts'],
-
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
- },
-
- res: convertLog(networkChart.schema),
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
-});
diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts
index dcbd80c3e9..b6089f67ef 100644
--- a/packages/backend/src/server/api/endpoints/charts/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/notes.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { notesChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { notesChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'notes'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(notesChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(notesChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await notesChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await notesChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
index 94787b4a57..e5db7131a8 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserDriveChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserDriveChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'drive', 'users'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserDriveChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserDriveChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserDriveChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts
index effe0c54b9..9b72de745d 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/following.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserFollowingChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserFollowingChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users', 'following'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserFollowingChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserFollowingChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserFollowingChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
index df68a5fe52..7cc6cbf316 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserNotesChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserNotesChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users', 'notes'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserNotesChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserNotesChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserNotesChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
index dcd067305f..5c58a7f152 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserReactionsChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserReactionsChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users', 'reactions'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserReactionsChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserReactionsChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserReactionsChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts
index d32e14ad61..49c762b2e4 100644
--- a/packages/backend/src/server/api/endpoints/charts/users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/users.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { usersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { usersChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(usersChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(usersChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await usersChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await usersChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/clips/add-note.ts b/packages/backend/src/server/api/endpoints/clips/add-note.ts
index 4a740b6cfe..c630302b98 100644
--- a/packages/backend/src/server/api/endpoints/clips/add-note.ts
+++ b/packages/backend/src/server/api/endpoints/clips/add-note.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ClipNotes, Clips } from '@/models/index';
-import { ApiError } from '../../error';
-import { genId } from '@/misc/gen-id';
-import { getNote } from '../../common/getters';
+import define from '../../define.js';
+import { ClipNotes, Clips } from '@/models/index.js';
+import { ApiError } from '../../error.js';
+import { genId } from '@/misc/gen-id.js';
+import { getNote } from '../../common/getters.js';
export const meta = {
tags: ['account', 'notes', 'clips'],
@@ -13,16 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
-
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -44,8 +32,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId', 'noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.findOne({
id: ps.clipId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/clips/create.ts b/packages/backend/src/server/api/endpoints/clips/create.ts
index 852e66c9e4..531847d15c 100644
--- a/packages/backend/src/server/api/endpoints/clips/create.ts
+++ b/packages/backend/src/server/api/endpoints/clips/create.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { genId } from '@/misc/gen-id';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { genId } from '@/misc/gen-id.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips'],
@@ -10,20 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
-
- isPublic: {
- validator: $.optional.bool,
- },
-
- description: {
- validator: $.optional.nullable.str.range(1, 2048),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -31,8 +16,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ isPublic: { type: 'boolean' },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/clips/delete.ts b/packages/backend/src/server/api/endpoints/clips/delete.ts
index 85c64a115d..675db1d57f 100644
--- a/packages/backend/src/server/api/endpoints/clips/delete.ts
+++ b/packages/backend/src/server/api/endpoints/clips/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.findOne({
id: ps.clipId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/clips/list.ts b/packages/backend/src/server/api/endpoints/clips/list.ts
index d88897d164..1c955d64fc 100644
--- a/packages/backend/src/server/api/endpoints/clips/list.ts
+++ b/packages/backend/src/server/api/endpoints/clips/list.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const clips = await Clips.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/clips/notes.ts b/packages/backend/src/server/api/endpoints/clips/notes.ts
index eeb20631c1..2627884ee1 100644
--- a/packages/backend/src/server/api/endpoints/clips/notes.ts
+++ b/packages/backend/src/server/api/endpoints/clips/notes.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ClipNotes, Clips, Notes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { ApiError } from '../../error';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { ClipNotes, Clips, Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { ApiError } from '../../error.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['account', 'notes', 'clips'],
@@ -15,25 +13,6 @@ export const meta = {
kind: 'read:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -53,8 +32,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.findOne({
id: ps.clipId,
});
@@ -74,10 +64,16 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.id IN (${ clipQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(clipQuery.getParameters());
if (user) {
@@ -87,7 +83,7 @@ export default define(meta, async (ps, user) => {
}
const notes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Notes.packMany(notes, user);
diff --git a/packages/backend/src/server/api/endpoints/clips/show.ts b/packages/backend/src/server/api/endpoints/clips/show.ts
index 0a45672019..0a3b25c94e 100644
--- a/packages/backend/src/server/api/endpoints/clips/show.ts
+++ b/packages/backend/src/server/api/endpoints/clips/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the clip
const clip = await Clips.findOne({
id: ps.clipId,
diff --git a/packages/backend/src/server/api/endpoints/clips/update.ts b/packages/backend/src/server/api/endpoints/clips/update.ts
index 795483d5b2..0ac5ccd047 100644
--- a/packages/backend/src/server/api/endpoints/clips/update.ts
+++ b/packages/backend/src/server/api/endpoints/clips/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips'],
@@ -11,24 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
-
- isPublic: {
- validator: $.optional.bool,
- },
-
- description: {
- validator: $.optional.nullable.str.range(1, 2048),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -44,8 +24,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ isPublic: { type: 'boolean' },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ },
+ required: ['clipId', 'name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the clip
const clip = await Clips.findOne({
id: ps.clipId,
diff --git a/packages/backend/src/server/api/endpoints/drive.ts b/packages/backend/src/server/api/endpoints/drive.ts
index d9ab9883ca..c599d96ca4 100644
--- a/packages/backend/src/server/api/endpoints/drive.ts
+++ b/packages/backend/src/server/api/endpoints/drive.ts
@@ -1,6 +1,6 @@
-import define from '../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { DriveFiles } from '@/models/index';
+import define from '../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive', 'account'],
@@ -25,8 +25,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const instance = await fetchMeta(true);
// Calculate drive usage
diff --git a/packages/backend/src/server/api/endpoints/drive/files.ts b/packages/backend/src/server/api/endpoints/drive/files.ts
index a5c0a626a1..40e6c16c9c 100644
--- a/packages/backend/src/server/api/endpoints/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { DriveFiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['drive'],
@@ -11,30 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- type: {
- validator: $.optional.nullable.str.match(/^[a-zA-Z\/\-*]+$/),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +20,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ type: { type: 'string', nullable: true, pattern: /^[a-zA-Z\/\-*]+$/.toString().slice(1, -1) },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId)
.andWhere('file.userId = :userId', { userId: user.id });
@@ -65,7 +51,7 @@ export default define(meta, async (ps, user) => {
}
}
- const files = await query.take(ps.limit!).getMany();
+ const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});
diff --git a/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts b/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
index 835dde8058..3c68beee17 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles, Notes } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles, Notes } from '@/models/index.js';
export const meta = {
tags: ['drive', 'notes'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -36,8 +28,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch file
const file = await DriveFiles.findOne({
id: ps.fileId,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts b/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
index a45d357ee8..7e5cb2498e 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -9,20 +8,22 @@ export const meta = {
kind: 'read:drive',
- params: {
- md5: {
- validator: $.str,
- },
- },
-
res: {
type: 'boolean',
optional: false, nullable: false,
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ md5: { type: 'string' },
+ },
+ required: ['md5'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne({
md5: ps.md5,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts
index dd65ab0611..b6a2cf7200 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts
@@ -1,12 +1,10 @@
import ms from 'ms';
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { addFile } from '@/services/drive/add-file';
-import define from '../../../define';
-import { apiLogger } from '../../../logger';
-import { ApiError } from '../../../error';
-import { DriveFiles } from '@/models/index';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { addFile } from '@/services/drive/add-file.js';
+import define from '../../../define.js';
+import { apiLogger } from '../../../logger.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles } from '@/models/index.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -22,35 +20,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- name: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- comment: {
- validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
- default: null,
- },
-
- isSensitive: {
- validator: $.optional.either($.bool, $.str),
- default: false,
- transform: (v: any): boolean => v === true || v === 'true',
- },
-
- force: {
- validator: $.optional.either($.bool, $.str),
- default: false,
- transform: (v: any): boolean => v === true || v === 'true',
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -66,8 +35,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ name: { type: 'string', nullable: true, default: null },
+ comment: { type: 'string', nullable: true, maxLength: DB_MAX_IMAGE_COMMENT_LENGTH, default: null },
+ isSensitive: { type: 'boolean', default: false },
+ force: { type: 'boolean', default: false },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, _, file, cleanup) => {
+// @ts-ignore
+export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
// Get 'name' parameter
let name = ps.name || file.originalname;
if (name !== undefined && name !== null) {
@@ -88,7 +70,9 @@ export default define(meta, async (ps, user, _, file, cleanup) => {
const driveFile = await addFile({ user, path: file.path, name, comment: ps.comment, folderId: ps.folderId, force: ps.force, sensitive: ps.isSensitive });
return await DriveFiles.pack(driveFile, { self: true });
} catch (e) {
- apiLogger.error(e);
+ if (e instanceof Error || typeof e === 'string') {
+ apiLogger.error(e);
+ }
throw new ApiError();
} finally {
cleanup!();
diff --git a/packages/backend/src/server/api/endpoints/drive/files/delete.ts b/packages/backend/src/server/api/endpoints/drive/files/delete.ts
index 308beb58a4..5f565a63fb 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/delete.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { deleteFile } from '@/services/drive/delete-file';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles } from '@/models/index';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts b/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
index dc74dcb7e6..e45ec633d3 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -9,12 +8,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- md5: {
- validator: $.str,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -26,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ md5: { type: 'string' },
+ },
+ required: ['md5'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = await DriveFiles.find({
md5: ps.md5,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/find.ts b/packages/backend/src/server/api/endpoints/drive/files/find.ts
index 2244df13cd..974fc9fbad 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/find.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/find.ts
@@ -1,7 +1,5 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
@@ -10,17 +8,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- name: {
- validator: $.str,
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = await DriveFiles.find({
name: ps.name,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/show.ts b/packages/backend/src/server/api/endpoints/drive/files/show.ts
index 18b17c4653..181365c7e6 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/show.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/show.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- fileId: {
- validator: $.optional.type(ID),
- },
-
- url: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -49,8 +37,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ url: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let file: DriveFile | undefined;
if (ps.fileId) {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/update.ts b/packages/backend/src/server/api/endpoints/drive/files/update.ts
index b7ca80e83c..ab8e4aeeb2 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/update.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles, DriveFolders } from '@/models/index';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles, DriveFolders } from '@/models/index.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -13,33 +11,13 @@ export const meta = {
kind: 'write:drive',
- params: {
- fileId: {
- validator: $.type(ID),
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: undefined as any,
- },
-
- name: {
- validator: $.optional.str.pipe(DriveFiles.validateFileName),
- default: undefined as any,
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: undefined as any,
- },
-
- comment: {
- validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
- default: undefined as any,
+ errors: {
+ invalidFileName: {
+ message: 'Invalid file name.',
+ code: 'INVALID_FILE_NAME',
+ id: '395e7156-f9f0-475e-af89-53c3c23080c2',
},
- },
- errors: {
noSuchFile: {
message: 'No such file.',
code: 'NO_SUCH_FILE',
@@ -66,8 +44,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true },
+ name: { type: 'string' },
+ isSensitive: { type: 'boolean' },
+ comment: { type: 'string', nullable: true, maxLength: 512 },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) {
@@ -79,6 +69,9 @@ export default define(meta, async (ps, user) => {
}
if (ps.name) file.name = ps.name;
+ if (!DriveFiles.validateFileName(file.name)) {
+ throw new ApiError(meta.errors.invalidFileName);
+ }
if (ps.comment !== undefined) file.comment = ps.comment;
diff --git a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
index 40da1a4fb4..3bfecac802 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import { uploadFromUrl } from '@/services/drive/upload-from-url';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
-import { publishMainStream } from '@/services/stream';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { publishMainStream } from '@/services/stream.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -18,42 +16,23 @@ export const meta = {
requireCredential: true,
kind: 'write:drive',
+} as const;
- params: {
- url: {
- // TODO: Validate this url
- validator: $.str,
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: false,
- },
-
- comment: {
- validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
- default: null,
- },
-
- marker: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- force: {
- validator: $.optional.bool,
- default: false,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ url: { type: 'string' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ isSensitive: { type: 'boolean', default: false },
+ comment: { type: 'string', nullable: true, maxLength: 512, default: null },
+ marker: { type: 'string', nullable: true, default: null },
+ force: { type: 'boolean', default: false },
},
+ required: ['url'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
uploadFromUrl({ url: ps.url, user, folderId: ps.folderId, sensitive: ps.isSensitive, force: ps.force, comment: ps.comment }).then(file => {
DriveFiles.pack(file, { self: true }).then(packedFile => {
publishMainStream(user.id, 'urlUploadFinished', {
diff --git a/packages/backend/src/server/api/endpoints/drive/folders.ts b/packages/backend/src/server/api/endpoints/drive/folders.ts
index 8f8d1d2c0a..d4d530ba9e 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { DriveFolders } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { DriveFolders } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['drive'],
@@ -11,26 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,8 +20,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFolders.createQueryBuilder('folder'), ps.sinceId, ps.untilId)
.andWhere('folder.userId = :userId', { userId: user.id });
@@ -53,7 +42,7 @@ export default define(meta, async (ps, user) => {
query.andWhere('folder.parentId IS NULL');
}
- const folders = await query.take(ps.limit!).getMany();
+ const folders = await query.take(ps.limit).getMany();
return await Promise.all(folders.map(folder => DriveFolders.pack(folder)));
});
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/create.ts b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
index 38ed17e0e5..4ae10f0621 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFolders } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['drive'],
@@ -13,17 +11,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- name: {
- validator: $.optional.str.pipe(DriveFolders.validateFolderName),
- default: 'Untitled',
- },
-
- parentId: {
- validator: $.optional.nullable.type(ID),
- },
- },
-
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -39,8 +26,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', default: "Untitled", maxLength: 200 },
+ parentId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// If the parent folder is specified
let parent = null;
if (ps.parentId) {
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/delete.ts b/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
index 13716fccea..4994615cc6 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { publishDriveStream } from '@/services/stream';
-import { ApiError } from '../../../error';
-import { DriveFolders, DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { publishDriveStream } from '@/services/stream.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders, DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- folderId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['folderId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get folder
const folder = await DriveFolders.findOne({
id: ps.folderId,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/find.ts b/packages/backend/src/server/api/endpoints/drive/folders/find.ts
index 911f51d78b..9bf0e3d61b 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/find.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/find.ts
@@ -1,7 +1,5 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { DriveFolders } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFolders } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -10,17 +8,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- name: {
- validator: $.str,
- },
-
- parentId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ parentId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const folders = await DriveFolders.find({
name: ps.name,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/show.ts b/packages/backend/src/server/api/endpoints/drive/folders/show.ts
index 58a6dd3c06..f09816d57a 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/show.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFolders } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- folderId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['folderId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get folder
const folder = await DriveFolders.findOne({
id: ps.folderId,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/update.ts b/packages/backend/src/server/api/endpoints/drive/folders/update.ts
index 5b0cccd1c6..c020b243ef 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFolders } from '@/models/index';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -12,20 +10,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- folderId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.optional.str.pipe(DriveFolders.validateFolderName),
- },
-
- parentId: {
- validator: $.optional.nullable.type(ID),
- },
- },
-
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -53,8 +37,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', maxLength: 200 },
+ parentId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: ['folderId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch folder
const folder = await DriveFolders.findOne({
id: ps.folderId,
diff --git a/packages/backend/src/server/api/endpoints/drive/stream.ts b/packages/backend/src/server/api/endpoints/drive/stream.ts
index 9ba7804946..99e8d024fb 100644
--- a/packages/backend/src/server/api/endpoints/drive/stream.ts
+++ b/packages/backend/src/server/api/endpoints/drive/stream.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { DriveFiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['drive'],
@@ -11,25 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- type: {
- validator: $.optional.str.match(/^[a-zA-Z\/\-*]+$/),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -41,8 +20,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ type: { type: 'string', pattern: /^[a-zA-Z\/\-*]+$/.toString().slice(1, -1) },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId)
.andWhere('file.userId = :userId', { userId: user.id });
@@ -54,7 +44,7 @@ export default define(meta, async (ps, user) => {
}
}
- const files = await query.take(ps.limit!).getMany();
+ const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});
diff --git a/packages/backend/src/server/api/endpoints/email-address/available.ts b/packages/backend/src/server/api/endpoints/email-address/available.ts
index 19f9b7ccdc..07064ce9fa 100644
--- a/packages/backend/src/server/api/endpoints/email-address/available.ts
+++ b/packages/backend/src/server/api/endpoints/email-address/available.ts
@@ -1,18 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { validateEmailForAccount } from '@/services/validate-email-for-account';
+import define from '../../define.js';
+import { validateEmailForAccount } from '@/services/validate-email-for-account.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- emailAddress: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -29,7 +22,15 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ emailAddress: { type: 'string' },
+ },
+ required: ['emailAddress'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
return await validateEmailForAccount(ps.emailAddress);
});
diff --git a/packages/backend/src/server/api/endpoints/endpoint.ts b/packages/backend/src/server/api/endpoints/endpoint.ts
index 42fd468838..9db140183c 100644
--- a/packages/backend/src/server/api/endpoints/endpoint.ts
+++ b/packages/backend/src/server/api/endpoints/endpoint.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../define';
-import endpoints from '../endpoints';
+import define from '../define.js';
+import endpoints from '../endpoints.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
+} as const;
- params: {
- endpoint: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
},
+ required: ['endpoint'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const ep = endpoints.find(x => x.name === ps.endpoint);
if (ep == null) return null;
return {
diff --git a/packages/backend/src/server/api/endpoints/endpoints.ts b/packages/backend/src/server/api/endpoints/endpoints.ts
index ebb78de337..b20da96eb3 100644
--- a/packages/backend/src/server/api/endpoints/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints/endpoints.ts
@@ -1,14 +1,11 @@
-import define from '../define';
-import endpoints from '../endpoints';
+import define from '../define.js';
+import endpoints from '../endpoints.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -25,7 +22,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
return endpoints.map(x => x.name);
});
diff --git a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
index 24c9f56aa6..bc8d2e2ac0 100644
--- a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
+++ b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../define';
-import { createExportCustomEmojisJob } from '@/queue/index';
+import define from '../define.js';
+import { createExportCustomEmojisJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -12,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportCustomEmojisJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/federation/followers.ts b/packages/backend/src/server/api/endpoints/federation/followers.ts
index c0a85f166c..7b1197d1e5 100644
--- a/packages/backend/src/server/api/endpoints/federation/followers.ts
+++ b/packages/backend/src/server/api/endpoints/federation/followers.ts
@@ -1,33 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Followings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Followings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -39,13 +18,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['host'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
.andWhere(`following.followeeHost = :host`, { host: ps.host });
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/packages/backend/src/server/api/endpoints/federation/following.ts b/packages/backend/src/server/api/endpoints/federation/following.ts
index 147f0aedb2..ed1f142d88 100644
--- a/packages/backend/src/server/api/endpoints/federation/following.ts
+++ b/packages/backend/src/server/api/endpoints/federation/following.ts
@@ -1,33 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Followings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Followings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -39,13 +18,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['host'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
.andWhere(`following.followerHost = :host`, { host: ps.host });
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/packages/backend/src/server/api/endpoints/federation/instances.ts b/packages/backend/src/server/api/endpoints/federation/instances.ts
index 11df7ed6b6..70fef051ba 100644
--- a/packages/backend/src/server/api/endpoints/federation/instances.ts
+++ b/packages/backend/src/server/api/endpoints/federation/instances.ts
@@ -1,58 +1,13 @@
-import $ from 'cafy';
-import config from '@/config/index';
-import define from '../../define';
-import { Instances } from '@/models/index';
-import { fetchMeta } from '@/misc/fetch-meta';
+import config from '@/config/index.js';
+import define from '../../define.js';
+import { Instances } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.optional.nullable.str,
- },
-
- blocked: {
- validator: $.optional.nullable.bool,
- },
-
- notResponding: {
- validator: $.optional.nullable.bool,
- },
-
- suspended: {
- validator: $.optional.nullable.bool,
- },
-
- federating: {
- validator: $.optional.nullable.bool,
- },
-
- subscribing: {
- validator: $.optional.nullable.bool,
- },
-
- publishing: {
- validator: $.optional.nullable.bool,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -64,8 +19,25 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string', nullable: true },
+ blocked: { type: 'boolean', nullable: true },
+ notResponding: { type: 'boolean', nullable: true },
+ suspended: { type: 'boolean', nullable: true },
+ federating: { type: 'boolean', nullable: true },
+ subscribing: { type: 'boolean', nullable: true },
+ publishing: { type: 'boolean', nullable: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Instances.createQueryBuilder('instance');
switch (ps.sort) {
@@ -144,7 +116,7 @@ export default define(meta, async (ps, me) => {
query.andWhere('instance.host like :host', { host: '%' + ps.host.toLowerCase() + '%' });
}
- const instances = await query.take(ps.limit!).skip(ps.offset).getMany();
+ const instances = await query.take(ps.limit).skip(ps.offset).getMany();
- return instances;
+ return await Instances.packMany(instances);
});
diff --git a/packages/backend/src/server/api/endpoints/federation/show-instance.ts b/packages/backend/src/server/api/endpoints/federation/show-instance.ts
index 6f13b28cae..5bfe43fc9c 100644
--- a/packages/backend/src/server/api/endpoints/federation/show-instance.ts
+++ b/packages/backend/src/server/api/endpoints/federation/show-instance.ts
@@ -1,30 +1,34 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Instances } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
+import define from '../../define.js';
+import { Instances } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
+ res: {
+ oneOf: [{
+ type: 'object',
+ ref: 'FederationInstance',
+ }, {
+ type: 'null',
+ }],
},
+} as const;
- res: {
- type: 'object',
- optional: true, nullable: false,
- ref: 'FederationInstance',
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await Instances
.findOne({ host: toPuny(ps.host) });
- return instance;
+ return instance ? await Instances.pack(instance) : null;
});
diff --git a/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts b/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
index 092f805bc2..409cc7695e 100644
--- a/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
+++ b/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getRemoteUser } from '../../common/getters';
-import { updatePerson } from '@/remote/activitypub/models/person';
+import define from '../../define.js';
+import { getRemoteUser } from '../../common/getters.js';
+import { updatePerson } from '@/remote/activitypub/models/person.js';
export const meta = {
tags: ['federation'],
requireCredential: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await getRemoteUser(ps.userId);
await updatePerson(user.uri!);
});
diff --git a/packages/backend/src/server/api/endpoints/federation/users.ts b/packages/backend/src/server/api/endpoints/federation/users.ts
index 9a8f749936..65ad9f88d3 100644
--- a/packages/backend/src/server/api/endpoints/federation/users.ts
+++ b/packages/backend/src/server/api/endpoints/federation/users.ts
@@ -1,33 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -39,13 +18,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['host'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Users.createQueryBuilder('user'), ps.sinceId, ps.untilId)
.andWhere(`user.host = :host`, { host: ps.host });
const users = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Users.packMany(users, me, { detail: true });
diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts
index 96aede4550..8758a64a39 100644
--- a/packages/backend/src/server/api/endpoints/following/create.ts
+++ b/packages/backend/src/server/api/endpoints/following/create.ts
@@ -1,11 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import create from '@/services/following/create';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Followings, Users } from '@/models/index';
+import create from '@/services/following/create.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Followings, Users } from '@/models/index.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export const meta = {
tags: ['following', 'users'],
@@ -19,12 +18,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -64,8 +57,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const follower = user;
// 自分自身
@@ -92,8 +93,10 @@ export default define(meta, async (ps, user) => {
try {
await create(follower, followee);
} catch (e) {
- if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking);
- if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked);
+ if (e instanceof IdentifiableError) {
+ if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking);
+ if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked);
+ }
throw e;
}
diff --git a/packages/backend/src/server/api/endpoints/following/delete.ts b/packages/backend/src/server/api/endpoints/following/delete.ts
index 4cd0c49452..47efc59b81 100644
--- a/packages/backend/src/server/api/endpoints/following/delete.ts
+++ b/packages/backend/src/server/api/endpoints/following/delete.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import deleteFollowing from '@/services/following/delete';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Followings, Users } from '@/models/index';
+import deleteFollowing from '@/services/following/delete.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Followings, Users } from '@/models/index.js';
export const meta = {
tags: ['following', 'users'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const follower = user;
// Check if the followee is yourself
diff --git a/packages/backend/src/server/api/endpoints/following/invalidate.ts b/packages/backend/src/server/api/endpoints/following/invalidate.ts
index 92e887e00b..24d8256ca6 100644
--- a/packages/backend/src/server/api/endpoints/following/invalidate.ts
+++ b/packages/backend/src/server/api/endpoints/following/invalidate.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import * as ms from 'ms';
-import deleteFollowing from '@/services/following/delete';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Followings, Users } from '@/models/index';
+import ms from 'ms';
+import deleteFollowing from '@/services/following/delete.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Followings, Users } from '@/models/index.js';
export const meta = {
tags: ['following', 'users'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const followee = user;
// Check if the follower is yourself
diff --git a/packages/backend/src/server/api/endpoints/following/requests/accept.ts b/packages/backend/src/server/api/endpoints/following/requests/accept.ts
index 7e7c056f55..e5df55375e 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/accept.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/accept.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import acceptFollowRequest from '@/services/following/requests/accept';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
+import acceptFollowRequest from '@/services/following/requests/accept.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
export const meta = {
tags: ['following', 'account'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch follower
const follower = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
index 19ed02c152..80d37fb075 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
@@ -1,10 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import cancelFollowRequest from '@/services/following/requests/cancel';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { Users } from '@/models/index';
+import cancelFollowRequest from '@/services/following/requests/cancel.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { Users } from '@/models/index.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export const meta = {
tags: ['following', 'account'],
@@ -13,12 +12,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -40,8 +33,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch followee
const followee = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
@@ -51,7 +52,9 @@ export default define(meta, async (ps, user) => {
try {
await cancelFollowRequest(followee, user);
} catch (e) {
- if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound);
+ if (e instanceof IdentifiableError) {
+ if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound);
+ }
throw e;
}
diff --git a/packages/backend/src/server/api/endpoints/following/requests/list.ts b/packages/backend/src/server/api/endpoints/following/requests/list.ts
index ec0c76502c..3b60b89b3c 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/list.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { FollowRequests } from '@/models/index';
+import define from '../../../define.js';
+import { FollowRequests } from '@/models/index.js';
export const meta = {
tags: ['following', 'account'],
@@ -35,8 +35,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const reqs = await FollowRequests.find({
followeeId: user.id,
});
diff --git a/packages/backend/src/server/api/endpoints/following/requests/reject.ts b/packages/backend/src/server/api/endpoints/following/requests/reject.ts
index a5ce1e7c77..cebe604284 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/reject.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/reject.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { rejectFollowRequest } from '@/services/following/reject';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
+import { rejectFollowRequest } from '@/services/following/reject.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
export const meta = {
tags: ['following', 'account'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch follower
const follower = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/endpoints/gallery/featured.ts b/packages/backend/src/server/api/endpoints/gallery/featured.ts
index ff7c16889f..e6acd36911 100644
--- a/packages/backend/src/server/api/endpoints/gallery/featured.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { GalleryPosts } from '@/models/index';
+import define from '../../define.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = GalleryPosts.createQueryBuilder('post')
.andWhere('post.createdAt > :date', { date: new Date(Date.now() - (1000 * 60 * 60 * 24 * 3)) })
.andWhere('post.likedCount > 0')
diff --git a/packages/backend/src/server/api/endpoints/gallery/popular.ts b/packages/backend/src/server/api/endpoints/gallery/popular.ts
index 2c3368a19d..c4c8982fcc 100644
--- a/packages/backend/src/server/api/endpoints/gallery/popular.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/popular.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { GalleryPosts } from '@/models/index';
+import define from '../../define.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = GalleryPosts.createQueryBuilder('post')
.andWhere('post.likedCount > 0')
.orderBy('post.likedCount', 'DESC');
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts.ts b/packages/backend/src/server/api/endpoints/gallery/posts.ts
index 9d2601c7e9..428ba9cc71 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts.ts
@@ -1,27 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { GalleryPosts } from '@/models/index';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -33,12 +16,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(GalleryPosts.createQueryBuilder('post'), ps.sinceId, ps.untilId)
.innerJoinAndSelect('post.user', 'user');
- const posts = await query.take(ps.limit!).getMany();
+ const posts = await query.take(ps.limit).getMany();
return await GalleryPosts.packMany(posts, me);
});
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
index e9d5df1ab6..eb6c0f3eb1 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
-import { DriveFiles, GalleryPosts } from '@/models/index';
-import { genId } from '../../../../../misc/gen-id';
-import { GalleryPost } from '@/models/entities/gallery-post';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
+import define from '../../../define.js';
+import { DriveFiles, GalleryPosts } from '@/models/index.js';
+import { genId } from '../../../../../misc/gen-id.js';
+import { GalleryPost } from '@/models/entities/gallery-post.js';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
export const meta = {
tags: ['gallery'],
@@ -20,25 +18,6 @@ export const meta = {
max: 300,
},
- params: {
- title: {
- validator: $.str.min(1),
- },
-
- description: {
- validator: $.optional.nullable.str,
- },
-
- fileIds: {
- validator: $.arr($.type(ID)).unique().range(1, 32),
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -50,8 +29,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ title: { type: 'string', minLength: 1 },
+ description: { type: 'string', nullable: true },
+ fileIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 32, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ isSensitive: { type: 'boolean', default: false },
+ },
+ required: ['title', 'fileIds'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = (await Promise.all(ps.fileIds.map(fileId =>
DriveFiles.findOne({
id: fileId,
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
index 2a13b9ed58..f8bf785ee6 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:gallery',
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const post = await GalleryPosts.findOne({
id: ps.postId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
index 0fb408fa5f..d154bfc3c6 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts, GalleryLikes } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts, GalleryLikes } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['gallery'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:gallery-likes',
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -39,8 +31,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const post = await GalleryPosts.findOne(ps.postId);
if (post == null) {
throw new ApiError(meta.errors.noSuchPost);
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
index 4325d2ad37..5b4594070c 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
@@ -1,20 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
requireCredential: false,
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -30,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const post = await GalleryPosts.findOne({
id: ps.postId,
});
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
index 9cca09bddc..b00008a864 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts, GalleryLikes } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts, GalleryLikes } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:gallery-likes',
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const post = await GalleryPosts.findOne(ps.postId);
if (post == null) {
throw new ApiError(meta.errors.noSuchPost);
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
index c35e1bbf58..123794d08c 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
-import { DriveFiles, GalleryPosts } from '@/models/index';
-import { GalleryPost } from '@/models/entities/gallery-post';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
+import define from '../../../define.js';
+import { DriveFiles, GalleryPosts } from '@/models/index.js';
+import { GalleryPost } from '@/models/entities/gallery-post.js';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
export const meta = {
tags: ['gallery'],
@@ -19,29 +17,6 @@ export const meta = {
max: 300,
},
- params: {
- postId: {
- validator: $.type(ID),
- },
-
- title: {
- validator: $.str.min(1),
- },
-
- description: {
- validator: $.optional.nullable.str,
- },
-
- fileIds: {
- validator: $.arr($.type(ID)).unique().range(1, 32),
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -53,8 +28,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ title: { type: 'string', minLength: 1 },
+ description: { type: 'string', nullable: true },
+ fileIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 32, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ isSensitive: { type: 'boolean', default: false },
+ },
+ required: ['postId', 'title', 'fileIds'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = (await Promise.all(ps.fileIds.map(fileId =>
DriveFiles.findOne({
id: fileId,
diff --git a/packages/backend/src/server/api/endpoints/get-online-users-count.ts b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
index 5b13d5a3b8..80a2334cfa 100644
--- a/packages/backend/src/server/api/endpoints/get-online-users-count.ts
+++ b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
@@ -1,19 +1,22 @@
-import { USER_ONLINE_THRESHOLD } from '@/const';
-import { Users } from '@/models/index';
+import { USER_ONLINE_THRESHOLD } from '@/const.js';
+import { Users } from '@/models/index.js';
import { MoreThan } from 'typeorm';
-import define from '../define';
+import define from '../define.js';
export const meta = {
tags: ['meta'],
requireCredential: false,
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const count = await Users.count({
lastActiveDate: MoreThan(new Date(Date.now() - USER_ONLINE_THRESHOLD)),
});
diff --git a/packages/backend/src/server/api/endpoints/hashtags/list.ts b/packages/backend/src/server/api/endpoints/hashtags/list.ts
index 9fa9b3edc6..50e36386cf 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/list.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/list.ts
@@ -1,51 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Hashtags } from '@/models/index';
+import define from '../../define.js';
+import { Hashtags } from '@/models/index.js';
export const meta = {
tags: ['hashtags'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- attachedToUserOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- attachedToLocalUserOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- attachedToRemoteUserOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- sort: {
- validator: $.str.or([
- '+mentionedUsers',
- '-mentionedUsers',
- '+mentionedLocalUsers',
- '-mentionedLocalUsers',
- '+mentionedRemoteUsers',
- '-mentionedRemoteUsers',
- '+attachedUsers',
- '-attachedUsers',
- '+attachedLocalUsers',
- '-attachedLocalUsers',
- '+attachedRemoteUsers',
- '-attachedRemoteUsers',
- ]),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -57,8 +17,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ attachedToUserOnly: { type: 'boolean', default: false },
+ attachedToLocalUserOnly: { type: 'boolean', default: false },
+ attachedToRemoteUserOnly: { type: 'boolean', default: false },
+ sort: { type: 'string', enum: ['+mentionedUsers', '-mentionedUsers', '+mentionedLocalUsers', '-mentionedLocalUsers', '+mentionedRemoteUsers', '-mentionedRemoteUsers', '+attachedUsers', '-attachedUsers', '+attachedLocalUsers', '-attachedLocalUsers', '+attachedRemoteUsers', '-attachedRemoteUsers'] },
+ },
+ required: ['sort'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Hashtags.createQueryBuilder('tag');
if (ps.attachedToUserOnly) query.andWhere('tag.attachedUsersCount != 0');
@@ -90,7 +62,7 @@ export default define(meta, async (ps, me) => {
'tag.attachedRemoteUsersCount',
]);
- const tags = await query.take(ps.limit!).getMany();
+ const tags = await query.take(ps.limit).getMany();
return Hashtags.packMany(tags);
});
diff --git a/packages/backend/src/server/api/endpoints/hashtags/search.ts b/packages/backend/src/server/api/endpoints/hashtags/search.ts
index 0d646c64f5..c289844775 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/search.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/search.ts
@@ -1,28 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Hashtags } from '@/models/index';
+import define from '../../define.js';
+import { Hashtags } from '@/models/index.js';
export const meta = {
tags: ['hashtags'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- query: {
- validator: $.str,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -33,13 +16,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ query: { type: 'string' },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: ['query'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const hashtags = await Hashtags.createQueryBuilder('tag')
.where('tag.name like :q', { q: ps.query.toLowerCase() + '%' })
.orderBy('tag.count', 'DESC')
.groupBy('tag.id')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany();
diff --git a/packages/backend/src/server/api/endpoints/hashtags/show.ts b/packages/backend/src/server/api/endpoints/hashtags/show.ts
index 242cef99d4..6e6afa4f13 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/show.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/show.ts
@@ -1,20 +1,13 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Hashtags } from '@/models/index';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Hashtags } from '@/models/index.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
export const meta = {
tags: ['hashtags'],
requireCredential: false,
- params: {
- tag: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -30,8 +23,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tag: { type: 'string' },
+ },
+ required: ['tag'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const hashtag = await Hashtags.findOne({ name: normalizeForSearch(ps.tag) });
if (hashtag == null) {
throw new ApiError(meta.errors.noSuchHashtag);
diff --git a/packages/backend/src/server/api/endpoints/hashtags/trend.ts b/packages/backend/src/server/api/endpoints/hashtags/trend.ts
index be964ad639..9cdbc8941c 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/trend.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/trend.ts
@@ -1,10 +1,10 @@
import { Brackets } from 'typeorm';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { safeForSql } from '@/misc/safe-for-sql';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { safeForSql } from '@/misc/safe-for-sql.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
/*
トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
@@ -53,8 +53,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const instance = await fetchMeta(true);
const hiddenTags = instance.hiddenTags.map(t => normalizeForSearch(t));
diff --git a/packages/backend/src/server/api/endpoints/hashtags/users.ts b/packages/backend/src/server/api/endpoints/hashtags/users.ts
index 2158dc4349..a5df21a7e3 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/users.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/users.ts
@@ -1,52 +1,12 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
export const meta = {
requireCredential: false,
tags: ['hashtags', 'users'],
- params: {
- tag: {
- validator: $.str,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sort: {
- validator: $.str.or([
- '+follower',
- '-follower',
- '+createdAt',
- '-createdAt',
- '+updatedAt',
- '-updatedAt',
- ]),
- },
-
- state: {
- validator: $.optional.str.or([
- 'all',
- 'alive',
- ]),
- default: 'all',
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -58,8 +18,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tag: { type: 'string' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
+ state: { type: 'string', enum: ['all', 'alive'], default: "all" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ },
+ required: ['tag', 'sort'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user')
.where(':tag = ANY(user.tags)', { tag: normalizeForSearch(ps.tag) });
@@ -84,7 +56,7 @@ export default define(meta, async (ps, me) => {
case '-updatedAt': query.orderBy('user.updatedAt', 'ASC'); break;
}
- const users = await query.take(ps.limit!).getMany();
+ const users = await query.take(ps.limit).getMany();
return await Users.packMany(users, me, { detail: true });
});
diff --git a/packages/backend/src/server/api/endpoints/i.ts b/packages/backend/src/server/api/endpoints/i.ts
index d69c118cfc..5b1ad2b098 100644
--- a/packages/backend/src/server/api/endpoints/i.ts
+++ b/packages/backend/src/server/api/endpoints/i.ts
@@ -1,13 +1,11 @@
-import define from '../define';
-import { Users } from '@/models/index';
+import define from '../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['account'],
requireCredential: true,
- params: {},
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -15,8 +13,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, token) => {
+export default define(meta, paramDef, async (ps, user, token) => {
const isSecure = token == null;
// ここで渡ってきている user はキャッシュされていて古い可能性もあるので id だけ渡す
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/done.ts b/packages/backend/src/server/api/endpoints/i/2fa/done.ts
index 4853908693..70478430db 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/done.ts
@@ -1,22 +1,23 @@
-import $ from 'cafy';
import * as speakeasy from 'speakeasy';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- token: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
},
+ required: ['token'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const token = ps.token.replace(/\s/g, '');
const profile = await UserProfiles.findOneOrFail(user.id);
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
index 26e9a60886..f33237c8bf 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
@@ -1,48 +1,40 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import { promisify } from 'util';
+import bcrypt from 'bcryptjs';
+import { promisify } from 'node:util';
import * as cbor from 'cbor';
-import define from '../../../define';
+import define from '../../../define.js';
import {
UserProfiles,
UserSecurityKeys,
AttestationChallenges,
Users,
-} from '@/models/index';
-import config from '@/config/index';
-import { procedures, hash } from '../../../2fa';
-import { publishMainStream } from '@/services/stream';
+} from '@/models/index.js';
+import config from '@/config/index.js';
+import { procedures, hash } from '../../../2fa.js';
+import { publishMainStream } from '@/services/stream.js';
const cborDecodeFirst = promisify(cbor.decodeFirst) as any;
+const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8'));
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- clientDataJSON: {
- validator: $.str,
- },
- attestationObject: {
- validator: $.str,
- },
- password: {
- validator: $.str,
- },
- challengeId: {
- validator: $.str,
- },
- name: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clientDataJSON: { type: 'string' },
+ attestationObject: { type: 'string' },
+ password: { type: 'string' },
+ challengeId: { type: 'string' },
+ name: { type: 'string' },
},
+ required: ['clientDataJSON', 'attestationObject', 'password', 'challengeId', 'name'],
} as const;
-const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8'));
-
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
index 854848a434..4bfa24f97f 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- value: {
- validator: $.boolean,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ value: { type: 'boolean' },
},
+ required: ['value'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await UserProfiles.update(user.id, {
usePasswordLessLogin: ps.value,
});
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
index 057e54c69b..0c4c99271e 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
@@ -1,11 +1,10 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../../define';
-import { UserProfiles, AttestationChallenges } from '@/models/index';
-import { promisify } from 'util';
-import * as crypto from 'crypto';
-import { genId } from '@/misc/gen-id';
-import { hash } from '../../../2fa';
+import bcrypt from 'bcryptjs';
+import define from '../../../define.js';
+import { UserProfiles, AttestationChallenges } from '@/models/index.js';
+import { promisify } from 'node:util';
+import * as crypto from 'node:crypto';
+import { genId } from '@/misc/gen-id.js';
+import { hash } from '../../../2fa.js';
const randomBytes = promisify(crypto.randomBytes);
@@ -13,16 +12,18 @@ export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register.ts b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
index c5cfb9dfad..7951e393b8 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
@@ -1,25 +1,26 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
+import bcrypt from 'bcryptjs';
import * as speakeasy from 'speakeasy';
import * as QRCode from 'qrcode';
-import config from '@/config/index';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import config from '@/config/index.js';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
index 03e1d0434d..2b69b1f8c3 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
@@ -1,26 +1,25 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../../define';
-import { UserProfiles, UserSecurityKeys, Users } from '@/models/index';
-import { publishMainStream } from '@/services/stream';
+import bcrypt from 'bcryptjs';
+import define from '../../../define.js';
+import { UserProfiles, UserSecurityKeys, Users } from '@/models/index.js';
+import { publishMainStream } from '@/services/stream.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
- credentialId: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
+ credentialId: { type: 'string' },
},
+ required: ['password', 'credentialId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
index a19ad6810d..c5633f68b1 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
@@ -1,22 +1,23 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import bcrypt from 'bcryptjs';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/apps.ts b/packages/backend/src/server/api/endpoints/i/apps.ts
index 63999b0981..eca9558847 100644
--- a/packages/backend/src/server/api/endpoints/i/apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/apps.ts
@@ -1,26 +1,22 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens } from '@/models/index';
+import define from '../../define.js';
+import { AccessTokens } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- sort: {
- validator: $.optional.str.or([
- '+createdAt',
- '-createdAt',
- '+lastUsedAt',
- '-lastUsedAt',
- ]),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sort: { type: 'string', enum: ['+createdAt', '-createdAt', '+lastUsedAt', '-lastUsedAt'] },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = AccessTokens.createQueryBuilder('token')
.where('token.userId = :userId', { userId: user.id });
diff --git a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
index 52122b851b..3301808e75 100644
--- a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
@@ -1,38 +1,30 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens, Apps } from '@/models/index';
+import define from '../../define.js';
+import { AccessTokens, Apps } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str.or('desc|asc'),
- default: 'desc',
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string', enum: ['desc', 'asc'], default: "desc" },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get tokens
const tokens = await AccessTokens.find({
where: {
userId: user.id,
},
- take: ps.limit!,
+ take: ps.limit,
skip: ps.offset,
order: {
id: ps.sort == 'asc' ? 1 : -1,
diff --git a/packages/backend/src/server/api/endpoints/i/change-password.ts b/packages/backend/src/server/api/endpoints/i/change-password.ts
index 7b6c137737..16509d2dcf 100644
--- a/packages/backend/src/server/api/endpoints/i/change-password.ts
+++ b/packages/backend/src/server/api/endpoints/i/change-password.ts
@@ -1,26 +1,24 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../define';
-import { UserProfiles } from '@/models/index';
+import bcrypt from 'bcryptjs';
+import define from '../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- currentPassword: {
- validator: $.str,
- },
-
- newPassword: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ currentPassword: { type: 'string' },
+ newPassword: { type: 'string', minLength: 1 },
},
+ required: ['currentPassword', 'newPassword'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/delete-account.ts b/packages/backend/src/server/api/endpoints/i/delete-account.ts
index e1eee949fc..8cb6b6a631 100644
--- a/packages/backend/src/server/api/endpoints/i/delete-account.ts
+++ b/packages/backend/src/server/api/endpoints/i/delete-account.ts
@@ -1,25 +1,26 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../define';
-import { UserProfiles, Users } from '@/models/index';
-import { doPostSuspend } from '@/services/suspend-user';
-import { publishUserEvent } from '@/services/stream';
-import { createDeleteAccountJob } from '@/queue';
+import bcrypt from 'bcryptjs';
+import define from '../../define.js';
+import { UserProfiles, Users } from '@/models/index.js';
+import { doPostSuspend } from '@/services/suspend-user.js';
+import { publishUserEvent } from '@/services/stream.js';
+import { createDeleteAccountJob } from '@/queue/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
const userDetailed = await Users.findOneOrFail(user.id);
if (userDetailed.isDeleted) {
diff --git a/packages/backend/src/server/api/endpoints/i/export-blocking.ts b/packages/backend/src/server/api/endpoints/i/export-blocking.ts
index 44d8a1cb38..aed4c2e0a3 100644
--- a/packages/backend/src/server/api/endpoints/i/export-blocking.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-blocking.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportBlockingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportBlockingJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportBlockingJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-following.ts b/packages/backend/src/server/api/endpoints/i/export-following.ts
index 5d1617d57b..058d77b3c2 100644
--- a/packages/backend/src/server/api/endpoints/i/export-following.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-following.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../define';
-import { createExportFollowingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportFollowingJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -10,19 +9,18 @@ export const meta = {
duration: ms('1hour'),
max: 1,
},
- params: {
- excludeMuting: {
- validator: $.optional.bool,
- default: false,
- },
- excludeInactive: {
- validator: $.optional.bool,
- default: false,
- },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ excludeMuting: { type: 'boolean', default: false },
+ excludeInactive: { type: 'boolean', default: false },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportFollowingJob(user, ps.excludeMuting, ps.excludeInactive);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-mute.ts b/packages/backend/src/server/api/endpoints/i/export-mute.ts
index 27ce8f0b29..c0216fac0c 100644
--- a/packages/backend/src/server/api/endpoints/i/export-mute.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-mute.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportMuteJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportMuteJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportMuteJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-notes.ts b/packages/backend/src/server/api/endpoints/i/export-notes.ts
index 25b1849e80..4b85a45554 100644
--- a/packages/backend/src/server/api/endpoints/i/export-notes.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-notes.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportNotesJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportNotesJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportNotesJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-user-lists.ts b/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
index d28b699c5a..fa5c1f5e5a 100644
--- a/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportUserListsJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportUserListsJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportUserListsJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/favorites.ts b/packages/backend/src/server/api/endpoints/i/favorites.ts
index 92c767876b..3c420e4d0f 100644
--- a/packages/backend/src/server/api/endpoints/i/favorites.ts
+++ b/packages/backend/src/server/api/endpoints/i/favorites.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { NoteFavorites } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { NoteFavorites } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'notes', 'favorites'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:favorites',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,14 +20,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(NoteFavorites.createQueryBuilder('favorite'), ps.sinceId, ps.untilId)
.andWhere(`favorite.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('favorite.note', 'note');
const favorites = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await NoteFavorites.packMany(favorites, user);
diff --git a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
index f1c5763593..a38383f30e 100644
--- a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
+++ b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { GalleryLikes } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { GalleryLikes } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'gallery'],
@@ -11,47 +9,46 @@ export const meta = {
kind: 'read:gallery-likes',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
- type: 'object',
+ type: 'array',
optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- format: 'id',
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ post: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'GalleryPost',
+ },
},
- page: {
- type: 'object',
- optional: false, nullable: false,
- ref: 'GalleryPost',
- },
- },
+ }
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(GalleryLikes.createQueryBuilder('like'), ps.sinceId, ps.untilId)
.andWhere(`like.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('like.post', 'post');
const likes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await GalleryLikes.packMany(likes, user);
diff --git a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
index d46d42f633..b4edb5f73d 100644
--- a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { GalleryPosts } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { GalleryPosts } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'gallery'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:gallery',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(GalleryPosts.createQueryBuilder('post'), ps.sinceId, ps.untilId)
.andWhere(`post.userId = :meId`, { meId: user.id });
const posts = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await GalleryPosts.packMany(posts, user);
diff --git a/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts b/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
index 4e1a4d3db9..bc3e0aff47 100644
--- a/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
+++ b/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { MutedNotes } from '@/models/index';
+import define from '../../define.js';
+import { MutedNotes } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -8,9 +8,6 @@ export const meta = {
kind: 'read:account',
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -23,8 +20,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
return {
count: await MutedNotes.count({
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/i/import-blocking.ts b/packages/backend/src/server/api/endpoints/i/import-blocking.ts
index acc5797420..c70704f9a8 100644
--- a/packages/backend/src/server/api/endpoints/i/import-blocking.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-blocking.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportBlockingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportBlockingJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -15,12 +13,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -48,8 +40,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/import-following.ts b/packages/backend/src/server/api/endpoints/i/import-following.ts
index 35006746fb..7e9175cbf8 100644
--- a/packages/backend/src/server/api/endpoints/i/import-following.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-following.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportFollowingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportFollowingJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -14,12 +12,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -47,8 +39,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/import-muting.ts b/packages/backend/src/server/api/endpoints/i/import-muting.ts
index 7bbb2e008e..abbf07212e 100644
--- a/packages/backend/src/server/api/endpoints/i/import-muting.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-muting.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportMutingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportMutingJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -15,12 +13,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -48,8 +40,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/import-user-lists.ts b/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
index 759d41b6cd..be162817f1 100644
--- a/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportUserListsJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportUserListsJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -14,12 +12,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -47,8 +39,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts
index 59efd32bb2..7d9bd44d1d 100644
--- a/packages/backend/src/server/api/endpoints/i/notifications.ts
+++ b/packages/backend/src/server/api/endpoints/i/notifications.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { readNotification } from '../../common/read-notification';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query';
-import { Notifications, Followings, Mutings, Users } from '@/models/index';
-import { notificationTypes } from '@/types';
-import read from '@/services/note/read';
+import { readNotification } from '../../common/read-notification.js';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query.js';
+import { Notifications, Followings, Mutings, Users } from '@/models/index.js';
+import { notificationTypes } from '@/types.js';
+import read from '@/services/note/read.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -16,44 +14,6 @@ export const meta = {
kind: 'read:notifications',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- following: {
- validator: $.optional.bool,
- default: false,
- },
-
- unreadOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- markAsRead: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeTypes: {
- validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])),
- },
-
- excludeTypes: {
- validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -65,8 +25,27 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ following: { type: 'boolean', default: false },
+ unreadOnly: { type: 'boolean', default: false },
+ markAsRead: { type: 'boolean', default: true },
+ includeTypes: { type: 'array', items: {
+ type: 'string', enum: notificationTypes,
+ } },
+ excludeTypes: { type: 'array', items: {
+ type: 'string', enum: notificationTypes,
+ } },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// includeTypes が空の場合はクエリしない
if (ps.includeTypes && ps.includeTypes.length === 0) {
return [];
@@ -92,10 +71,16 @@ export default define(meta, async (ps, user) => {
.leftJoinAndSelect('notification.notifier', 'notifier')
.leftJoinAndSelect('notification.note', 'note')
.leftJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
query.andWhere(new Brackets(qb => { qb
.where(`notification.notifierId NOT IN (${ mutingQuery.getQuery() })`)
@@ -125,7 +110,7 @@ export default define(meta, async (ps, user) => {
query.andWhere(`notification.isRead = false`);
}
- const notifications = await query.take(ps.limit!).getMany();
+ const notifications = await query.take(ps.limit).getMany();
// Mark all as read
if (notifications.length > 0 && ps.markAsRead) {
diff --git a/packages/backend/src/server/api/endpoints/i/page-likes.ts b/packages/backend/src/server/api/endpoints/i/page-likes.ts
index 59239c7446..71e326e2f0 100644
--- a/packages/backend/src/server/api/endpoints/i/page-likes.ts
+++ b/packages/backend/src/server/api/endpoints/i/page-likes.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { PageLikes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { PageLikes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'pages'],
@@ -11,48 +9,46 @@ export const meta = {
kind: 'read:page-likes',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
- type: 'object',
+ type: 'array',
optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- format: 'id',
+ items: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ page: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'Page',
+ },
},
- page: {
- type: 'object',
- optional: false, nullable: false,
- ref: 'Page',
- },
- },
+ }
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(PageLikes.createQueryBuilder('like'), ps.sinceId, ps.untilId)
.andWhere(`like.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('like.page', 'page');
const likes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
- return await PageLikes.packMany(likes, user);
+ return PageLikes.packMany(likes, user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/pages.ts b/packages/backend/src/server/api/endpoints/i/pages.ts
index bef775d063..f28aed3fd4 100644
--- a/packages/backend/src/server/api/endpoints/i/pages.ts
+++ b/packages/backend/src/server/api/endpoints/i/pages.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Pages } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Pages } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'pages'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:pages',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Pages.createQueryBuilder('page'), ps.sinceId, ps.untilId)
.andWhere(`page.userId = :meId`, { meId: user.id });
const pages = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Pages.packMany(pages);
diff --git a/packages/backend/src/server/api/endpoints/i/pin.ts b/packages/backend/src/server/api/endpoints/i/pin.ts
index a940d1b99b..67b7026be1 100644
--- a/packages/backend/src/server/api/endpoints/i/pin.ts
+++ b/packages/backend/src/server/api/endpoints/i/pin.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { addPinned } from '@/services/i/pin';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users } from '@/models/index';
+import { addPinned } from '@/services/i/pin.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['account', 'notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -45,8 +37,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await addPinned(user, ps.noteId).catch(e => {
if (e.id === '70c4e51f-5bea-449c-a030-53bee3cce202') throw new ApiError(meta.errors.noSuchNote);
if (e.id === '15a018eb-58e5-4da1-93be-330fcc5e4e1a') throw new ApiError(meta.errors.pinLimitExceeded);
diff --git a/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts b/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
index 4e4fb3840f..2e291a34a0 100644
--- a/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
@@ -1,6 +1,6 @@
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { MessagingMessages, UserGroupJoinings } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { MessagingMessages, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['account', 'messaging'],
@@ -8,13 +8,16 @@ export const meta = {
requireCredential: true,
kind: 'write:account',
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Update documents
await MessagingMessages.update({
recipientId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts b/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
index 99f17ddfc9..49f3deb331 100644
--- a/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
@@ -1,6 +1,6 @@
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { NoteUnreads } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { NoteUnreads } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -8,13 +8,16 @@ export const meta = {
requireCredential: true,
kind: 'write:account',
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Remove documents
await NoteUnreads.delete({
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/i/read-announcement.ts b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
index e9bb66264b..647fa77fa4 100644
--- a/packages/backend/src/server/api/endpoints/i/read-announcement.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { genId } from '@/misc/gen-id';
-import { AnnouncementReads, Announcements, Users } from '@/models/index';
-import { publishMainStream } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { genId } from '@/misc/gen-id.js';
+import { AnnouncementReads, Announcements, Users } from '@/models/index.js';
+import { publishMainStream } from '@/services/stream.js';
export const meta = {
tags: ['account'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- announcementId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAnnouncement: {
message: 'No such announcement.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ announcementId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['announcementId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Check if announcement exists
const announcement = await Announcements.findOne(ps.announcementId);
diff --git a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
index a20719363b..771c98b212 100644
--- a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
+++ b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
@@ -1,24 +1,25 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import generateUserToken from '../../common/generate-native-user-token';
-import define from '../../define';
-import { Users, UserProfiles } from '@/models/index';
+import bcrypt from 'bcryptjs';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import generateUserToken from '../../common/generate-native-user-token.js';
+import define from '../../define.js';
+import { Users, UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
index 2941b441e2..d0b16dbc48 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
@@ -1,22 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
index 51371353c9..cc5d5a8c6f 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
@@ -1,24 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- key: {
- validator: $.str,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
- },
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -28,8 +16,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string' },
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
+ },
+ required: ['key'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get.ts b/packages/backend/src/server/api/endpoints/i/registry/get.ts
index ac617defb0..a79319744c 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get.ts
@@ -1,24 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- key: {
- validator: $.str,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
- },
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -28,8 +16,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string' },
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
+ },
+ required: ['key'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
index 0445922188..ac209c06a6 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
@@ -1,22 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys.ts b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
index a3c9d0e5ee..5ea1a9d344 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
@@ -1,22 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.select('item.key')
.where('item.domain IS NULL')
diff --git a/packages/backend/src/server/api/endpoints/i/registry/remove.ts b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
index 08185f224b..92473654c6 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/remove.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
@@ -1,24 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- key: {
- validator: $.str,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
- },
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -28,8 +16,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string' },
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
+ },
+ required: ['key'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
index 9de68ac6e8..de4b313e25 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
@@ -1,17 +1,20 @@
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.select('item.scope')
.where('item.domain IS NULL')
diff --git a/packages/backend/src/server/api/endpoints/i/registry/set.ts b/packages/backend/src/server/api/endpoints/i/registry/set.ts
index 27884046b4..d380b428a3 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/set.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/set.ts
@@ -1,32 +1,28 @@
-import $ from 'cafy';
-import { publishMainStream } from '@/services/stream';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- key: {
- validator: $.str.min(1),
- },
-
- value: {
- validator: $.nullable.any,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string', minLength: 1 },
+ value: {},
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: ['key', 'value'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/revoke-token.ts b/packages/backend/src/server/api/endpoints/i/revoke-token.ts
index 51721c5b58..b957fd0796 100644
--- a/packages/backend/src/server/api/endpoints/i/revoke-token.ts
+++ b/packages/backend/src/server/api/endpoints/i/revoke-token.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { AccessTokens } from '@/models/index.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- tokenId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tokenId: { type: 'string', format: 'misskey:id' },
},
+ required: ['tokenId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const token = await AccessTokens.findOne(ps.tokenId);
if (token) {
diff --git a/packages/backend/src/server/api/endpoints/i/signin-history.ts b/packages/backend/src/server/api/endpoints/i/signin-history.ts
index 796e2ec309..ca37411662 100644
--- a/packages/backend/src/server/api/endpoints/i/signin-history.ts
+++ b/packages/backend/src/server/api/endpoints/i/signin-history.ts
@@ -1,36 +1,29 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Signins } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Signins } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Signins.createQueryBuilder('signin'), ps.sinceId, ps.untilId)
.andWhere(`signin.userId = :meId`, { meId: user.id });
- const history = await query.take(ps.limit!).getMany();
+ const history = await query.take(ps.limit).getMany();
return await Promise.all(history.map(record => Signins.pack(record)));
});
diff --git a/packages/backend/src/server/api/endpoints/i/unpin.ts b/packages/backend/src/server/api/endpoints/i/unpin.ts
index 9c82b74960..9912689da5 100644
--- a/packages/backend/src/server/api/endpoints/i/unpin.ts
+++ b/packages/backend/src/server/api/endpoints/i/unpin.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { removePinned } from '@/services/i/pin';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users } from '@/models/index';
+import { removePinned } from '@/services/i/pin.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['account', 'notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await removePinned(user, ps.noteId).catch(e => {
if (e.id === 'b302d4cf-c050-400a-bbb3-be208681f40c') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts
index b4479aa50d..389ff1b81d 100644
--- a/packages/backend/src/server/api/endpoints/i/update-email.ts
+++ b/packages/backend/src/server/api/endpoints/i/update-email.ts
@@ -1,14 +1,13 @@
-import $ from 'cafy';
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
import rndstr from 'rndstr';
-import config from '@/config/index';
+import config from '@/config/index.js';
import ms from 'ms';
-import * as bcrypt from 'bcryptjs';
-import { Users, UserProfiles } from '@/models/index';
-import { sendEmail } from '@/services/send-email';
-import { ApiError } from '../../error';
-import { validateEmailForAccount } from '@/services/validate-email-for-account';
+import bcrypt from 'bcryptjs';
+import { Users, UserProfiles } from '@/models/index.js';
+import { sendEmail } from '@/services/send-email.js';
+import { ApiError } from '../../error.js';
+import { validateEmailForAccount } from '@/services/validate-email-for-account.js';
export const meta = {
requireCredential: true,
@@ -20,16 +19,6 @@ export const meta = {
max: 3,
},
- params: {
- password: {
- validator: $.str,
- },
-
- email: {
- validator: $.optional.nullable.str,
- },
- },
-
errors: {
incorrectPassword: {
message: 'Incorrect password.',
@@ -45,8 +34,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
+ email: { type: 'string', nullable: true },
+ },
+ required: ['password'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index 6b7e53aa1f..85d0a62548 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -1,20 +1,19 @@
-import $ from 'cafy';
+import RE2 from 're2';
import * as mfm from 'mfm-js';
-import { ID } from '@/misc/cafy-id';
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import acceptAllFollowRequests from '@/services/following/requests/accept-all';
-import { publishToFollowers } from '@/services/i/update';
-import define from '../../define';
-import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm';
-import { extractHashtags } from '@/misc/extract-hashtags';
-import * as langmap from 'langmap';
-import { updateUsertags } from '@/services/update-hashtag';
-import { ApiError } from '../../error';
-import { Users, DriveFiles, UserProfiles, Pages } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { UserProfile } from '@/models/entities/user-profile';
-import { notificationTypes } from '@/types';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import acceptAllFollowRequests from '@/services/following/requests/accept-all.js';
+import { publishToFollowers } from '@/services/i/update.js';
+import define from '../../define.js';
+import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
+import { extractHashtags } from '@/misc/extract-hashtags.js';
+import { updateUsertags } from '@/services/update-hashtag.js';
+import { ApiError } from '../../error.js';
+import { Users, DriveFiles, UserProfiles, Pages } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
+import { notificationTypes } from '@/types.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { langmap } from '@/misc/langmap.js';
export const meta = {
tags: ['account'],
@@ -23,112 +22,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.optional.nullable.use(Users.validateName),
- },
-
- description: {
- validator: $.optional.nullable.use(Users.validateDescription),
- },
-
- lang: {
- validator: $.optional.nullable.str.or(Object.keys(langmap)),
- },
-
- location: {
- validator: $.optional.nullable.use(Users.validateLocation),
- },
-
- birthday: {
- validator: $.optional.nullable.use(Users.validateBirthday),
- },
-
- avatarId: {
- validator: $.optional.nullable.type(ID),
- },
-
- bannerId: {
- validator: $.optional.nullable.type(ID),
- },
-
- fields: {
- validator: $.optional.arr($.object()).range(1, 4),
- },
-
- isLocked: {
- validator: $.optional.bool,
- },
-
- isExplorable: {
- validator: $.optional.bool,
- },
-
- hideOnlineStatus: {
- validator: $.optional.bool,
- },
-
- publicReactions: {
- validator: $.optional.bool,
- },
-
- ffVisibility: {
- validator: $.optional.str,
- },
-
- carefulBot: {
- validator: $.optional.bool,
- },
-
- autoAcceptFollowed: {
- validator: $.optional.bool,
- },
-
- noCrawle: {
- validator: $.optional.bool,
- },
-
- isBot: {
- validator: $.optional.bool,
- },
-
- isCat: {
- validator: $.optional.bool,
- },
-
- injectFeaturedNote: {
- validator: $.optional.bool,
- },
-
- receiveAnnouncementEmail: {
- validator: $.optional.bool,
- },
-
- alwaysMarkNsfw: {
- validator: $.optional.bool,
- },
-
- pinnedPageId: {
- validator: $.optional.nullable.type(ID),
- },
-
- mutedWords: {
- validator: $.optional.arr($.arr($.str)),
- },
-
- mutedInstances: {
- validator: $.optional.arr($.str),
- },
-
- mutingNotificationTypes: {
- validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])),
- },
-
- emailNotificationTypes: {
- validator: $.optional.arr($.str),
- },
- },
-
errors: {
noSuchAvatar: {
message: 'No such avatar file.',
@@ -159,6 +52,12 @@ export const meta = {
code: 'NO_SUCH_PAGE',
id: '8e01b590-7eb9-431b-a239-860e086c408e',
},
+
+ invalidRegexp: {
+ message: 'Invalid Regular Expression.',
+ code: 'INVALID_REGEXP',
+ id: '0d786918-10df-41cd-8f33-8dec7d9a89a5',
+ }
},
res: {
@@ -168,8 +67,60 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { ...Users.nameSchema, nullable: true },
+ description: { ...Users.descriptionSchema, nullable: true },
+ location: { ...Users.locationSchema, nullable: true },
+ birthday: { ...Users.birthdaySchema, nullable: true },
+ lang: { type: 'string', enum: [null, ...Object.keys(langmap)], nullable: true },
+ avatarId: { type: 'string', format: 'misskey:id', nullable: true },
+ bannerId: { type: 'string', format: 'misskey:id', nullable: true },
+ fields: { type: 'array',
+ minItems: 0,
+ maxItems: 16,
+ items: {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ value: { type: 'string' },
+ },
+ required: ['name', 'value'],
+ },
+ },
+ isLocked: { type: 'boolean' },
+ isExplorable: { type: 'boolean' },
+ hideOnlineStatus: { type: 'boolean' },
+ publicReactions: { type: 'boolean' },
+ carefulBot: { type: 'boolean' },
+ autoAcceptFollowed: { type: 'boolean' },
+ noCrawle: { type: 'boolean' },
+ isBot: { type: 'boolean' },
+ isCat: { type: 'boolean' },
+ showTimelineReplies: { type: 'boolean' },
+ injectFeaturedNote: { type: 'boolean' },
+ receiveAnnouncementEmail: { type: 'boolean' },
+ alwaysMarkNsfw: { type: 'boolean' },
+ ffVisibility: { type: 'string', enum: ['public', 'followers', 'private'] },
+ pinnedPageId: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ mutedWords: { type: 'array' },
+ mutedInstances: { type: 'array', items: {
+ type: 'string',
+ } },
+ mutingNotificationTypes: { type: 'array', items: {
+ type: 'string', enum: notificationTypes,
+ } },
+ emailNotificationTypes: { type: 'array', items: {
+ type: 'string',
+ } },
+ },
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, _user, token) => {
+export default define(meta, paramDef, async (ps, _user, token) => {
const user = await Users.findOneOrFail(_user.id);
const isSecure = token == null;
@@ -187,6 +138,18 @@ export default define(meta, async (ps, _user, token) => {
if (ps.avatarId !== undefined) updates.avatarId = ps.avatarId;
if (ps.bannerId !== undefined) updates.bannerId = ps.bannerId;
if (ps.mutedWords !== undefined) {
+ // validate regular expression syntax
+ ps.mutedWords.filter(x => !Array.isArray(x)).forEach(x => {
+ const regexp = x.match(/^\/(.+)\/(.*)$/);
+ if (!regexp) throw new ApiError(meta.errors.invalidRegexp);
+
+ try {
+ new RE2(regexp[1], regexp[2]);
+ } catch (err) {
+ throw new ApiError(meta.errors.invalidRegexp);
+ }
+ });
+
profileUpdates.mutedWords = ps.mutedWords;
profileUpdates.enableWordMute = ps.mutedWords.length > 0;
}
@@ -197,6 +160,7 @@ export default define(meta, async (ps, _user, token) => {
if (typeof ps.hideOnlineStatus === 'boolean') updates.hideOnlineStatus = ps.hideOnlineStatus;
if (typeof ps.publicReactions === 'boolean') profileUpdates.publicReactions = ps.publicReactions;
if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot;
+ if (typeof ps.showTimelineReplies === 'boolean') updates.showTimelineReplies = ps.showTimelineReplies;
if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot;
if (typeof ps.autoAcceptFollowed === 'boolean') profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed;
if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle;
@@ -211,12 +175,6 @@ export default define(meta, async (ps, _user, token) => {
if (avatar == null || avatar.userId !== user.id) throw new ApiError(meta.errors.noSuchAvatar);
if (!avatar.type.startsWith('image/')) throw new ApiError(meta.errors.avatarNotAnImage);
-
- updates.avatarUrl = DriveFiles.getPublicUrl(avatar, true);
-
- if (avatar.blurhash) {
- updates.avatarBlurhash = avatar.blurhash;
- }
}
if (ps.bannerId) {
@@ -224,12 +182,6 @@ export default define(meta, async (ps, _user, token) => {
if (banner == null || banner.userId !== user.id) throw new ApiError(meta.errors.noSuchBanner);
if (!banner.type.startsWith('image/')) throw new ApiError(meta.errors.bannerNotAnImage);
-
- updates.bannerUrl = DriveFiles.getPublicUrl(banner, false);
-
- if (banner.blurhash) {
- updates.bannerBlurhash = banner.blurhash;
- }
}
if (ps.pinnedPageId) {
diff --git a/packages/backend/src/server/api/endpoints/i/user-group-invites.ts b/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
index 76a3131e6d..1d7e4a16b3 100644
--- a/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
+++ b/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { UserGroupInvitations } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { UserGroupInvitations } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'groups'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:user-groups',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -48,14 +31,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(UserGroupInvitations.createQueryBuilder('invitation'), ps.sinceId, ps.untilId)
.andWhere(`invitation.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('invitation.userGroup', 'user_group');
const invitations = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await UserGroupInvitations.packMany(invitations);
diff --git a/packages/backend/src/server/api/endpoints/messaging/history.ts b/packages/backend/src/server/api/endpoints/messaging/history.ts
index 5ac49cf96b..14de4e1028 100644
--- a/packages/backend/src/server/api/endpoints/messaging/history.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/history.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { MessagingMessages, Mutings, UserGroupJoinings } from '@/models/index';
+import define from '../../define.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { MessagingMessages, Mutings, UserGroupJoinings } from '@/models/index.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -11,18 +10,6 @@ export const meta = {
kind: 'read:messaging',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- group: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -34,8 +21,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ group: { type: 'boolean', default: false },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const mute = await Mutings.find({
muterId: user.id,
});
@@ -50,7 +46,7 @@ export default define(meta, async (ps, user) => {
const history: MessagingMessage[] = [];
- for (let i = 0; i < ps.limit!; i++) {
+ for (let i = 0; i < ps.limit; i++) {
const found = ps.group
? history.map(m => m.groupId!)
: history.map(m => (m.userId === user.id) ? m.recipientId! : m.userId!);
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages.ts b/packages/backend/src/server/api/endpoints/messaging/messages.ts
index 7dbddd80e2..49ace21600 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { MessagingMessages, UserGroups, UserGroupJoinings, Users } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { MessagingMessages, UserGroups, UserGroupJoinings, Users } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { Brackets } from 'typeorm';
-import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message';
+import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message.js';
export const meta = {
tags: ['messaging'],
@@ -15,34 +13,6 @@ export const meta = {
kind: 'read:messaging',
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- groupId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- markAsRead: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -74,8 +44,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ groupId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ markAsRead: { type: 'boolean', default: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
if (ps.userId != null) {
// Fetch recipient (user)
const recipient = await getUser(ps.userId).catch(e => {
@@ -97,7 +80,7 @@ export default define(meta, async (ps, user) => {
.setParameter('meId', user.id)
.setParameter('recipientId', recipient.id);
- const messages = await query.take(ps.limit!).getMany();
+ const messages = await query.take(ps.limit).getMany();
// Mark all as read
if (ps.markAsRead) {
@@ -133,7 +116,7 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(MessagingMessages.createQueryBuilder('message'), ps.sinceId, ps.untilId)
.andWhere(`message.groupId = :groupId`, { groupId: recipientGroup.id });
- const messages = await query.take(ps.limit!).getMany();
+ const messages = await query.take(ps.limit).getMany();
// Mark all as read
if (ps.markAsRead) {
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
index 5ec16f5e5a..a9b926c4fb 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { MessagingMessages, DriveFiles, UserGroups, UserGroupJoinings, Blockings } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { UserGroup } from '@/models/entities/user-group';
-import { createMessage } from '@/services/messages/create';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { MessagingMessages, DriveFiles, UserGroups, UserGroupJoinings, Blockings } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { createMessage } from '@/services/messages/create.js';
export const meta = {
tags: ['messaging'],
@@ -15,24 +13,6 @@ export const meta = {
kind: 'write:messaging',
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- groupId: {
- validator: $.optional.type(ID),
- },
-
- text: {
- validator: $.optional.str.pipe(MessagingMessages.validateText),
- },
-
- fileId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -84,8 +64,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ groupId: { type: 'string', format: 'misskey:id' },
+ text: { type: 'string', nullable: true, maxLength: 3000 },
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let recipientUser: User | undefined;
let recipientGroup: UserGroup | undefined;
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts b/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
index 2975419cef..a0945af510 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
+import define from '../../../define.js';
import ms from 'ms';
-import { ApiError } from '../../../error';
-import { MessagingMessages } from '@/models/index';
-import { deleteMessage } from '@/services/messages/delete';
+import { ApiError } from '../../../error.js';
+import { MessagingMessages } from '@/models/index.js';
+import { deleteMessage } from '@/services/messages/delete.js';
export const meta = {
tags: ['messaging'],
@@ -19,12 +17,6 @@ export const meta = {
minInterval: ms('1sec'),
},
- params: {
- messageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchMessage: {
message: 'No such message.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ messageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['messageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const message = await MessagingMessages.findOne({
id: ps.messageId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/read.ts b/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
index 42c3f49f6f..8d38e509ac 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { MessagingMessages } from '@/models/index';
-import { readUserMessagingMessage, readGroupMessagingMessage } from '../../../common/read-messaging-message';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { MessagingMessages } from '@/models/index.js';
+import { readUserMessagingMessage, readGroupMessagingMessage } from '../../../common/read-messaging-message.js';
export const meta = {
tags: ['messaging'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:messaging',
- params: {
- messageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchMessage: {
message: 'No such message.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ messageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['messageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const message = await MessagingMessages.findOne(ps.messageId);
if (message == null) {
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 693a7a04ec..6231c35ab9 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -1,23 +1,16 @@
-import $ from 'cafy';
-import config from '@/config/index';
-import define from '../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Ads, Emojis, Users } from '@/models/index';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
+import config from '@/config/index.js';
+import define from '../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Ads, Emojis, Users } from '@/models/index.js';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
import { MoreThan } from 'typeorm';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
export const meta = {
tags: ['meta'],
requireCredential: false,
- params: {
- detail: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -76,6 +69,14 @@ export const meta = {
optional: false, nullable: false,
default: false,
},
+ defaultDarkTheme: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ defaultLightTheme: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
disableRegistration: {
type: 'boolean',
optional: false, nullable: false,
@@ -100,10 +101,6 @@ export const meta = {
type: 'boolean',
optional: false, nullable: false,
},
- proxyRemoteFiles: {
- type: 'boolean',
- optional: false, nullable: false,
- },
emailRequiredForSignup: {
type: 'boolean',
optional: false, nullable: false,
@@ -149,7 +146,6 @@ export const meta = {
maxNoteTextLength: {
type: 'number',
optional: false, nullable: false,
- default: 500,
},
emojis: {
type: 'array',
@@ -448,8 +444,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ detail: { type: 'boolean', default: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await fetchMeta(true);
const emojis = await Emojis.find({
@@ -499,14 +503,17 @@ export default define(meta, async (ps, me) => {
enableRecaptcha: instance.enableRecaptcha,
recaptchaSiteKey: instance.recaptchaSiteKey,
swPublickey: instance.swPublicKey,
+ themeColor: instance.themeColor,
mascotImageUrl: instance.mascotImageUrl,
bannerUrl: instance.bannerUrl,
errorImageUrl: instance.errorImageUrl,
iconUrl: instance.iconUrl,
backgroundImageUrl: instance.backgroundImageUrl,
logoImageUrl: instance.logoImageUrl,
- maxNoteTextLength: Math.min(instance.maxNoteTextLength, DB_MAX_NOTE_TEXT_LENGTH),
+ maxNoteTextLength: MAX_NOTE_TEXT_LENGTH, // 後方互換性のため
emojis: await Emojis.packMany(emojis),
+ defaultLightTheme: instance.defaultLightTheme,
+ defaultDarkTheme: instance.defaultDarkTheme,
ads: ads.map(ad => ({
id: ad.id,
url: ad.url,
@@ -528,7 +535,6 @@ export default define(meta, async (ps, me) => {
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
- proxyRemoteFiles: instance.proxyRemoteFiles,
requireSetup: (await Users.count({
host: null,
})) === 0,
diff --git a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
index 158c8877e9..73ecdaeb03 100644
--- a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
+++ b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
@@ -1,8 +1,7 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { secureRndstr } from '@/misc/secure-rndstr';
+import define from '../../define.js';
+import { AccessTokens } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export const meta = {
tags: ['auth'],
@@ -11,28 +10,6 @@ export const meta = {
secure: true,
- params: {
- session: {
- validator: $.nullable.str,
- },
-
- name: {
- validator: $.nullable.optional.str,
- },
-
- description: {
- validator: $.nullable.optional.str,
- },
-
- iconUrl: {
- validator: $.nullable.optional.str,
- },
-
- permission: {
- validator: $.arr($.str).unique(),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -45,8 +22,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ session: { type: 'string', nullable: true },
+ name: { type: 'string', nullable: true },
+ description: { type: 'string', nullable: true },
+ iconUrl: { type: 'string', nullable: true },
+ permission: { type: 'array', uniqueItems: true, items: {
+ type: 'string',
+ } },
+ },
+ required: ['session', 'permission'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Generate access token
const accessToken = secureRndstr(32, true);
diff --git a/packages/backend/src/server/api/endpoints/mute/create.ts b/packages/backend/src/server/api/endpoints/mute/create.ts
index 6ba5a453c3..0178aab143 100644
--- a/packages/backend/src/server/api/endpoints/mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/mute/create.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { genId } from '@/misc/gen-id';
-import { Mutings, NoteWatchings } from '@/models/index';
-import { Muting } from '@/models/entities/muting';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { genId } from '@/misc/gen-id.js';
+import { Mutings, NoteWatchings } from '@/models/index.js';
+import { Muting } from '@/models/entities/muting.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['account'],
@@ -15,12 +13,6 @@ export const meta = {
kind: 'write:mutes',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -42,8 +34,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const muter = user;
// 自分自身
diff --git a/packages/backend/src/server/api/endpoints/mute/delete.ts b/packages/backend/src/server/api/endpoints/mute/delete.ts
index 21948dc3d1..a8cf2a6667 100644
--- a/packages/backend/src/server/api/endpoints/mute/delete.ts
+++ b/packages/backend/src/server/api/endpoints/mute/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Mutings } from '@/models/index';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Mutings } from '@/models/index.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['account'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:mutes',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -40,8 +32,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const muter = user;
// Check if the mutee is yourself
diff --git a/packages/backend/src/server/api/endpoints/mute/list.ts b/packages/backend/src/server/api/endpoints/mute/list.ts
index 4c6a81b63c..31283cf4c1 100644
--- a/packages/backend/src/server/api/endpoints/mute/list.ts
+++ b/packages/backend/src/server/api/endpoints/mute/list.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Mutings } from '@/models/index';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Mutings } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:mutes',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Mutings.createQueryBuilder('muting'), ps.sinceId, ps.untilId)
.andWhere(`muting.muterId = :meId`, { meId: me.id });
const mutings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Mutings.packMany(mutings, me);
diff --git a/packages/backend/src/server/api/endpoints/my/apps.ts b/packages/backend/src/server/api/endpoints/my/apps.ts
index 42bd5c5f75..85b75c15df 100644
--- a/packages/backend/src/server/api/endpoints/my/apps.ts
+++ b/packages/backend/src/server/api/endpoints/my/apps.ts
@@ -1,83 +1,40 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Apps } from '@/models/index';
+import define from '../../define.js';
+import { Apps } from '@/models/index.js';
export const meta = {
tags: ['account', 'app'],
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- },
- name: {
- type: 'string',
- optional: false, nullable: false,
- },
- callbackUrl: {
- type: 'string',
- optional: false, nullable: false,
- },
- permission: {
- type: 'array',
- optional: false, nullable: false,
- items: {
- type: 'string',
- optional: false, nullable: false,
- },
- },
- secret: {
- type: 'string',
- optional: true, nullable: false,
- },
- isAuthorized: {
- type: 'object',
- optional: true, nullable: false,
- properties: {
- appId: {
- type: 'string',
- optional: false, nullable: false,
- },
- userId: {
- type: 'string',
- optional: false, nullable: false,
- },
- },
- },
- },
+ ref: 'App',
},
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = {
userId: user.id,
};
const apps = await Apps.find({
where: query,
- take: ps.limit!,
+ take: ps.limit,
skip: ps.offset,
});
diff --git a/packages/backend/src/server/api/endpoints/notes.ts b/packages/backend/src/server/api/endpoints/notes.ts
index 9edc6cb11c..96657f8d3f 100644
--- a/packages/backend/src/server/api/endpoints/notes.ts
+++ b/packages/backend/src/server/api/endpoints/notes.ts
@@ -1,47 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../define';
-import { makePaginationQuery } from '../common/make-pagination-query';
-import { Notes } from '@/models/index';
+import define from '../define.js';
+import { makePaginationQuery } from '../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
- params: {
- local: {
- validator: $.optional.bool,
- },
-
- reply: {
- validator: $.optional.bool,
- },
-
- renote: {
- validator: $.optional.bool,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
-
- poll: {
- validator: $.optional.bool,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -53,16 +16,37 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ local: { type: 'boolean' },
+ reply: { type: 'boolean' },
+ renote: { type: 'boolean' },
+ withFiles: { type: 'boolean' },
+ poll: { type: 'boolean' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.visibility = 'public'`)
.andWhere(`note.localOnly = FALSE`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
if (ps.local) {
query.andWhere('note.userHost IS NULL');
@@ -89,7 +73,7 @@ export default define(meta, async (ps) => {
// query.isBot = bot;
//}
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/children.ts b/packages/backend/src/server/api/endpoints/notes/children.ts
index 088ef65e96..86dde30d64 100644
--- a/packages/backend/src/server/api/endpoints/notes/children.ts
+++ b/packages/backend/src/server/api/endpoints/notes/children.ts
@@ -1,38 +1,17 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { Brackets } from 'typeorm';
-import { Notes } from '@/models/index';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
+import { Notes } from '@/models/index.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -44,8 +23,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(new Brackets(qb => { qb
.where(`note.replyId = :noteId`, { noteId: ps.noteId })
@@ -59,17 +49,23 @@ export default define(meta, async (ps, user) => {
}));
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
if (user) generateMutedInstanceQuery(query, user);
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/clips.ts b/packages/backend/src/server/api/endpoints/notes/clips.ts
index b89c6db4a8..9a863b7148 100644
--- a/packages/backend/src/server/api/endpoints/notes/clips.ts
+++ b/packages/backend/src/server/api/endpoints/notes/clips.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ClipNotes, Clips } from '@/models/index';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { ClipNotes, Clips } from '@/models/index.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
import { In } from 'typeorm';
export const meta = {
@@ -11,12 +9,6 @@ export const meta = {
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -36,8 +28,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/conversation.ts b/packages/backend/src/server/api/endpoints/notes/conversation.ts
index 4bd89c32e7..2552c0f99d 100644
--- a/packages/backend/src/server/api/endpoints/notes/conversation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/conversation.ts
@@ -1,32 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getNote } from '../../common/getters';
-import { Note } from '@/models/entities/note';
-import { Notes } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getNote } from '../../common/getters.js';
+import { Note } from '@/models/entities/note.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +28,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -65,7 +57,7 @@ export default define(meta, async (ps, user) => {
conversation.push(p);
}
- if (conversation.length == ps.limit!) {
+ if (conversation.length == ps.limit) {
return;
}
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 4efa76b248..e4a9b28891 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -1,26 +1,14 @@
-import $ from 'cafy';
import ms from 'ms';
-import { length } from 'stringz';
-import create from '@/services/note/create';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { ID } from '@/misc/cafy-id';
-import { User } from '@/models/entities/user';
-import { Users, DriveFiles, Notes, Channels, Blockings } from '@/models/index';
-import { DriveFile } from '@/models/entities/drive-file';
-import { Note } from '@/models/entities/note';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
-import { noteVisibilities } from '../../../../types';
-import { Channel } from '@/models/entities/channel';
-
-let maxNoteTextLength = 500;
-
-setInterval(() => {
- fetchMeta().then(m => {
- maxNoteTextLength = m.maxNoteTextLength;
- });
-}, 3000);
+import create from '@/services/note/create.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { User } from '@/models/entities/user.js';
+import { Users, DriveFiles, Notes, Channels, Blockings } from '@/models/index.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { Note } from '@/models/entities/note.js';
+import { noteVisibilities } from '../../../../types.js';
+import { Channel } from '@/models/entities/channel.js';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
export const meta = {
tags: ['notes'],
@@ -34,84 +22,6 @@ export const meta = {
kind: 'write:notes',
- params: {
- visibility: {
- validator: $.optional.str.or(noteVisibilities as unknown as string[]),
- default: 'public',
- },
-
- visibleUserIds: {
- validator: $.optional.arr($.type(ID)).unique().min(0),
- },
-
- text: {
- validator: $.optional.nullable.str.pipe(text =>
- text.trim() != ''
- && length(text.trim()) <= maxNoteTextLength
- && Array.from(text.trim()).length <= DB_MAX_NOTE_TEXT_LENGTH, // DB limit
- ),
- default: null,
- },
-
- cw: {
- validator: $.optional.nullable.str.pipe(Notes.validateCw),
- },
-
- localOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- noExtractMentions: {
- validator: $.optional.bool,
- default: false,
- },
-
- noExtractHashtags: {
- validator: $.optional.bool,
- default: false,
- },
-
- noExtractEmojis: {
- validator: $.optional.bool,
- default: false,
- },
-
- fileIds: {
- validator: $.optional.arr($.type(ID)).unique().range(1, 16),
- },
-
- mediaIds: {
- validator: $.optional.arr($.type(ID)).unique().range(1, 16),
- deprecated: true,
- },
-
- replyId: {
- validator: $.optional.nullable.type(ID),
- },
-
- renoteId: {
- validator: $.optional.nullable.type(ID),
- },
-
- channelId: {
- validator: $.optional.nullable.type(ID),
- },
-
- poll: {
- validator: $.optional.nullable.obj({
- choices: $.arr($.str)
- .unique()
- .range(2, 10)
- .each(c => c.length > 0 && c.length < 50),
- multiple: $.optional.bool,
- expiresAt: $.optional.nullable.num.int(),
- expiredAfter: $.optional.nullable.num.int().min(1),
- }).strict(),
- ref: 'poll',
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -175,8 +85,49 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ visibility: { type: 'string', enum: ['public', 'home', 'followers', 'specified'], default: "public" },
+ visibleUserIds: { type: 'array', uniqueItems: true, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ text: { type: 'string', nullable: true, maxLength: MAX_NOTE_TEXT_LENGTH, default: null },
+ cw: { type: 'string', nullable: true, maxLength: 100 },
+ localOnly: { type: 'boolean', default: false },
+ noExtractMentions: { type: 'boolean', default: false },
+ noExtractHashtags: { type: 'boolean', default: false },
+ noExtractEmojis: { type: 'boolean', default: false },
+ fileIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 16, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ mediaIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 16, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ replyId: { type: 'string', format: 'misskey:id', nullable: true },
+ renoteId: { type: 'string', format: 'misskey:id', nullable: true },
+ channelId: { type: 'string', format: 'misskey:id', nullable: true },
+ poll: {
+ type: 'object', nullable: true,
+ properties: {
+ choices: {
+ type: 'array', uniqueItems: true, minItems: 2, maxItems: 10,
+ items: {
+ type: 'string', minLength: 1, maxLength: 50,
+ },
+ },
+ multiple: { type: 'boolean', default: false },
+ expiresAt: { type: 'integer', nullable: true },
+ expiredAfter: { type: 'integer', nullable: true, minimum: 1 },
+ },
+ required: ['choices'],
+ },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let visibleUsers: User[] = [];
if (ps.visibleUserIds) {
visibleUsers = (await Promise.all(ps.visibleUserIds.map(id => Users.findOne(id))))
diff --git a/packages/backend/src/server/api/endpoints/notes/delete.ts b/packages/backend/src/server/api/endpoints/notes/delete.ts
index 9e080d9e99..22ff2275ca 100644
--- a/packages/backend/src/server/api/endpoints/notes/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/delete.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import deleteNote from '@/services/note/delete';
-import define from '../../define';
+import deleteNote from '@/services/note/delete.js';
+import define from '../../define.js';
import ms from 'ms';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { Users } from '@/models/index';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -20,12 +18,6 @@ export const meta = {
minInterval: ms('1sec'),
},
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -41,8 +33,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
index 78da6a3b00..bcc2c44c02 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { NoteFavorites } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { NoteFavorites } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes', 'favorites'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:favorites',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get favoritee
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
index 3f3d50f0d5..d41fab22d3 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { NoteFavorites } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { NoteFavorites } from '@/models/index.js';
export const meta = {
tags: ['notes', 'favorites'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:favorites',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get favoritee
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
diff --git a/packages/backend/src/server/api/endpoints/notes/featured.ts b/packages/backend/src/server/api/endpoints/notes/featured.ts
index 5a47fb9e08..6308d23696 100644
--- a/packages/backend/src/server/api/endpoints/notes/featured.ts
+++ b/packages/backend/src/server/api/endpoints/notes/featured.ts
@@ -1,26 +1,13 @@
-import $ from 'cafy';
-import define from '../../define';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { Notes } from '@/models/index';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { Notes } from '@/models/index.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const max = 30;
const day = 1000 * 60 * 60 * 24 * 3; // 3日前まで
@@ -44,10 +40,16 @@ export default define(meta, async (ps, user) => {
.andWhere(`note.createdAt > :date`, { date: new Date(Date.now() - day) })
.andWhere(`note.visibility = 'public'`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
index cac8b7d8a9..26aaa0919c 100644
--- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,47 +1,18 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
-import { activeUsersChart } from '@/services/chart/index';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { ApiError } from '../../error.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
- params: {
- withFiles: {
- validator: $.optional.bool,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -61,8 +32,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ withFiles: { type: 'boolean' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const m = await fetchMeta();
if (m.disableGlobalTimeline) {
if (user == null || (!user.isAdmin && !user.isModerator)) {
@@ -76,10 +60,16 @@ export default define(meta, async (ps, user) => {
.andWhere('note.visibility = \'public\'')
.andWhere('note.channelId IS NULL')
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateRepliesQuery(query, user);
if (user) generateMutedUserQuery(query, user);
@@ -92,11 +82,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
index 9683df4611..9bcb64b656 100644
--- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -1,67 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Followings, Notes } from '@/models/index';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { ApiError } from '../../error.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Followings, Notes } from '@/models/index.js';
import { Brackets } from 'typeorm';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
-import { activeUsersChart } from '@/services/chart/index';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateChannelQuery } from '../../common/generate-channel-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateChannelQuery } from '../../common/generate-channel-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeRenotedMyNotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeLocalRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -81,8 +37,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ includeRenotedMyNotes: { type: 'boolean', default: true },
+ includeLocalRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const m = await fetchMeta();
if (m.disableLocalTimeline && !user.isAdmin && !user.isModerator) {
throw new ApiError(meta.errors.stlDisabled);
@@ -100,10 +72,16 @@ export default define(meta, async (ps, user) => {
.orWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)');
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(followingQuery.getParameters());
generateChannelQuery(query, user);
@@ -149,11 +127,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
index 7776644124..12fc88b1fd 100644
--- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
@@ -1,58 +1,20 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { ApiError } from '../../error.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import { Brackets } from 'typeorm';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateChannelQuery } from '../../common/generate-channel-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateChannelQuery } from '../../common/generate-channel-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
- params: {
- withFiles: {
- validator: $.optional.bool,
- },
-
- fileType: {
- validator: $.optional.arr($.str),
- },
-
- excludeNsfw: {
- validator: $.optional.bool,
- default: false,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -72,8 +34,25 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ withFiles: { type: 'boolean' },
+ fileType: { type: 'array', items: {
+ type: 'string',
+ } },
+ excludeNsfw: { type: 'boolean', default: false },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const m = await fetchMeta();
if (m.disableLocalTimeline) {
if (user == null || (!user.isAdmin && !user.isModerator)) {
@@ -86,10 +65,16 @@ export default define(meta, async (ps, user) => {
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)')
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateChannelQuery(query, user);
generateRepliesQuery(query, user);
@@ -118,11 +103,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts
index 81b3844365..eafbba322d 100644
--- a/packages/backend/src/server/api/endpoints/notes/mentions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts
@@ -1,44 +1,18 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import read from '@/services/note/read';
-import { Notes, Followings } from '@/models/index';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import read from '@/services/note/read.js';
+import { Notes, Followings } from '@/models/index.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { Brackets } from 'typeorm';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
-import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
+import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- following: {
- validator: $.optional.bool,
- default: false,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- visibility: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -50,8 +24,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ following: { type: 'boolean', default: false },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ visibility: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const followingQuery = Followings.createQueryBuilder('following')
.select('following.followeeId')
.where('following.followerId = :followerId', { followerId: user.id });
@@ -62,10 +48,16 @@ export default define(meta, async (ps, user) => {
.orWhere(`'{"${user.id}"}' <@ note.visibleUserIds`);
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
generateMutedUserQuery(query, user);
@@ -81,7 +73,7 @@ export default define(meta, async (ps, user) => {
query.setParameters(followingQuery.getParameters());
}
- const mentions = await query.take(ps.limit!).getMany();
+ const mentions = await query.take(ps.limit).getMany();
read(user.id, mentions);
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
index 79b558e65e..bdd1aeecd4 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Polls, Mutings, Notes, PollVotes } from '@/models/index';
+import define from '../../../define.js';
+import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js';
import { Brackets, In } from 'typeorm';
export const meta = {
@@ -8,18 +7,6 @@ export const meta = {
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -31,8 +18,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = Polls.createQueryBuilder('poll')
.where('poll.userHost IS NULL')
.andWhere(`poll.userId != :meId`, { meId: user.id })
@@ -64,7 +60,7 @@ export default define(meta, async (ps, user) => {
query.setParameters(mutingQuery.getParameters());
//#endregion
- const polls = await query.take(ps.limit!).skip(ps.offset).getMany();
+ const polls = await query.take(ps.limit).skip(ps.offset).getMany();
if (polls.length === 0) return [];
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
index 77387cacb2..ef52d03664 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
@@ -1,18 +1,16 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishNoteStream } from '@/services/stream';
-import { createNotification } from '@/services/create-notification';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { deliver } from '@/queue/index';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderVote from '@/remote/activitypub/renderer/vote';
-import { deliverQuestionUpdate } from '@/services/note/polls/update';
-import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index';
+import { publishNoteStream } from '@/services/stream.js';
+import { createNotification } from '@/services/create-notification.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { deliver } from '@/queue/index.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderVote from '@/remote/activitypub/renderer/vote.js';
+import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
+import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index.js';
import { Not } from 'typeorm';
-import { IRemoteUser } from '@/models/entities/user';
-import { genId } from '@/misc/gen-id';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes'],
@@ -21,16 +19,6 @@ export const meta = {
kind: 'write:votes',
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- choice: {
- validator: $.num,
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -70,8 +58,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ choice: { type: 'integer' },
+ },
+ required: ['noteId', 'choice'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const createdAt = new Date();
// Get votee
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions.ts b/packages/backend/src/server/api/endpoints/notes/reactions.ts
index 5205a78171..43e5d1ef6f 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions.ts
@@ -1,45 +1,15 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { NoteReactions } from '@/models/index';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { NoteReactions } from '@/models/index.js';
import { DeepPartial } from 'typeorm';
-import { NoteReaction } from '@/models/entities/note-reaction';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
export const meta = {
tags: ['notes', 'reactions'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- type: {
- validator: $.optional.nullable.str,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num,
- default: 0,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -59,8 +29,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ type: { type: 'string', nullable: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -80,11 +63,12 @@ export default define(meta, async (ps, user) => {
const reactions = await NoteReactions.find({
where: query,
- take: ps.limit!,
+ take: ps.limit,
skip: ps.offset,
order: {
id: -1,
},
+ relations: ['user', 'user.avatar', 'user.banner', 'note'],
});
return await Promise.all(reactions.map(reaction => NoteReactions.pack(reaction, user)));
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/create.ts b/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
index 1b42781ceb..07e52a9266 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import createReaction from '@/services/note/reaction/create';
-import define from '../../../define';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import createReaction from '@/services/note/reaction/create.js';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['reactions', 'notes'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'write:reactions',
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- reaction: {
- validator: $.str,
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -43,8 +31,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ reaction: { type: 'string' },
+ },
+ required: ['noteId', 'reaction'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
index 1d686b5971..639ecae264 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
+import define from '../../../define.js';
import ms from 'ms';
-import deleteReaction from '@/services/note/reaction/delete';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import deleteReaction from '@/services/note/reaction/delete.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['reactions', 'notes'],
@@ -19,12 +17,6 @@ export const meta = {
minInterval: ms('3sec'),
},
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -40,8 +32,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts
index f71d23146a..87c855a5e8 100644
--- a/packages/backend/src/server/api/endpoints/notes/renotes.ts
+++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts
@@ -1,38 +1,17 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes } from '@/models/index';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -52,8 +31,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -62,16 +52,22 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.renoteId = :renoteId`, { renoteId: note.id })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
- const renotes = await query.take(ps.limit!).getMany();
+ const renotes = await query.take(ps.limit).getMany();
return await Notes.packMany(renotes, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/replies.ts b/packages/backend/src/server/api/endpoints/notes/replies.ts
index 62c56534e1..3053eabe33 100644
--- a/packages/backend/src/server/api/endpoints/notes/replies.ts
+++ b/packages/backend/src/server/api/endpoints/notes/replies.ts
@@ -1,36 +1,15 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Notes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,21 +21,38 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere('note.replyId = :replyId', { replyId: ps.noteId })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
return await Notes.packMany(timeline, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
index 87eaffe2f1..c6503eb057 100644
--- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
@@ -1,60 +1,16 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { Brackets } from 'typeorm';
-import { safeForSql } from '@/misc/safe-for-sql';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { safeForSql } from '@/misc/safe-for-sql.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes', 'hashtags'],
- params: {
- tag: {
- validator: $.optional.str,
- },
-
- query: {
- validator: $.optional.arr($.arr($.str)),
- },
-
- reply: {
- validator: $.optional.nullable.bool,
- default: null,
- },
-
- renote: {
- validator: $.optional.nullable.bool,
- default: null,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
-
- poll: {
- validator: $.optional.nullable.bool,
- default: null,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -66,14 +22,40 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tag: { type: 'string' },
+ query: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ reply: { type: 'boolean', nullable: true, default: null },
+ renote: { type: 'boolean', nullable: true, default: null },
+ withFiles: { type: 'boolean' },
+ poll: { type: 'boolean', nullable: true, default: null },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
if (me) generateMutedUserQuery(query, me);
@@ -129,7 +111,7 @@ export default define(meta, async (ps, me) => {
}
// Search notes
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes, me);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts
index e75212b14b..e77892b150 100644
--- a/packages/backend/src/server/api/endpoints/notes/search.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search.ts
@@ -1,54 +1,18 @@
-import $ from 'cafy';
-import es from '../../../../db/elasticsearch';
-import define from '../../define';
-import { Notes } from '@/models/index';
+import es from '../../../../db/elasticsearch.js';
+import define from '../../define.js';
+import { Notes } from '@/models/index.js';
import { In } from 'typeorm';
-import { ID } from '@/misc/cafy-id';
-import config from '@/config/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import config from '@/config/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- query: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- host: {
- validator: $.optional.nullable.str,
- default: undefined,
- },
-
- userId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- channelId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +27,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ host: { type: 'string', nullable: true },
+ userId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ channelId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: ['query'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
if (es == null) {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId);
@@ -77,16 +56,22 @@ export default define(meta, async (ps, me) => {
query
.andWhere('note.text ILIKE :q', { q: `%${ps.query}%` })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
if (me) generateMutedUserQuery(query, me);
if (me) generateBlockedUserQuery(query, me);
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes, me);
} else {
@@ -115,7 +100,7 @@ export default define(meta, async (ps, me) => {
const result = await es.search({
index: config.elasticsearch.index || 'misskey_note',
body: {
- size: ps.limit!,
+ size: ps.limit,
from: ps.offset,
query: {
bool: {
diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts
index feb94be1a1..d6692923c3 100644
--- a/packages/backend/src/server/api/endpoints/notes/show.ts
+++ b/packages/backend/src/server/api/endpoints/notes/show.ts
@@ -1,21 +1,13 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { Notes } from '@/models/index';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -31,8 +23,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/state.ts b/packages/backend/src/server/api/endpoints/notes/state.ts
index c3e9090bbf..6fdb8e88fb 100644
--- a/packages/backend/src/server/api/endpoints/notes/state.ts
+++ b/packages/backend/src/server/api/endpoints/notes/state.ts
@@ -1,19 +1,11 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index';
+import define from '../../define.js';
+import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await Notes.findOneOrFail(ps.noteId);
const [favorite, watching, threadMuting] = await Promise.all([
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
index a8b50d90f6..e48a2cf576 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
-import { Notes, NoteThreadMutings } from '@/models';
-import { genId } from '@/misc/gen-id';
-import readNote from '@/services/note/read';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
+import { Notes, NoteThreadMutings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import readNote from '@/services/note/read.js';
export const meta = {
tags: ['notes'],
@@ -14,12 +12,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -29,8 +21,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
index f76b526ce1..4fb3137a5e 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
-import { NoteThreadMutings } from '@/models';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
+import { NoteThreadMutings } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index 8be2861aec..fde66b241b 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -1,65 +1,21 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes, Followings } from '@/models/index';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes, Followings } from '@/models/index.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import { Brackets } from 'typeorm';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateChannelQuery } from '../../common/generate-channel-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateChannelQuery } from '../../common/generate-channel-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeRenotedMyNotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeLocalRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -71,8 +27,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ includeRenotedMyNotes: { type: 'boolean', default: true },
+ includeLocalRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const hasFollowing = (await Followings.count({
where: {
followerId: user.id,
@@ -92,10 +64,16 @@ export default define(meta, async (ps, user) => {
if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(followingQuery.getParameters());
generateChannelQuery(query, user);
@@ -141,11 +119,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/translate.ts b/packages/backend/src/server/api/endpoints/notes/translate.ts
index ed069cb75a..068df6940b 100644
--- a/packages/backend/src/server/api/endpoints/notes/translate.ts
+++ b/packages/backend/src/server/api/endpoints/notes/translate.ts
@@ -1,29 +1,18 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
import fetch from 'node-fetch';
-import config from '@/config/index';
-import { getAgentByUrl } from '@/misc/fetch';
-import { URLSearchParams } from 'url';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models';
+import config from '@/config/index.js';
+import { getAgentByUrl } from '@/misc/fetch.js';
+import { URLSearchParams } from 'node:url';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- targetLang: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -38,8 +27,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ targetLang: { type: 'string' },
+ },
+ required: ['noteId', 'targetLang'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/unrenote.ts b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
index 8db543d328..a9aadba338 100644
--- a/packages/backend/src/server/api/endpoints/notes/unrenote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import deleteNote from '@/services/note/delete';
-import define from '../../define';
+import deleteNote from '@/services/note/delete.js';
+import define from '../../define.js';
import ms from 'ms';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { Notes, Users } from '@/models/index';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { Notes, Users } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -20,12 +18,6 @@ export const meta = {
minInterval: ms('1sec'),
},
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -35,8 +27,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
index 89de73fb9d..0829d0e4c1 100644
--- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { UserLists, UserListJoinings, Notes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { UserLists, UserListJoinings, Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -13,52 +11,6 @@ export const meta = {
requireCredential: true,
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeRenotedMyNotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeLocalRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -78,8 +30,25 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ includeRenotedMyNotes: { type: 'boolean', default: true },
+ includeLocalRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean' },
+ },
+ required: ['listId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const list = await UserLists.findOne({
id: ps.listId,
userId: user.id,
@@ -97,10 +66,16 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.userId IN (${ listQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(listQuery.getParameters());
generateVisibilityQuery(query, user);
@@ -140,9 +115,9 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
return await Notes.packMany(timeline, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/create.ts b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
index 6433c6bc2a..8fdf84624e 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import watch from '@/services/note/watch';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import watch from '@/services/note/watch.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
index 3e9faa2b23..d58f09797c 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import unwatch from '@/services/note/unwatch';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import unwatch from '@/services/note/unwatch.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notifications/create.ts b/packages/backend/src/server/api/endpoints/notifications/create.ts
index bd8a7ba1b7..b339c8723d 100644
--- a/packages/backend/src/server/api/endpoints/notifications/create.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/create.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../define';
-import { createNotification } from '@/services/create-notification';
+import define from '../../define.js';
+import { createNotification } from '@/services/create-notification.js';
export const meta = {
tags: ['notifications'],
@@ -9,26 +8,22 @@ export const meta = {
kind: 'write:notifications',
- params: {
- body: {
- validator: $.str,
- },
-
- header: {
- validator: $.optional.nullable.str,
- },
-
- icon: {
- validator: $.optional.nullable.str,
- },
+ errors: {
},
+} as const;
- errors: {
+export const paramDef = {
+ type: 'object',
+ properties: {
+ body: { type: 'string' },
+ header: { type: 'string', nullable: true },
+ icon: { type: 'string', nullable: true },
},
+ required: ['body'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, token) => {
+export default define(meta, paramDef, async (ps, user, token) => {
createNotification(user.id, 'app', {
appAccessTokenId: token ? token.id : null,
customBody: ps.body,
diff --git a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
index 4cec38a95d..abefe07be6 100644
--- a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
@@ -1,6 +1,6 @@
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { Notifications } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { Notifications } from '@/models/index.js';
export const meta = {
tags: ['notifications', 'account'],
@@ -10,8 +10,14 @@ export const meta = {
kind: 'write:notifications',
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Update documents
await Notifications.update({
notifieeId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/notifications/read.ts b/packages/backend/src/server/api/endpoints/notifications/read.ts
index 7e23bc234d..34f4c155fa 100644
--- a/packages/backend/src/server/api/endpoints/notifications/read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/read.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { Notifications } from '@/models/index';
-import { readNotification } from '../../common/read-notification';
-import { ApiError } from '../../error';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { Notifications } from '@/models/index.js';
+import { readNotification } from '../../common/read-notification.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['notifications', 'account'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:notifications',
- params: {
- notificationId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNotification: {
message: 'No such notification.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ notificationId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['notificationId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const notification = await Notifications.findOne({
notifieeId: user.id,
id: ps.notificationId,
diff --git a/packages/backend/src/server/api/endpoints/page-push.ts b/packages/backend/src/server/api/endpoints/page-push.ts
index 61c0160f83..acaa118470 100644
--- a/packages/backend/src/server/api/endpoints/page-push.ts
+++ b/packages/backend/src/server/api/endpoints/page-push.ts
@@ -1,28 +1,12 @@
-import $ from 'cafy';
-import define from '../define';
-import { ID } from '@/misc/cafy-id';
-import { publishMainStream } from '@/services/stream';
-import { Users, Pages } from '@/models/index';
-import { ApiError } from '../error';
+import define from '../define.js';
+import { publishMainStream } from '@/services/stream.js';
+import { Users, Pages } from '@/models/index.js';
+import { ApiError } from '../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- pageId: {
- validator: $.type(ID),
- },
-
- event: {
- validator: $.str,
- },
-
- var: {
- validator: $.optional.nullable.any,
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -32,8 +16,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ event: { type: 'string' },
+ var: {},
+ },
+ required: ['pageId', 'event'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/create.ts b/packages/backend/src/server/api/endpoints/pages/create.ts
index 7ee50fbdfa..7cac530606 100644
--- a/packages/backend/src/server/api/endpoints/pages/create.ts
+++ b/packages/backend/src/server/api/endpoints/pages/create.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../define';
-import { ID } from '@/misc/cafy-id';
-import { Pages, DriveFiles } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { Page } from '@/models/entities/page';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { Pages, DriveFiles } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { Page } from '@/models/entities/page.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['pages'],
@@ -19,51 +17,6 @@ export const meta = {
max: 300,
},
- params: {
- title: {
- validator: $.str,
- },
-
- name: {
- validator: $.str.min(1),
- },
-
- summary: {
- validator: $.optional.nullable.str,
- },
-
- content: {
- validator: $.arr($.obj()),
- },
-
- variables: {
- validator: $.arr($.obj()),
- },
-
- script: {
- validator: $.str,
- },
-
- eyeCatchingImageId: {
- validator: $.optional.nullable.type(ID),
- },
-
- font: {
- validator: $.optional.str.or(['serif', 'sans-serif']),
- default: 'sans-serif',
- },
-
- alignCenter: {
- validator: $.optional.bool,
- default: false,
- },
-
- hideTitleWhenPinned: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -84,8 +37,29 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ title: { type: 'string' },
+ name: { type: 'string', minLength: 1 },
+ summary: { type: 'string', nullable: true },
+ content: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ variables: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ script: { type: 'string' },
+ eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
+ font: { type: 'string', enum: ['serif', 'sans-serif'], default: "sans-serif" },
+ alignCenter: { type: 'boolean', default: false },
+ hideTitleWhenPinned: { type: 'boolean', default: false },
+ },
+ required: ['title', 'name', 'content', 'variables', 'script'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let eyeCatchingImage = null;
if (ps.eyeCatchingImageId != null) {
eyeCatchingImage = await DriveFiles.findOne({
diff --git a/packages/backend/src/server/api/endpoints/pages/delete.ts b/packages/backend/src/server/api/endpoints/pages/delete.ts
index aeda823e52..ddf691f53c 100644
--- a/packages/backend/src/server/api/endpoints/pages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/pages/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages } from '@/models/index.js';
export const meta = {
tags: ['pages'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:pages',
- params: {
- pageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['pageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/featured.ts b/packages/backend/src/server/api/endpoints/pages/featured.ts
index 7f0d58b350..eeb6d509ca 100644
--- a/packages/backend/src/server/api/endpoints/pages/featured.ts
+++ b/packages/backend/src/server/api/endpoints/pages/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Pages } from '@/models/index';
+import define from '../../define.js';
+import { Pages } from '@/models/index.js';
export const meta = {
tags: ['pages'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Pages.createQueryBuilder('page')
.where('page.visibility = \'public\'')
.andWhere('page.likedCount > 0')
diff --git a/packages/backend/src/server/api/endpoints/pages/like.ts b/packages/backend/src/server/api/endpoints/pages/like.ts
index c479f637a9..cab78e576c 100644
--- a/packages/backend/src/server/api/endpoints/pages/like.ts
+++ b/packages/backend/src/server/api/endpoints/pages/like.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, PageLikes } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, PageLikes } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['pages'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:page-likes',
- params: {
- pageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -39,8 +31,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['pageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/show.ts b/packages/backend/src/server/api/endpoints/pages/show.ts
index 5cda5386d5..4e3facae5b 100644
--- a/packages/backend/src/server/api/endpoints/pages/show.ts
+++ b/packages/backend/src/server/api/endpoints/pages/show.ts
@@ -1,29 +1,13 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, Users } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
-import { Page } from '@/models/entities/page';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, Users } from '@/models/index.js';
+import { Page } from '@/models/entities/page.js';
export const meta = {
tags: ['pages'],
requireCredential: false,
- params: {
- pageId: {
- validator: $.optional.type(ID),
- },
-
- name: {
- validator: $.optional.str,
- },
-
- username: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -39,8 +23,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string' },
+ username: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let page: Page | undefined;
if (ps.pageId) {
diff --git a/packages/backend/src/server/api/endpoints/pages/unlike.ts b/packages/backend/src/server/api/endpoints/pages/unlike.ts
index cca5e5b5a9..31cd1a3359 100644
--- a/packages/backend/src/server/api/endpoints/pages/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/pages/unlike.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, PageLikes } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, PageLikes } from '@/models/index.js';
export const meta = {
tags: ['pages'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:page-likes',
- params: {
- pageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['pageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/update.ts b/packages/backend/src/server/api/endpoints/pages/update.ts
index 991085ee09..24c8f467e6 100644
--- a/packages/backend/src/server/api/endpoints/pages/update.ts
+++ b/packages/backend/src/server/api/endpoints/pages/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, DriveFiles } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, DriveFiles } from '@/models/index.js';
import { Not } from 'typeorm';
export const meta = {
@@ -18,52 +16,6 @@ export const meta = {
max: 300,
},
- params: {
- pageId: {
- validator: $.type(ID),
- },
-
- title: {
- validator: $.str,
- },
-
- name: {
- validator: $.str.min(1),
- },
-
- summary: {
- validator: $.optional.nullable.str,
- },
-
- content: {
- validator: $.arr($.obj()),
- },
-
- variables: {
- validator: $.arr($.obj()),
- },
-
- script: {
- validator: $.str,
- },
-
- eyeCatchingImageId: {
- validator: $.optional.nullable.type(ID),
- },
-
- font: {
- validator: $.optional.str.or(['serif', 'sans-serif']),
- },
-
- alignCenter: {
- validator: $.optional.bool,
- },
-
- hideTitleWhenPinned: {
- validator: $.optional.bool,
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -90,8 +42,30 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ title: { type: 'string' },
+ name: { type: 'string', minLength: 1 },
+ summary: { type: 'string', nullable: true },
+ content: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ variables: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ script: { type: 'string' },
+ eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
+ font: { type: 'string', enum: ['serif', 'sans-serif'] },
+ alignCenter: { type: 'boolean' },
+ hideTitleWhenPinned: { type: 'boolean' },
+ },
+ required: ['pageId', 'title', 'name', 'content', 'variables', 'script'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/ping.ts b/packages/backend/src/server/api/endpoints/ping.ts
index 3eab70ae2e..2891a0860a 100644
--- a/packages/backend/src/server/api/endpoints/ping.ts
+++ b/packages/backend/src/server/api/endpoints/ping.ts
@@ -1,13 +1,10 @@
-import define from '../define';
+import define from '../define.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -20,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
return {
pong: Date.now(),
};
diff --git a/packages/backend/src/server/api/endpoints/pinned-users.ts b/packages/backend/src/server/api/endpoints/pinned-users.ts
index ff0e22555f..1d26ab266e 100644
--- a/packages/backend/src/server/api/endpoints/pinned-users.ts
+++ b/packages/backend/src/server/api/endpoints/pinned-users.ts
@@ -1,17 +1,14 @@
-import define from '../define';
-import { Users } from '@/models/index';
-import { fetchMeta } from '@/misc/fetch-meta';
-import * as Acct from 'misskey-js/built/acct';
-import { User } from '@/models/entities/user';
+import define from '../define.js';
+import { Users } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import * as Acct from '@/misc/acct.js';
+import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -23,8 +20,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const meta = await fetchMeta();
const users = await Promise.all(meta.pinnedUsers.map(acct => Users.findOne(Acct.parse(acct))));
diff --git a/packages/backend/src/server/api/endpoints/promo/read.ts b/packages/backend/src/server/api/endpoints/promo/read.ts
index 8d8c60d755..ea34ca3aad 100644
--- a/packages/backend/src/server/api/endpoints/promo/read.ts
+++ b/packages/backend/src/server/api/endpoints/promo/read.ts
@@ -1,22 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getNote } from '../../common/getters';
-import { PromoReads } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getNote } from '../../common/getters.js';
+import { PromoReads } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/request-reset-password.ts b/packages/backend/src/server/api/endpoints/request-reset-password.ts
index af1aeb4311..18cd98b164 100644
--- a/packages/backend/src/server/api/endpoints/request-reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/request-reset-password.ts
@@ -1,13 +1,12 @@
-import $ from 'cafy';
-import { publishMainStream } from '@/services/stream';
-import define from '../define';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../define.js';
import rndstr from 'rndstr';
-import config from '@/config/index';
+import config from '@/config/index.js';
import ms from 'ms';
-import { Users, UserProfiles, PasswordResetRequests } from '@/models/index';
-import { sendEmail } from '@/services/send-email';
-import { ApiError } from '../error';
-import { genId } from '@/misc/gen-id';
+import { Users, UserProfiles, PasswordResetRequests } from '@/models/index.js';
+import { sendEmail } from '@/services/send-email.js';
+import { ApiError } from '../error.js';
+import { genId } from '@/misc/gen-id.js';
import { IsNull } from 'typeorm';
export const meta = {
@@ -18,23 +17,22 @@ export const meta = {
max: 3,
},
- params: {
- username: {
- validator: $.str,
- },
+ errors: {
- email: {
- validator: $.str,
- },
},
+} as const;
- errors: {
-
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: { type: 'string' },
+ email: { type: 'string' },
},
+ required: ['username', 'email'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne({
usernameLower: ps.username.toLowerCase(),
host: IsNull(),
diff --git a/packages/backend/src/server/api/endpoints/reset-db.ts b/packages/backend/src/server/api/endpoints/reset-db.ts
index e99dc9db15..dbe64e9a13 100644
--- a/packages/backend/src/server/api/endpoints/reset-db.ts
+++ b/packages/backend/src/server/api/endpoints/reset-db.ts
@@ -1,21 +1,23 @@
-import $ from 'cafy';
-import define from '../define';
-import { ApiError } from '../error';
-import { resetDb } from '@/db/postgre';
+import define from '../define.js';
+import { ApiError } from '../error.js';
+import { resetDb } from '@/db/postgre.js';
export const meta = {
requireCredential: false,
- params: {
- },
-
errors: {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
if (process.env.NODE_ENV !== 'test') throw 'NODE_ENV is not a test';
await resetDb();
diff --git a/packages/backend/src/server/api/endpoints/reset-password.ts b/packages/backend/src/server/api/endpoints/reset-password.ts
index a7366584b1..3abf232af0 100644
--- a/packages/backend/src/server/api/endpoints/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/reset-password.ts
@@ -1,30 +1,28 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import { publishMainStream } from '@/services/stream';
-import define from '../define';
-import { Users, UserProfiles, PasswordResetRequests } from '@/models/index';
-import { ApiError } from '../error';
+import bcrypt from 'bcryptjs';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../define.js';
+import { Users, UserProfiles, PasswordResetRequests } from '@/models/index.js';
+import { ApiError } from '../error.js';
export const meta = {
requireCredential: false,
- params: {
- token: {
- validator: $.str,
- },
+ errors: {
- password: {
- validator: $.str,
- },
},
+} as const;
- errors: {
-
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
+ password: { type: 'string' },
},
+ required: ['token', 'password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const req = await PasswordResetRequests.findOneOrFail({
token: ps.token,
});
diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts
index 1ad2c54ab5..99f3730e97 100644
--- a/packages/backend/src/server/api/endpoints/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/server-info.ts
@@ -1,21 +1,21 @@
-import * as os from 'os';
-import * as si from 'systeminformation';
-import define from '../define';
+import * as os from 'node:os';
+import si from 'systeminformation';
+import define from '../define.js';
export const meta = {
requireCredential: false,
- desc: {
- },
-
tags: ['meta'],
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const memStats = await si.mem();
const fsStats = await si.fsSize();
diff --git a/packages/backend/src/server/api/endpoints/stats.ts b/packages/backend/src/server/api/endpoints/stats.ts
index 9879ef2adf..92fea4de6a 100644
--- a/packages/backend/src/server/api/endpoints/stats.ts
+++ b/packages/backend/src/server/api/endpoints/stats.ts
@@ -1,15 +1,12 @@
-import define from '../define';
-import { NoteReactions, Notes, Users } from '@/models/index';
-import { federationChart, driveChart } from '@/services/chart/index';
+import define from '../define.js';
+import { Instances, NoteReactions, Notes, Users } from '@/models/index.js';
+import { } from '@/services/chart/index.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -46,8 +43,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const [
notesCount,
originalNotesCount,
@@ -56,8 +59,6 @@ export default define(meta, async () => {
reactionsCount,
//originalReactionsCount,
instances,
- driveUsageLocal,
- driveUsageRemote,
] = await Promise.all([
Notes.count({ cache: 3600000 }), // 1 hour
Notes.count({ where: { userHost: null }, cache: 3600000 }),
@@ -65,9 +66,7 @@ export default define(meta, async () => {
Users.count({ where: { host: null }, cache: 3600000 }),
NoteReactions.count({ cache: 3600000 }), // 1 hour
//NoteReactions.count({ where: { userHost: null }, cache: 3600000 }),
- federationChart.getChart('hour', 1, null).then(chart => chart.instance.total[0]),
- driveChart.getChart('hour', 1, null).then(chart => chart.local.totalSize[0]),
- driveChart.getChart('hour', 1, null).then(chart => chart.remote.totalSize[0]),
+ Instances.count({ cache: 3600000 }),
]);
return {
@@ -78,7 +77,7 @@ export default define(meta, async () => {
reactionsCount,
//originalReactionsCount,
instances,
- driveUsageLocal,
- driveUsageRemote,
+ driveUsageLocal: 0,
+ driveUsageRemote: 0,
};
});
diff --git a/packages/backend/src/server/api/endpoints/sw/register.ts b/packages/backend/src/server/api/endpoints/sw/register.ts
index ae3e9ce77a..6c7714e19b 100644
--- a/packages/backend/src/server/api/endpoints/sw/register.ts
+++ b/packages/backend/src/server/api/endpoints/sw/register.ts
@@ -1,47 +1,42 @@
-import $ from 'cafy';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { genId } from '@/misc/gen-id';
-import { SwSubscriptions } from '@/models/index';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { genId } from '@/misc/gen-id.js';
+import { SwSubscriptions } from '@/models/index.js';
export const meta = {
tags: ['account'],
requireCredential: true,
- params: {
- endpoint: {
- validator: $.str,
- },
-
- auth: {
- validator: $.str,
- },
-
- publickey: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
properties: {
state: {
type: 'string',
- optional: false, nullable: false,
+ optional: true, nullable: false,
enum: ['already-subscribed', 'subscribed'],
},
key: {
type: 'string',
- optional: false, nullable: false,
+ optional: false, nullable: true,
},
},
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
+ auth: { type: 'string' },
+ publickey: { type: 'string' },
+ },
+ required: ['endpoint', 'auth', 'publickey'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// if already subscribed
const exist = await SwSubscriptions.findOne({
userId: user.id,
@@ -54,7 +49,7 @@ export default define(meta, async (ps, user) => {
if (exist != null) {
return {
- state: 'already-subscribed',
+ state: 'already-subscribed' as const,
key: instance.swPublicKey,
};
}
@@ -69,7 +64,7 @@ export default define(meta, async (ps, user) => {
});
return {
- state: 'subscribed',
+ state: 'subscribed' as const,
key: instance.swPublicKey,
};
});
diff --git a/packages/backend/src/server/api/endpoints/sw/unregister.ts b/packages/backend/src/server/api/endpoints/sw/unregister.ts
index 6f569e9417..9748f2a222 100644
--- a/packages/backend/src/server/api/endpoints/sw/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/sw/unregister.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../define';
-import { SwSubscriptions } from '../../../../models';
+import define from '../../define.js';
+import { SwSubscriptions } from '@/models/index.js';
export const meta = {
tags: ['account'],
requireCredential: true,
+} as const;
- params: {
- endpoint: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
},
+ required: ['endpoint'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await SwSubscriptions.delete({
userId: user.id,
endpoint: ps.endpoint,
diff --git a/packages/backend/src/server/api/endpoints/test.ts b/packages/backend/src/server/api/endpoints/test.ts
new file mode 100644
index 0000000000..256da1a66f
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/test.ts
@@ -0,0 +1,22 @@
+import define from '../define.js';
+
+export const meta = {
+ requireCredential: false,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ required: { type: 'boolean' },
+ string: { type: 'string' },
+ default: { type: 'string', default: 'hello' },
+ nullableDefault: { type: 'string', nullable: true, default: 'hello' },
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['required'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, me) => {
+ return ps;
+});
diff --git a/packages/backend/src/server/api/endpoints/username/available.ts b/packages/backend/src/server/api/endpoints/username/available.ts
index 74120fc406..5a1c4128ab 100644
--- a/packages/backend/src/server/api/endpoints/username/available.ts
+++ b/packages/backend/src/server/api/endpoints/username/available.ts
@@ -1,18 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Users, UsedUsernames } from '@/models/index';
+import define from '../../define.js';
+import { Users, UsedUsernames } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- username: {
- validator: $.use(Users.validateLocalUsername),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -25,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: Users.localUsernameSchema,
+ },
+ required: ['username'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
// Get exist
const exist = await Users.count({
host: null,
diff --git a/packages/backend/src/server/api/endpoints/users.ts b/packages/backend/src/server/api/endpoints/users.ts
index 6b11ec0f01..10527d15cc 100644
--- a/packages/backend/src/server/api/endpoints/users.ts
+++ b/packages/backend/src/server/api/endpoints/users.ts
@@ -1,57 +1,13 @@
-import $ from 'cafy';
-import define from '../define';
-import { Users } from '@/models/index';
-import { generateMutedUserQueryForUsers } from '../common/generate-muted-user-query';
-import { generateBlockQueryForUsers } from '../common/generate-block-query';
+import define from '../define.js';
+import { Users } from '@/models/index.js';
+import { generateMutedUserQueryForUsers } from '../common/generate-muted-user-query.js';
+import { generateBlockQueryForUsers } from '../common/generate-block-query.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str.or([
- '+follower',
- '-follower',
- '+createdAt',
- '-createdAt',
- '+updatedAt',
- '-updatedAt',
- ]),
- },
-
- state: {
- validator: $.optional.str.or([
- 'all',
- 'admin',
- 'moderator',
- 'adminOrModerator',
- 'alive',
- ]),
- default: 'all',
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +19,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
+ state: { type: 'string', enum: ['all', 'admin', 'moderator', 'adminOrModerator', 'alive'], default: "all" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user');
query.where('user.isExplorable = TRUE');
@@ -93,7 +61,7 @@ export default define(meta, async (ps, me) => {
if (me) generateMutedUserQueryForUsers(query, me);
if (me) generateBlockQueryForUsers(query, me);
- query.take(ps.limit!);
+ query.take(ps.limit);
query.skip(ps.offset);
const users = await query.getMany();
diff --git a/packages/backend/src/server/api/endpoints/users/clips.ts b/packages/backend/src/server/api/endpoints/users/clips.ts
index d4152fbf50..424c594749 100644
--- a/packages/backend/src/server/api/endpoints/users/clips.ts
+++ b/packages/backend/src/server/api/endpoints/users/clips.ts
@@ -1,40 +1,30 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Clips } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Clips } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'clips'],
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Clips.createQueryBuilder('clip'), ps.sinceId, ps.untilId)
.andWhere(`clip.userId = :userId`, { userId: ps.userId })
.andWhere('clip.isPublic = true');
const clips = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Clips.packMany(clips);
diff --git a/packages/backend/src/server/api/endpoints/users/followers.ts b/packages/backend/src/server/api/endpoints/users/followers.ts
index 6214ab40ba..1e104b6bcc 100644
--- a/packages/backend/src/server/api/endpoints/users/followers.ts
+++ b/packages/backend/src/server/api/endpoints/users/followers.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users, Followings, UserProfiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { toPunyNullable } from '@/misc/convert-host';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- username: {
- validator: $.optional.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +34,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ username: { type: 'string' },
+ host: { type: 'string', nullable: true },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId != null
? { id: ps.userId }
: { usernameLower: ps.username!.toLowerCase(), host: toPunyNullable(ps.host) });
@@ -98,7 +82,7 @@ export default define(meta, async (ps, me) => {
.innerJoinAndSelect('following.follower', 'follower');
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollower: true });
diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts
index 76112eab25..b0a1036c76 100644
--- a/packages/backend/src/server/api/endpoints/users/following.ts
+++ b/packages/backend/src/server/api/endpoints/users/following.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users, Followings, UserProfiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { toPunyNullable } from '@/misc/convert-host';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- username: {
- validator: $.optional.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +34,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ username: { type: 'string' },
+ host: { type: 'string', nullable: true },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId != null
? { id: ps.userId }
: { usernameLower: ps.username!.toLowerCase(), host: toPunyNullable(ps.host) });
@@ -98,7 +82,7 @@ export default define(meta, async (ps, me) => {
.innerJoinAndSelect('following.followee', 'followee');
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
index c5f08b4c94..d7c435256c 100644
--- a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
@@ -1,39 +1,29 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { GalleryPosts } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { GalleryPosts } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'gallery'],
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(GalleryPosts.createQueryBuilder('post'), ps.sinceId, ps.untilId)
.andWhere(`post.userId = :userId`, { userId: ps.userId });
const posts = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await GalleryPosts.packMany(posts, user);
diff --git a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
index d886d3355a..73cadc0df7 100644
--- a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
+++ b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
@@ -1,28 +1,15 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { maximum } from '@/prelude/array';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
+import define from '../../define.js';
+import { maximum } from '@/prelude/array.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
import { Not, In, IsNull } from 'typeorm';
-import { Notes, Users } from '@/models/index';
+import { Notes, Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -52,8 +39,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Lookup user
const user = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
@@ -104,7 +100,7 @@ export default define(meta, async (ps, me) => {
const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]);
// Extract top replied users
- const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit!);
+ const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit);
// Make replies object (includes weights)
const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({
diff --git a/packages/backend/src/server/api/endpoints/users/groups/create.ts b/packages/backend/src/server/api/endpoints/users/groups/create.ts
index 25e29de01c..9f6d8464d8 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/create.ts
@@ -1,9 +1,8 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserGroup } from '@/models/entities/user-group';
-import { UserGroupJoining } from '@/models/entities/user-group-joining';
+import define from '../../../define.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
export const meta = {
tags: ['groups'],
@@ -12,12 +11,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -25,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userGroup = await UserGroups.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/users/groups/delete.ts b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
index f30ab78ca0..f4898a3c7c 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userGroup = await UserGroups.findOne({
id: ps.groupId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
index 7061db538b..efbdf968f6 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../../define';
-import { ApiError } from '../../../../error';
-import { UserGroupJoinings, UserGroupInvitations } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserGroupJoining } from '@/models/entities/user-group-joining';
+import define from '../../../../define.js';
+import { ApiError } from '../../../../error.js';
+import { UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
export const meta = {
tags: ['groups', 'users'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- invitationId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchInvitation: {
message: 'No such invitation.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ invitationId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['invitationId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the invitation
const invitation = await UserGroupInvitations.findOne({
id: ps.invitationId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
index f5ca3dec8b..fe5d431eab 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../../define';
-import { ApiError } from '../../../../error';
-import { UserGroupInvitations } from '@/models/index';
+import define from '../../../../define.js';
+import { ApiError } from '../../../../error.js';
+import { UserGroupInvitations } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- invitationId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchInvitation: {
message: 'No such invitation.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ invitationId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['invitationId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the invitation
const invitation = await UserGroupInvitations.findOne({
id: ps.invitationId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invite.ts b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
index 3b7a4edb81..10bfb7eca1 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invite.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserGroups, UserGroupJoinings, UserGroupInvitations } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserGroupInvitation } from '@/models/entities/user-group-invitation';
-import { createNotification } from '@/services/create-notification';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserGroups, UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserGroupInvitation } from '@/models/entities/user-group-invitation.js';
+import { createNotification } from '@/services/create-notification.js';
export const meta = {
tags: ['groups', 'users'],
@@ -15,16 +13,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -52,8 +40,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/joined.ts b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
index ab48b1910d..e52de78595 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/joined.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import { Not, In } from 'typeorm';
export const meta = {
@@ -20,8 +20,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ownedGroups = await UserGroups.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/users/groups/leave.ts b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
index d2fcdab301..c1a8c2c024 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/leave.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/owned.ts b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
index 6193a71019..11aad0f73c 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/owned.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { UserGroups } from '@/models/index';
+import define from '../../../define.js';
+import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const userGroups = await UserGroups.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/users/groups/pull.ts b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
index 785bea140d..55ec9f915b 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -43,8 +31,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/show.ts b/packages/backend/src/server/api/endpoints/users/groups/show.ts
index eb26eac2a8..28ca1162c8 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
index 4b1c8fbbdb..f48e1ddbf0 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -49,8 +37,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/update.ts b/packages/backend/src/server/api/endpoints/users/groups/update.ts
index 6caf903555..b3e17dfd9e 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups'],
@@ -11,16 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -36,8 +24,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['groupId', 'name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/create.ts b/packages/backend/src/server/api/endpoints/users/lists/create.ts
index 945b511628..1a0599f9e7 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/create.ts
@@ -1,8 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { UserLists } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserList } from '@/models/entities/user-list';
+import define from '../../../define.js';
+import { UserLists } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserList } from '@/models/entities/user-list.js';
export const meta = {
tags: ['lists'],
@@ -11,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -24,8 +17,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userList = await UserLists.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/users/lists/delete.ts b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
index 3183d2a09c..aeefb98c83 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchList: {
message: 'No such list.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userList = await UserLists.findOne({
id: ps.listId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/list.ts b/packages/backend/src/server/api/endpoints/users/lists/list.ts
index ae66b0aacc..a8663ada8a 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/list.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const userLists = await UserLists.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/users/lists/pull.ts b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
index 4c74aefa8a..2c4c61d51e 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishUserListStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserLists, UserListJoinings, Users } from '@/models/index';
+import { publishUserListStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserLists, UserListJoinings, Users } from '@/models/index.js';
export const meta = {
tags: ['lists', 'users'],
@@ -13,16 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchList: {
message: 'No such list.',
@@ -38,8 +26,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/push.ts b/packages/backend/src/server/api/endpoints/users/lists/push.ts
index 8b50c475b0..034a9d2db6 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/push.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/push.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { pushUserToUserList } from '@/services/user-list/push';
-import { UserLists, UserListJoinings, Blockings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { pushUserToUserList } from '@/services/user-list/push.js';
+import { UserLists, UserListJoinings, Blockings } from '@/models/index.js';
export const meta = {
tags: ['lists', 'users'],
@@ -13,16 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchList: {
message: 'No such list.',
@@ -50,8 +38,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/show.ts b/packages/backend/src/server/api/endpoints/users/lists/show.ts
index 06555c1a88..fadb94c90e 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/update.ts b/packages/backend/src/server/api/endpoints/users/lists/update.ts
index 02b0d5fe18..5ec99031e1 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists'],
@@ -11,16 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -36,8 +24,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['listId', 'name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index 99158fb0ae..16318d2225 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -1,70 +1,17 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { Brackets } from 'typeorm';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
export const meta = {
tags: ['users', 'notes'],
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- includeReplies: {
- validator: $.optional.bool,
- default: true,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- default: false,
- },
-
- fileType: {
- validator: $.optional.arr($.str),
- },
-
- excludeNsfw: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -84,8 +31,28 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ includeReplies: { type: 'boolean', default: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean', default: false },
+ fileType: { type: 'array', items: {
+ type: 'string',
+ } },
+ excludeNsfw: { type: 'boolean', default: false },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Lookup user
const user = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
@@ -96,10 +63,16 @@ export default define(meta, async (ps, me) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('note.userId = :userId', { userId: user.id })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
if (me) generateMutedUserQuery(query, me, user);
@@ -141,7 +114,7 @@ export default define(meta, async (ps, me) => {
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
return await Notes.packMany(timeline, me);
});
diff --git a/packages/backend/src/server/api/endpoints/users/pages.ts b/packages/backend/src/server/api/endpoints/users/pages.ts
index 6e003dd1af..b8b3e8192e 100644
--- a/packages/backend/src/server/api/endpoints/users/pages.ts
+++ b/packages/backend/src/server/api/endpoints/users/pages.ts
@@ -1,40 +1,30 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Pages } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Pages } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'pages'],
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Pages.createQueryBuilder('page'), ps.sinceId, ps.untilId)
.andWhere(`page.userId = :userId`, { userId: ps.userId })
.andWhere('page.visibility = \'public\'');
const pages = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Pages.packMany(pages);
diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts
index 312d4dbf23..7b55a16711 100644
--- a/packages/backend/src/server/api/endpoints/users/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/users/reactions.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { NoteReactions, UserProfiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { NoteReactions, UserProfiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['users', 'reactions'],
requireCredential: false,
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -57,8 +28,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const profile = await UserProfiles.findOneOrFail(ps.userId);
if (me == null || (me.id !== ps.userId && !profile.publicReactions)) {
@@ -73,7 +57,7 @@ export default define(meta, async (ps, me) => {
generateVisibilityQuery(query, me);
const reactions = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Promise.all(reactions.map(reaction => NoteReactions.pack(reaction, me, { withNote: true })));
diff --git a/packages/backend/src/server/api/endpoints/users/recommendation.ts b/packages/backend/src/server/api/endpoints/users/recommendation.ts
index 9ea39eb2dd..a8f18de522 100644
--- a/packages/backend/src/server/api/endpoints/users/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/users/recommendation.ts
@@ -1,9 +1,8 @@
import ms from 'ms';
-import $ from 'cafy';
-import define from '../../define';
-import { Users, Followings } from '@/models/index';
-import { generateMutedUserQueryForUsers } from '../../common/generate-muted-user-query';
-import { generateBlockedUserQuery, generateBlockQueryForUsers } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { Users, Followings } from '@/models/index.js';
+import { generateMutedUserQueryForUsers } from '../../common/generate-muted-user-query.js';
+import { generateBlockedUserQuery, generateBlockQueryForUsers } from '../../common/generate-block-query.js';
export const meta = {
tags: ['users'],
@@ -12,18 +11,6 @@ export const meta = {
kind: 'read:account',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -35,8 +22,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user')
.where('user.isLocked = FALSE')
.andWhere('user.isExplorable = TRUE')
@@ -58,7 +54,7 @@ export default define(meta, async (ps, me) => {
query.setParameters(followingQuery.getParameters());
- const users = await query.take(ps.limit!).skip(ps.offset).getMany();
+ const users = await query.take(ps.limit).skip(ps.offset).getMany();
return await Users.packMany(users, me, { detail: true });
});
diff --git a/packages/backend/src/server/api/endpoints/users/relation.ts b/packages/backend/src/server/api/endpoints/users/relation.ts
index 7e319ca105..c6262122d4 100644
--- a/packages/backend/src/server/api/endpoints/users/relation.ts
+++ b/packages/backend/src/server/api/endpoints/users/relation.ts
@@ -1,19 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ID } from '@/misc/cafy-id';
-import { Users } from '@/models/index';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: true,
- params: {
- userId: {
- validator: $.either($.type(ID), $.arr($.type(ID)).unique()),
- },
- },
-
res: {
optional: false, nullable: false,
oneOf: [
@@ -101,8 +93,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: {
+ anyOf: [
+ { type: 'string', format: 'misskey:id' },
+ {
+ type: 'array',
+ items: { type: 'string', format: 'misskey:id' },
+ },
+ ],
+ },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ids = Array.isArray(ps.userId) ? ps.userId : [ps.userId];
const relations = await Promise.all(ids.map(id => Users.getRelation(me.id, id)));
diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
index ed2aa7bb26..e091b8e1b1 100644
--- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts
+++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
@@ -1,30 +1,18 @@
-import $ from 'cafy';
import * as sanitizeHtml from 'sanitize-html';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { publishAdminStream } from '@/services/stream';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { AbuseUserReports, Users } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { sendEmail } from '@/services/send-email';
-import { fetchMeta } from '@/misc/fetch-meta';
+import define from '../../define.js';
+import { publishAdminStream } from '@/services/stream.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { AbuseUserReports, Users } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { sendEmail } from '@/services/send-email.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
export const meta = {
tags: ['users'],
requireCredential: true,
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- comment: {
- validator: $.str.range(1, 2048),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -46,8 +34,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ comment: { type: 'string', minLength: 1, maxLength: 2048 },
+ },
+ required: ['userId', 'comment'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Lookup user
const user = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
index d67625e624..897b5de3fe 100644
--- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
+++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
@@ -1,35 +1,14 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Followings, Users } from '@/models/index';
+import define from '../../define.js';
+import { Followings, Users } from '@/models/index.js';
import { Brackets } from 'typeorm';
-import { USER_ACTIVE_THRESHOLD } from '@/const';
-import { User } from '@/models/entities/user';
+import { USER_ACTIVE_THRESHOLD } from '@/const.js';
+import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- username: {
- validator: $.optional.nullable.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- detail: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -41,8 +20,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: { type: 'string', nullable: true },
+ host: { type: 'string', nullable: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ detail: { type: 'boolean', default: true },
+ },
+ required: [],
+} as const;
+
+// TODO: avatar,bannerをJOINしたいけどエラーになる
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日
if (ps.host) {
@@ -57,7 +49,7 @@ export default define(meta, async (ps, me) => {
q.andWhere('user.updatedAt IS NOT NULL');
q.orderBy('user.updatedAt', 'DESC');
- const users = await q.take(ps.limit!).getMany();
+ const users = await q.take(ps.limit).getMany();
return await Users.packMany(users, me, { detail: ps.detail });
} else if (ps.username) {
@@ -82,10 +74,10 @@ export default define(meta, async (ps, me) => {
users = await query
.orderBy('user.usernameLower', 'ASC')
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
- if (users.length < ps.limit!) {
+ if (users.length < ps.limit) {
const otherQuery = await Users.createQueryBuilder('user')
.where(`user.id NOT IN (${ followingQuery.getQuery() })`)
.andWhere(`user.id != :meId`, { meId: me.id })
@@ -97,7 +89,7 @@ export default define(meta, async (ps, me) => {
const otherUsers = await otherQuery
.orderBy('user.updatedAt', 'DESC')
- .take(ps.limit! - users.length)
+ .take(ps.limit - users.length)
.getMany();
users = users.concat(otherUsers);
@@ -108,10 +100,12 @@ export default define(meta, async (ps, me) => {
.andWhere('user.usernameLower LIKE :username', { username: ps.username.toLowerCase() + '%' })
.andWhere('user.updatedAt IS NOT NULL')
.orderBy('user.updatedAt', 'DESC')
- .take(ps.limit! - users.length)
+ .take(ps.limit - users.length)
.getMany();
}
return await Users.packMany(users, me, { detail: !!ps.detail });
}
+
+ return [];
});
diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts
index 26f818afcc..a72a58a843 100644
--- a/packages/backend/src/server/api/endpoints/users/search.ts
+++ b/packages/backend/src/server/api/endpoints/users/search.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { UserProfiles, Users } from '@/models/index';
-import { User } from '@/models/entities/user';
+import define from '../../define.js';
+import { UserProfiles, Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -9,32 +8,6 @@ export const meta = {
requireCredential: false,
- params: {
- query: {
- validator: $.str,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- origin: {
- validator: $.optional.str.or(['local', 'remote', 'combined']),
- default: 'combined',
- },
-
- detail: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +19,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string' },
+ offset: { type: 'integer', default: 0 },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ origin: { type: 'string', enum: ['local', 'remote', 'combined'], default: "combined" },
+ detail: { type: 'boolean', default: true },
+ },
+ required: ['query'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日
const isUsername = ps.query.startsWith('@');
@@ -71,7 +56,7 @@ export default define(meta, async (ps, me) => {
users = await usernameQuery
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany();
} else {
@@ -91,11 +76,11 @@ export default define(meta, async (ps, me) => {
users = await nameQuery
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany();
- if (users.length < ps.limit!) {
+ if (users.length < ps.limit) {
const profQuery = UserProfiles.createQueryBuilder('prof')
.select('prof.userId')
.where('prof.description ILIKE :query', { query: '%' + ps.query + '%' });
@@ -117,7 +102,7 @@ export default define(meta, async (ps, me) => {
users = users.concat(await query
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany()
);
diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts
index 92910e9ed8..263c102a7a 100644
--- a/packages/backend/src/server/api/endpoints/users/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/show.ts
@@ -1,36 +1,16 @@
-import $ from 'cafy';
-import { resolveUser } from '@/remote/resolve-user';
-import define from '../../define';
-import { apiLogger } from '../../logger';
-import { ApiError } from '../../error';
-import { ID } from '@/misc/cafy-id';
-import { Users } from '@/models/index';
+import { resolveUser } from '@/remote/resolve-user.js';
+import define from '../../define.js';
+import { apiLogger } from '../../logger.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
import { In } from 'typeorm';
-import { User } from '@/models/entities/user';
+import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- userIds: {
- validator: $.optional.arr($.type(ID)).unique(),
- },
-
- username: {
- validator: $.optional.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
- },
-
res: {
optional: false, nullable: false,
oneOf: [
@@ -64,8 +44,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ userIds: { type: 'array', uniqueItems: true, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ username: { type: 'string' },
+ host: { type: 'string', nullable: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
let user;
const isAdminOrModerator = me && (me.isAdmin || me.isModerator);
diff --git a/packages/backend/src/server/api/endpoints/users/stats.ts b/packages/backend/src/server/api/endpoints/users/stats.ts
index 381e433479..180a9386d3 100644
--- a/packages/backend/src/server/api/endpoints/users/stats.ts
+++ b/packages/backend/src/server/api/endpoints/users/stats.ts
@@ -1,20 +1,12 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { ID } from '@/misc/cafy-id';
-import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, Users } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -24,8 +16,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId);
if (user == null) {
throw new ApiError(meta.errors.noSuchUser);