diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 1cc3829b72..0510a50284 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -41,8 +41,6 @@ import {UserPublickey} from "@/models/entities/user-publickey.js"; import {UserProfile} from "@/models/entities/user-profile.js"; import {UserSecurityKey} from "@/models/entities/user-security-key.js"; import {AttestationChallenge} from "@/models/entities/attestation-challenge.js"; -import {GalleryPost} from "@/models/entities/gallery-post.js"; -import {GalleryLike} from "@/models/entities/gallery-like.js"; import {ModerationLog} from "@/models/entities/moderation-log.js"; import {UsedUsername} from "@/models/entities/used-username.js"; import {Announcement} from "@/models/entities/announcement.js"; @@ -134,8 +132,6 @@ export const entities = [ NoteWatching, NoteThreadMuting, NoteUnread, - GalleryPost, - GalleryLike, DriveFile, DriveFolder, Poll, diff --git a/packages/backend/src/misc/api-permissions.ts b/packages/backend/src/misc/api-permissions.ts index 371686a714..1ab53a14da 100644 --- a/packages/backend/src/misc/api-permissions.ts +++ b/packages/backend/src/misc/api-permissions.ts @@ -16,10 +16,6 @@ export const kinds = [ "write:notifications", "read:reactions", "write:reactions", - "write:votes", - "read:gallery", - "write:gallery", - "read:gallery-likes", - "write:gallery-likes", + "write:votes" ]; // IF YOU ADD KINDS(PERMISSIONS), YOU MUST ADD TRANSLATIONS (under _permissions). diff --git a/packages/backend/src/misc/schema.ts b/packages/backend/src/misc/schema.ts index 7fbb023072..7960cbeb10 100644 --- a/packages/backend/src/misc/schema.ts +++ b/packages/backend/src/misc/schema.ts @@ -24,7 +24,6 @@ import {packedAntennaSchema} from "@/models/schema/antenna.js"; import {packedClipSchema} from "@/models/schema/clip.js"; import {packedFederationInstanceSchema} from "@/models/schema/federation-instance.js"; import {packedQueueCountSchema} from "@/models/schema/queue.js"; -import {packedGalleryPostSchema} from "@/models/schema/gallery-post.js"; import {packedEmojiSchema} from "@/models/schema/emoji.js"; import {packedNoteEdit} from "@/models/schema/note-edit.js"; @@ -55,7 +54,6 @@ export const refs = { Antenna: packedAntennaSchema, Clip: packedClipSchema, FederationInstance: packedFederationInstanceSchema, - GalleryPost: packedGalleryPostSchema, Emoji: packedEmojiSchema, }; diff --git a/packages/backend/src/models/entities/gallery-like.ts b/packages/backend/src/models/entities/gallery-like.ts deleted file mode 100644 index 259feb8bbb..0000000000 --- a/packages/backend/src/models/entities/gallery-like.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - PrimaryColumn, - Entity, - Index, - JoinColumn, - Column, - ManyToOne, -} from "typeorm"; -import { User } from "./user.js"; -import { id } from "../id.js"; -import { GalleryPost } from "./gallery-post.js"; - -@Entity() -@Index(["userId", "postId"], { unique: true }) -export class GalleryLike { - @PrimaryColumn(id()) - public id: string; - - @Column("timestamp with time zone") - public createdAt: Date; - - @Index() - @Column(id()) - public userId: User["id"]; - - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - - @Column(id()) - public postId: GalleryPost["id"]; - - @ManyToOne((type) => GalleryPost, { - onDelete: "CASCADE", - }) - @JoinColumn() - public post: GalleryPost | null; -} diff --git a/packages/backend/src/models/entities/gallery-post.ts b/packages/backend/src/models/entities/gallery-post.ts deleted file mode 100644 index 938348659d..0000000000 --- a/packages/backend/src/models/entities/gallery-post.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { - Entity, - Index, - JoinColumn, - Column, - PrimaryColumn, - ManyToOne, -} from "typeorm"; -import { User } from "./user.js"; -import { id } from "../id.js"; -import type { DriveFile } from "./drive-file.js"; - -@Entity() -export class GalleryPost { - @PrimaryColumn(id()) - public id: string; - - @Index() - @Column("timestamp with time zone", { - comment: "The created date of the GalleryPost.", - }) - public createdAt: Date; - - @Index() - @Column("timestamp with time zone", { - comment: "The updated date of the GalleryPost.", - }) - public updatedAt: Date; - - @Column("varchar", { - length: 256, - }) - public title: string; - - @Column("varchar", { - length: 2048, - nullable: true, - }) - public description: string | null; - - @Index() - @Column({ - ...id(), - comment: "The ID of author.", - }) - public userId: User["id"]; - - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - - @Index() - @Column({ - ...id(), - array: true, - default: "{}", - }) - public fileIds: DriveFile["id"][]; - - @Index() - @Column("boolean", { - default: false, - comment: "Whether the post is sensitive.", - }) - public isSensitive: boolean; - - @Index() - @Column("integer", { - default: 0, - }) - public likedCount: number; - - @Index() - @Column("varchar", { - length: 128, - array: true, - default: "{}", - }) - public tags: string[]; - - constructor(data: Partial) { - if (data == null) return; - - for (const [k, v] of Object.entries(data)) { - (this as any)[k] = v; - } - } -} diff --git a/packages/backend/src/models/index.ts b/packages/backend/src/models/index.ts index 0089b5b261..bbe481f4c4 100644 --- a/packages/backend/src/models/index.ts +++ b/packages/backend/src/models/index.ts @@ -35,8 +35,6 @@ import {UserProfile} from "./entities/user-profile.js"; import {AttestationChallenge} from "./entities/attestation-challenge.js"; import {UserSecurityKey} from "./entities/user-security-key.js"; import {HashtagRepository} from "./repositories/hashtag.js"; -import {GalleryPostRepository} from "./repositories/gallery-post.js"; -import {GalleryLikeRepository} from "./repositories/gallery-like.js"; import {ModerationLogRepository} from "./repositories/moderation-logs.js"; import {UsedUsername} from "./entities/used-username.js"; import {ClipRepository} from "./repositories/clip.js"; @@ -98,8 +96,6 @@ export const RegistrationTickets = db.getRepository(RegistrationTicket); export const AuthSessions = AuthSessionRepository; export const AccessTokens = db.getRepository(AccessToken); export const Signins = SigninRepository; -export const GalleryPosts = GalleryPostRepository; -export const GalleryLikes = GalleryLikeRepository; export const ModerationLogs = ModerationLogRepository; export const Clips = ClipRepository; export const ClipNotes = db.getRepository(ClipNote); diff --git a/packages/backend/src/models/repositories/gallery-like.ts b/packages/backend/src/models/repositories/gallery-like.ts deleted file mode 100644 index c8920d1ee6..0000000000 --- a/packages/backend/src/models/repositories/gallery-like.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { db } from "@/db/postgre.js"; -import { GalleryLike } from "@/models/entities/gallery-like.js"; -import { GalleryPosts } from "../index.js"; - -export const GalleryLikeRepository = db.getRepository(GalleryLike).extend({ - async pack(src: GalleryLike["id"] | GalleryLike, me?: any) { - const like = - typeof src === "object" ? src : await this.findOneByOrFail({ id: src }); - - return { - id: like.id, - post: await GalleryPosts.pack(like.post || like.postId, me), - }; - }, - - packMany(likes: any[], me: any) { - return Promise.all(likes.map((x) => this.pack(x, me))); - }, -}); diff --git a/packages/backend/src/models/repositories/gallery-post.ts b/packages/backend/src/models/repositories/gallery-post.ts deleted file mode 100644 index b4206b0bf4..0000000000 --- a/packages/backend/src/models/repositories/gallery-post.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { db } from "@/db/postgre.js"; -import { GalleryPost } from "@/models/entities/gallery-post.js"; -import type { Packed } from "@/misc/schema.js"; -import { Users, DriveFiles, GalleryLikes } from "../index.js"; -import { awaitAll } from "@/prelude/await-all.js"; -import type { User } from "@/models/entities/user.js"; - -export const GalleryPostRepository = db.getRepository(GalleryPost).extend({ - async pack( - src: GalleryPost["id"] | GalleryPost, - me?: { id: User["id"] } | null | undefined, - ): Promise> { - const meId = me ? me.id : null; - const post = - typeof src === "object" ? src : await this.findOneByOrFail({ id: src }); - - return await awaitAll({ - id: post.id, - createdAt: post.createdAt.toISOString(), - updatedAt: post.updatedAt.toISOString(), - userId: post.userId, - user: Users.pack(post.user || post.userId, me), - title: post.title, - description: post.description, - fileIds: post.fileIds, - files: DriveFiles.packMany(post.fileIds), - tags: post.tags.length > 0 ? post.tags : undefined, - isSensitive: post.isSensitive, - likedCount: post.likedCount, - isLiked: meId - ? await GalleryLikes.findOneBy({ postId: post.id, userId: meId }).then( - (x) => x != null, - ) - : undefined, - }); - }, - - packMany(posts: GalleryPost[], me?: { id: User["id"] } | null | undefined) { - return Promise.all(posts.map((x) => this.pack(x, me))); - }, -}); diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index b97d068f34..b145857915 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -1,8 +1,6 @@ import {Note} from "@/models/entities/note.js"; import type {User} from "@/models/entities/user.js"; -import {Followings, NoteReactions, Polls, PollVotes, Users,} from "../index.js"; -import {convertLegacyReaction,} from "@/misc/reaction-lib.js"; -import type {NoteReaction} from "@/models/entities/note-reaction.js"; +import {Followings, Polls, PollVotes, Users,} from "../index.js"; import {db} from "@/db/postgre.js"; export async function populatePoll(note: Note, meId: User["id"] | null) { @@ -43,35 +41,6 @@ export async function populatePoll(note: Note, meId: User["id"] | null) { }; } -async function populateMyReaction( - note: Note, - meId: User["id"], - _hint_?: { - myReactions: Map; - }, -) { - if (_hint_?.myReactions) { - const reaction = _hint_.myReactions.get(note.id); - if (reaction) { - return convertLegacyReaction(reaction.reaction); - } else if (reaction === null) { - return undefined; - } - // 実装上抜けがあるだけかもしれないので、「ヒントに含まれてなかったら(=undefinedなら)return」のようにはしない - } - - const reaction = await NoteReactions.findOneBy({ - userId: meId, - noteId: note.id, - }); - - if (reaction) { - return convertLegacyReaction(reaction.reaction); - } - - return undefined; -} - export const NoteRepository = db.getRepository(Note).extend({ async isVisibleForMe(note: Note, meId: User["id"] | null): Promise { // This code must always be synchronized with the checks in generateVisibilityQuery. diff --git a/packages/backend/src/models/schema/gallery-post.ts b/packages/backend/src/models/schema/gallery-post.ts deleted file mode 100644 index 9ac348e1fb..0000000000 --- a/packages/backend/src/models/schema/gallery-post.ts +++ /dev/null @@ -1,83 +0,0 @@ -export const packedGalleryPostSchema = { - type: "object", - properties: { - id: { - type: "string", - optional: false, - nullable: false, - format: "id", - example: "xxxxxxxxxx", - }, - createdAt: { - type: "string", - optional: false, - nullable: false, - format: "date-time", - }, - updatedAt: { - type: "string", - optional: false, - nullable: false, - format: "date-time", - }, - title: { - type: "string", - optional: false, - nullable: false, - }, - description: { - type: "string", - optional: false, - nullable: true, - }, - userId: { - type: "string", - optional: false, - nullable: false, - format: "id", - }, - user: { - type: "object", - ref: "UserLite", - optional: false, - nullable: false, - }, - fileIds: { - type: "array", - optional: true, - nullable: false, - items: { - type: "string", - optional: false, - nullable: false, - format: "id", - }, - }, - files: { - type: "array", - optional: true, - nullable: false, - items: { - type: "object", - optional: false, - nullable: false, - ref: "DriveFile", - }, - }, - tags: { - type: "array", - optional: true, - nullable: false, - items: { - type: "string", - optional: false, - nullable: false, - }, - }, - isSensitive: { - type: "boolean", - optional: false, - nullable: false, - }, - }, -} as const; diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index 1778363329..7e0f0ba022 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -140,15 +140,6 @@ import * as ep___following_requests_accept from "./endpoints/following/requests/ import * as ep___following_requests_cancel from "./endpoints/following/requests/cancel.js"; import * as ep___following_requests_list from "./endpoints/following/requests/list.js"; import * as ep___following_requests_reject from "./endpoints/following/requests/reject.js"; -import * as ep___gallery_featured from "./endpoints/gallery/featured.js"; -import * as ep___gallery_popular from "./endpoints/gallery/popular.js"; -import * as ep___gallery_posts from "./endpoints/gallery/posts.js"; -import * as ep___gallery_posts_create from "./endpoints/gallery/posts/create.js"; -import * as ep___gallery_posts_delete from "./endpoints/gallery/posts/delete.js"; -import * as ep___gallery_posts_like from "./endpoints/gallery/posts/like.js"; -import * as ep___gallery_posts_show from "./endpoints/gallery/posts/show.js"; -import * as ep___gallery_posts_unlike from "./endpoints/gallery/posts/unlike.js"; -import * as ep___gallery_posts_update from "./endpoints/gallery/posts/update.js"; import * as ep___getOnlineUsersCount from "./endpoints/get-online-users-count.js"; import * as ep___hashtags_list from "./endpoints/hashtags/list.js"; import * as ep___hashtags_search from "./endpoints/hashtags/search.js"; @@ -175,8 +166,6 @@ import * as ep___i_exportNotes from "./endpoints/i/export-notes.js"; import * as ep___i_importPosts from "./endpoints/i/import-posts.js"; import * as ep___i_exportUserLists from "./endpoints/i/export-user-lists.js"; import * as ep___i_favorites from "./endpoints/i/favorites.js"; -import * as ep___i_gallery_likes from "./endpoints/i/gallery/likes.js"; -import * as ep___i_gallery_posts from "./endpoints/i/gallery/posts.js"; import * as ep___i_getWordMutedNotesCount from "./endpoints/i/get-word-muted-notes-count.js"; import * as ep___i_importBlocking from "./endpoints/i/import-blocking.js"; import * as ep___i_importFollowing from "./endpoints/i/import-following.js"; @@ -271,7 +260,6 @@ import * as ep___users from "./endpoints/users.js"; import * as ep___users_clips from "./endpoints/users/clips.js"; import * as ep___users_followers from "./endpoints/users/followers.js"; import * as ep___users_following from "./endpoints/users/following.js"; -import * as ep___users_gallery_posts from "./endpoints/users/gallery/posts.js"; import * as ep___users_getFrequentlyRepliedUsers from "./endpoints/users/get-frequently-replied-users.js"; import * as ep___users_lists_create from "./endpoints/users/lists/create.js"; import * as ep___users_lists_delete from "./endpoints/users/lists/delete.js"; @@ -284,7 +272,6 @@ import * as ep___users_lists_update from "./endpoints/users/lists/update.js"; import * as ep___users_notes from "./endpoints/users/notes.js"; import * as ep___users_reactions from "./endpoints/users/reactions.js"; import * as ep___users_recommendation from "./endpoints/users/recommendation.js"; -import * as ep___users_relation from "./endpoints/users/relation.js"; import * as ep___users_reportAbuse from "./endpoints/users/report-abuse.js"; import * as ep___users_searchByUsernameAndHost from "./endpoints/users/search-by-username-and-host.js"; import * as ep___users_search from "./endpoints/users/search.js"; @@ -443,15 +430,6 @@ const eps = [ ["following/requests/cancel", ep___following_requests_cancel], ["following/requests/list", ep___following_requests_list], ["following/requests/reject", ep___following_requests_reject], - ["gallery/featured", ep___gallery_featured], - ["gallery/popular", ep___gallery_popular], - ["gallery/posts", ep___gallery_posts], - ["gallery/posts/create", ep___gallery_posts_create], - ["gallery/posts/delete", ep___gallery_posts_delete], - ["gallery/posts/like", ep___gallery_posts_like], - ["gallery/posts/show", ep___gallery_posts_show], - ["gallery/posts/unlike", ep___gallery_posts_unlike], - ["gallery/posts/update", ep___gallery_posts_update], ["get-online-users-count", ep___getOnlineUsersCount], ["hashtags/list", ep___hashtags_list], ["hashtags/search", ep___hashtags_search], @@ -480,8 +458,6 @@ const eps = [ ["i/import-posts", ep___i_importPosts], ["i/export-user-lists", ep___i_exportUserLists], ["i/favorites", ep___i_favorites], - ["i/gallery/likes", ep___i_gallery_likes], - ["i/gallery/posts", ep___i_gallery_posts], ["i/get-word-muted-notes-count", ep___i_getWordMutedNotesCount], ["i/import-blocking", ep___i_importBlocking], ["i/import-following", ep___i_importFollowing], @@ -576,7 +552,6 @@ const eps = [ ["users/clips", ep___users_clips], ["users/followers", ep___users_followers], ["users/following", ep___users_following], - ["users/gallery/posts", ep___users_gallery_posts], ["users/get-frequently-replied-users", ep___users_getFrequentlyRepliedUsers], ["users/lists/create", ep___users_lists_create], ["users/lists/delete", ep___users_lists_delete], @@ -589,7 +564,6 @@ const eps = [ ["users/notes", ep___users_notes], ["users/reactions", ep___users_reactions], ["users/recommendation", ep___users_recommendation], - ["users/relation", ep___users_relation], ["users/report-abuse", ep___users_reportAbuse], ["users/search-by-username-and-host", ep___users_searchByUsernameAndHost], ["users/search", ep___users_search], diff --git a/packages/backend/src/server/api/endpoints/gallery/featured.ts b/packages/backend/src/server/api/endpoints/gallery/featured.ts deleted file mode 100644 index d478e8e3bf..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/featured.ts +++ /dev/null @@ -1,40 +0,0 @@ -import define from "../../define.js"; -import { GalleryPosts } from "@/models/index.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: false, - requireCredentialPrivateMode: true, - - res: { - type: "array", - optional: false, - nullable: false, - items: { - type: "object", - optional: false, - nullable: false, - ref: "GalleryPost", - }, - }, -} as const; - -export const paramDef = { - type: "object", - properties: {}, - required: [], -} as const; - -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") - .orderBy("post.likedCount", "DESC"); - - const posts = await query.take(10).getMany(); - - return await GalleryPosts.packMany(posts, me); -}); diff --git a/packages/backend/src/server/api/endpoints/gallery/popular.ts b/packages/backend/src/server/api/endpoints/gallery/popular.ts deleted file mode 100644 index 5eef68d971..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/popular.ts +++ /dev/null @@ -1,37 +0,0 @@ -import define from "../../define.js"; -import { GalleryPosts } from "@/models/index.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: false, - requireCredentialPrivateMode: true, - - res: { - type: "array", - optional: false, - nullable: false, - items: { - type: "object", - optional: false, - nullable: false, - ref: "GalleryPost", - }, - }, -} as const; - -export const paramDef = { - type: "object", - properties: {}, - required: [], -} as const; - -export default define(meta, paramDef, async (ps, me) => { - const query = GalleryPosts.createQueryBuilder("post") - .andWhere("post.likedCount > 0") - .orderBy("post.likedCount", "DESC"); - - const posts = await query.take(10).getMany(); - - return await GalleryPosts.packMany(posts, me); -}); diff --git a/packages/backend/src/server/api/endpoints/gallery/posts.ts b/packages/backend/src/server/api/endpoints/gallery/posts.ts deleted file mode 100644 index f97c161aff..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts.ts +++ /dev/null @@ -1,42 +0,0 @@ -import define from "../../define.js"; -import { makePaginationQuery } from "../../common/make-pagination-query.js"; -import { GalleryPosts } from "@/models/index.js"; - -export const meta = { - tags: ["gallery"], - requireCredentialPrivateMode: true, - - res: { - type: "array", - optional: false, - nullable: false, - items: { - 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; - -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(); - - 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 deleted file mode 100644 index f3b3768e28..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts +++ /dev/null @@ -1,81 +0,0 @@ -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 type { DriveFile } from "@/models/entities/drive-file.js"; -import { HOUR } from "@/const.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: true, - - kind: "write:gallery", - - limit: { - duration: HOUR, - max: 300, - }, - - res: { - type: "object", - optional: false, - nullable: false, - ref: "GalleryPost", - }, - - errors: {}, -} 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; - -export default define(meta, paramDef, async (ps, user) => { - const files = ( - await Promise.all( - ps.fileIds.map((fileId) => - DriveFiles.findOneBy({ - id: fileId, - userId: user.id, - }), - ), - ) - ).filter((file): file is DriveFile => file != null); - - if (files.length === 0) { - throw new Error(); - } - - const post = await GalleryPosts.insert( - new GalleryPost({ - id: genId(), - createdAt: new Date(), - updatedAt: new Date(), - title: ps.title, - description: ps.description, - userId: user.id, - isSensitive: ps.isSensitive, - fileIds: files.map((file) => file.id), - }), - ).then((x) => GalleryPosts.findOneByOrFail(x.identifiers[0])); - - return await GalleryPosts.pack(post, user); -}); diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts deleted file mode 100644 index 9fd9a50099..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts +++ /dev/null @@ -1,40 +0,0 @@ -import define from "../../../define.js"; -import { ApiError } from "../../../error.js"; -import { GalleryPosts } from "@/models/index.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: true, - - kind: "write:gallery", - - errors: { - noSuchPost: { - message: "No such post.", - code: "NO_SUCH_POST", - id: "ae52f367-4bd7-4ecd-afc6-5672fff427f5", - }, - }, -} as const; - -export const paramDef = { - type: "object", - properties: { - postId: { type: "string", format: "misskey:id" }, - }, - required: ["postId"], -} as const; - -export default define(meta, paramDef, async (ps, user) => { - const post = await GalleryPosts.findOneBy({ - id: ps.postId, - userId: user.id, - }); - - if (post == null) { - throw new ApiError(meta.errors.noSuchPost); - } - - await GalleryPosts.delete(post.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 deleted file mode 100644 index fd46406bdf..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts +++ /dev/null @@ -1,61 +0,0 @@ -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"], - - requireCredential: true, - - kind: "write:gallery-likes", - - errors: { - noSuchPost: { - message: "No such post.", - code: "NO_SUCH_POST", - id: "56c06af3-1287-442f-9701-c93f7c4a62ff", - }, - - alreadyLiked: { - message: "The post has already been liked.", - code: "ALREADY_LIKED", - id: "40e9ed56-a59c-473a-bf3f-f289c54fb5a7", - }, - }, -} as const; - -export const paramDef = { - type: "object", - properties: { - postId: { type: "string", format: "misskey:id" }, - }, - required: ["postId"], -} as const; - -export default define(meta, paramDef, async (ps, user) => { - const post = await GalleryPosts.findOneBy({ id: ps.postId }); - if (post == null) { - throw new ApiError(meta.errors.noSuchPost); - } - - // if already liked - const exist = await GalleryLikes.findOneBy({ - postId: post.id, - userId: user.id, - }); - - if (exist != null) { - throw new ApiError(meta.errors.alreadyLiked); - } - - // Create like - await GalleryLikes.insert({ - id: genId(), - createdAt: new Date(), - postId: post.id, - userId: user.id, - }); - - GalleryPosts.increment({ id: post.id }, "likedCount", 1); -}); diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts deleted file mode 100644 index 87e272f018..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts +++ /dev/null @@ -1,45 +0,0 @@ -import define from "../../../define.js"; -import { ApiError } from "../../../error.js"; -import { GalleryPosts } from "@/models/index.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: false, - requireCredentialPrivateMode: true, - - errors: { - noSuchPost: { - message: "No such post.", - code: "NO_SUCH_POST", - id: "1137bf14-c5b0-4604-85bb-5b5371b1cd45", - }, - }, - - res: { - type: "object", - optional: false, - nullable: false, - ref: "GalleryPost", - }, -} as const; - -export const paramDef = { - type: "object", - properties: { - postId: { type: "string", format: "misskey:id" }, - }, - required: ["postId"], -} as const; - -export default define(meta, paramDef, async (ps, me) => { - const post = await GalleryPosts.findOneBy({ - id: ps.postId, - }); - - if (post == null) { - throw new ApiError(meta.errors.noSuchPost); - } - - return await GalleryPosts.pack(post, me); -}); diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts deleted file mode 100644 index 772dc92028..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts +++ /dev/null @@ -1,54 +0,0 @@ -import define from "../../../define.js"; -import { ApiError } from "../../../error.js"; -import { GalleryPosts, GalleryLikes } from "@/models/index.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: true, - - kind: "write:gallery-likes", - - errors: { - noSuchPost: { - message: "No such post.", - code: "NO_SUCH_POST", - id: "c32e6dd0-b555-4413-925e-b3757d19ed84", - }, - - notLiked: { - message: "You have not liked that post.", - code: "NOT_LIKED", - id: "e3e8e06e-be37-41f7-a5b4-87a8250288f0", - }, - }, -} as const; - -export const paramDef = { - type: "object", - properties: { - postId: { type: "string", format: "misskey:id" }, - }, - required: ["postId"], -} as const; - -export default define(meta, paramDef, async (ps, user) => { - const post = await GalleryPosts.findOneBy({ id: ps.postId }); - if (post == null) { - throw new ApiError(meta.errors.noSuchPost); - } - - const exist = await GalleryLikes.findOneBy({ - postId: post.id, - userId: user.id, - }); - - if (exist == null) { - throw new ApiError(meta.errors.notLiked); - } - - // Delete like - await GalleryLikes.delete(exist.id); - - GalleryPosts.decrement({ id: post.id }, "likedCount", 1); -}); diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts deleted file mode 100644 index 64e204172e..0000000000 --- a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts +++ /dev/null @@ -1,84 +0,0 @@ -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 type { DriveFile } from "@/models/entities/drive-file.js"; -import { HOUR } from "@/const.js"; - -export const meta = { - tags: ["gallery"], - - requireCredential: true, - - kind: "write:gallery", - - limit: { - duration: HOUR, - max: 300, - }, - - res: { - type: "object", - optional: false, - nullable: false, - ref: "GalleryPost", - }, - - errors: {}, -} 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; - -export default define(meta, paramDef, async (ps, user) => { - const files = ( - await Promise.all( - ps.fileIds.map((fileId) => - DriveFiles.findOneBy({ - id: fileId, - userId: user.id, - }), - ), - ) - ).filter((file): file is DriveFile => file != null); - - if (files.length === 0) { - throw new Error(); - } - - await GalleryPosts.update( - { - id: ps.postId, - userId: user.id, - }, - { - updatedAt: new Date(), - title: ps.title, - description: ps.description, - isSensitive: ps.isSensitive, - fileIds: files.map((file) => file.id), - }, - ); - - const post = await GalleryPosts.findOneByOrFail({ id: ps.postId }); - - return await GalleryPosts.pack(post, 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 deleted file mode 100644 index d71ee3e5a1..0000000000 --- a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts +++ /dev/null @@ -1,60 +0,0 @@ -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"], - - requireCredential: true, - - kind: "read:gallery-likes", - - res: { - type: "array", - optional: false, - nullable: false, - 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", - }, - }, - }, - }, -} 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; - -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).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 deleted file mode 100644 index e471731ae7..0000000000 --- a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { GalleryPosts } from "@/models/index.js"; -import define from "../../../define.js"; -import { makePaginationQuery } from "../../../common/make-pagination-query.js"; - -export const meta = { - tags: ["account", "gallery"], - - requireCredential: true, - - kind: "read:gallery", - - res: { - type: "array", - optional: false, - nullable: false, - items: { - 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; - -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).getMany(); - - return await GalleryPosts.packMany(posts, user); -}); diff --git a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts deleted file mode 100644 index 5d64fb4727..0000000000 --- a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts +++ /dev/null @@ -1,45 +0,0 @@ -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"], - requireCredentialPrivateMode: true, - - description: "Show all gallery posts by the given user.", - - res: { - type: "array", - optional: false, - nullable: false, - items: { - type: "object", - optional: false, - nullable: false, - ref: "GalleryPost", - }, - }, -} 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" }, - }, - required: ["userId"], -} as const; - -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).getMany(); - - return await GalleryPosts.packMany(posts, user); -}); diff --git a/packages/backend/src/server/api/endpoints/users/relation.ts b/packages/backend/src/server/api/endpoints/users/relation.ts deleted file mode 100644 index 5580eaea0b..0000000000 --- a/packages/backend/src/server/api/endpoints/users/relation.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Users } from "@/models/index.js"; -import define from "../../define.js"; - -export const meta = { - tags: ["users"], - - requireCredential: true, - - description: - "Show the different kinds of relations between the authenticated user and the specified user(s).", - - res: { - optional: false, - nullable: false, - oneOf: [ - { - type: "object", - properties: { - id: { - type: "string", - optional: false, - nullable: false, - format: "id", - }, - isFollowing: { - type: "boolean", - optional: false, - nullable: false, - }, - hasPendingFollowRequestFromYou: { - type: "boolean", - optional: false, - nullable: false, - }, - hasPendingFollowRequestToYou: { - type: "boolean", - optional: false, - nullable: false, - }, - isFollowed: { - type: "boolean", - optional: false, - nullable: false, - }, - isBlocking: { - type: "boolean", - optional: false, - nullable: false, - }, - isBlocked: { - type: "boolean", - optional: false, - nullable: false, - }, - isMuted: { - type: "boolean", - optional: false, - nullable: false, - }, - isRenoteMuted: { - type: "boolean", - optional: false, - nullable: false, - }, - }, - }, - { - type: "array", - items: { - type: "object", - optional: false, - nullable: false, - properties: { - id: { - type: "string", - optional: false, - nullable: false, - format: "id", - }, - isFollowing: { - type: "boolean", - optional: false, - nullable: false, - }, - hasPendingFollowRequestFromYou: { - type: "boolean", - optional: false, - nullable: false, - }, - hasPendingFollowRequestToYou: { - type: "boolean", - optional: false, - nullable: false, - }, - isFollowed: { - type: "boolean", - optional: false, - nullable: false, - }, - isBlocking: { - type: "boolean", - optional: false, - nullable: false, - }, - isBlocked: { - type: "boolean", - optional: false, - nullable: false, - }, - isMuted: { - type: "boolean", - optional: false, - nullable: false, - }, - isRenoteMuted: { - type: "boolean", - optional: false, - nullable: false, - }, - }, - }, - }, - ], - }, -} 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; - -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)), - ); - - return Array.isArray(ps.userId) ? relations : relations[0]; -});