iceshrimp-legacy/packages/backend/src/server/api/endpoints/users/lists/push.ts
2023-07-18 16:00:48 +02:00

98 lines
2.1 KiB
TypeScript

import { pushUserToUserList } from "@/services/user-list/push.js";
import { UserLists, UserListJoinings, Blockings } from "@/models/index.js";
import define from "../../../define.js";
import { ApiError } from "../../../error.js";
import { getUser } from "../../../common/getters.js";
export const meta = {
tags: ["lists", "users"],
requireCredential: true,
kind: "write:account",
description: "Add a user to an existing list.",
errors: {
noSuchList: {
message: "No such list.",
code: "NO_SUCH_LIST",
id: "2214501d-ac96-4049-b717-91e42272a711",
},
noSuchUser: {
message: "No such user.",
code: "NO_SUCH_USER",
id: "a89abd3d-f0bc-4cce-beb1-2f446f4f1e6a",
},
alreadyAdded: {
message: "That user has already been added to that list.",
code: "ALREADY_ADDED",
id: "1de7c884-1595-49e9-857e-61f12f4d4fc5",
},
youHaveBeenBlocked: {
message:
"You cannot push this user because you have been blocked by this user.",
code: "YOU_HAVE_BEEN_BLOCKED",
id: "990232c5-3f9d-4d83-9f3f-ef27b6332a4b",
},
},
} 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;
export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOneBy({
id: ps.listId,
userId: me.id,
});
if (!userList) {
throw new ApiError(meta.errors.noSuchList);
}
// Fetch the user
const user = await getUser(ps.userId).catch((e) => {
if (e.id === "15348ddd-432d-49c2-8a5a-8069753becff")
throw new ApiError(meta.errors.noSuchUser);
throw e;
});
// Check blocking
if (user.id !== me.id) {
const isBlocked = await Blockings.exist({
where: {
blockerId: user.id,
blockeeId: me.id,
},
});
if (isBlocked) {
throw new ApiError(meta.errors.youHaveBeenBlocked);
}
}
const exist = await UserListJoinings.exist({
where: {
userListId: ps.listId,
userId: user.id,
},
});
if (exist) {
throw new ApiError(meta.errors.alreadyAdded);
}
// Push the user
await pushUserToUserList(user, userList);
});