Removed all references to galleries
ci/woodpecker/tag/ociImageTag Pipeline was successful Details

This commit is contained in:
Natty 2024-01-13 00:56:42 +01:00
parent 8654fe13a6
commit 786f3626af
Signed by: natty
GPG Key ID: BF6CB659ADEE60EC
24 changed files with 2 additions and 1131 deletions

View File

@ -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,

View File

@ -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).

View File

@ -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,
};

View File

@ -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;
}

View File

@ -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<GalleryPost>) {
if (data == null) return;
for (const [k, v] of Object.entries(data)) {
(this as any)[k] = v;
}
}
}

View File

@ -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);

View File

@ -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)));
},
});

View File

@ -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<Packed<"GalleryPost">> {
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)));
},
});

View File

@ -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<Note["id"], NoteReaction | null>;
},
) {
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<boolean> {
// This code must always be synchronized with the checks in generateVisibilityQuery.

View File

@ -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;

View File

@ -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],

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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);
});

View File

@ -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];
});