summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/users/groups
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-09-18 03:27:08 +0900
committerGitHub <noreply@github.com>2022-09-18 03:27:08 +0900
commitb75184ec8e3436200bacdcd832e3324702553d20 (patch)
tree8b7e316f29e95df921db57289c8b8da476d18f07 /packages/backend/src/server/api/endpoints/users/groups
parentUpdate ROADMAP.md (diff)
downloadsharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.gz
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.bz2
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'packages/backend/src/server/api/endpoints/users/groups')
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/create.ts59
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/delete.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts63
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invite.ts112
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/joined.ts44
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/leave.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/owned.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/pull.ts61
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/show.ts54
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/transfer.ts75
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/update.ts45
12 files changed, 417 insertions, 242 deletions
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 4a6362a3c6..5d7ad84ae0 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/create.ts
@@ -1,8 +1,11 @@
-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';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { IdService } from '@/core/IdService.js';
+import type { UserGroup } from '@/models/entities/UserGroup.js';
+import type { UserGroupJoining } from '@/models/entities/UserGroupJoining.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UserGroupEntityService } from '@/core/entities/UserGroupEntityService.js';
+import { DI } from '@/di-symbols.js';
export const meta = {
tags: ['groups'],
@@ -29,21 +32,35 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, user) => {
- const userGroup = await UserGroups.insert({
- id: genId(),
- createdAt: new Date(),
- userId: user.id,
- name: ps.name,
- } as UserGroup).then(x => UserGroups.findOneByOrFail(x.identifiers[0]));
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- // Push the owner
- await UserGroupJoinings.insert({
- id: genId(),
- createdAt: new Date(),
- userId: user.id,
- userGroupId: userGroup.id,
- } as UserGroupJoining);
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- return await UserGroups.pack(userGroup);
-});
+ private userGroupEntityService: UserGroupEntityService,
+ private idService: IdService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const userGroup = await this.userGroupsRepository.insert({
+ id: this.idService.genId(),
+ createdAt: new Date(),
+ userId: me.id,
+ name: ps.name,
+ } as UserGroup).then(x => this.userGroupsRepository.findOneByOrFail(x.identifiers[0]));
+
+ // Push the owner
+ await this.userGroupJoiningsRepository.insert({
+ id: this.idService.genId(),
+ createdAt: new Date(),
+ userId: me.id,
+ userGroupId: userGroup.id,
+ } as UserGroupJoining);
+
+ return await this.userGroupEntityService.pack(userGroup);
+ });
+ }
+}
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 2ff1f9aec1..50156b049e 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
@@ -1,5 +1,7 @@
-import { UserGroups } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
export const meta = {
@@ -29,15 +31,23 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, user) => {
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- userId: user.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ userId: me.id,
+ });
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
- await UserGroups.delete(userGroup.id);
-});
+ await this.userGroupsRepository.delete(userGroup.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 220fff5f3e..0490fd41a0 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,8 +1,10 @@
-import { UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
-import { genId } from '@/misc/gen-id.js';
-import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupInvitationsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { IdService } from '@/core/IdService.js';
+import type { UserGroupJoining } from '@/models/entities/UserGroupJoining.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../../error.js';
-import define from '../../../../define.js';
export const meta = {
tags: ['groups', 'users'],
@@ -31,27 +33,40 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, user) => {
- // Fetch the invitation
- const invitation = await UserGroupInvitations.findOneBy({
- id: ps.invitationId,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupInvitationsRepository)
+ private userGroupInvitationsRepository: UserGroupInvitationsRepository,
- if (invitation == null) {
- throw new ApiError(meta.errors.noSuchInvitation);
- }
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- if (invitation.userId !== user.id) {
- throw new ApiError(meta.errors.noSuchInvitation);
- }
+ private idService: IdService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the invitation
+ const invitation = await this.userGroupInvitationsRepository.findOneBy({
+ id: ps.invitationId,
+ });
+
+ if (invitation == null) {
+ throw new ApiError(meta.errors.noSuchInvitation);
+ }
- // Push the user
- await UserGroupJoinings.insert({
- id: genId(),
- createdAt: new Date(),
- userId: user.id,
- userGroupId: invitation.userGroupId,
- } as UserGroupJoining);
+ if (invitation.userId !== me.id) {
+ throw new ApiError(meta.errors.noSuchInvitation);
+ }
- UserGroupInvitations.delete(invitation.id);
-});
+ // Push the user
+ await this.userGroupJoiningsRepository.insert({
+ id: this.idService.genId(),
+ createdAt: new Date(),
+ userId: me.id,
+ userGroupId: invitation.userGroupId,
+ } as UserGroupJoining);
+
+ this.userGroupInvitationsRepository.delete(invitation.id);
+ });
+ }
+}
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 8d1d3db734..26efc1ecf3 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,5 +1,7 @@
-import { UserGroupInvitations } from '@/models/index.js';
-import define from '../../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupInvitationsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../../error.js';
export const meta = {
@@ -29,19 +31,27 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, user) => {
- // Fetch the invitation
- const invitation = await UserGroupInvitations.findOneBy({
- id: ps.invitationId,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupInvitationsRepository)
+ private userGroupInvitationsRepository: UserGroupInvitationsRepository,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the invitation
+ const invitation = await this.userGroupInvitationsRepository.findOneBy({
+ id: ps.invitationId,
+ });
- if (invitation == null) {
- throw new ApiError(meta.errors.noSuchInvitation);
- }
+ if (invitation == null) {
+ throw new ApiError(meta.errors.noSuchInvitation);
+ }
- if (invitation.userId !== user.id) {
- throw new ApiError(meta.errors.noSuchInvitation);
- }
+ if (invitation.userId !== me.id) {
+ throw new ApiError(meta.errors.noSuchInvitation);
+ }
- await UserGroupInvitations.delete(invitation.id);
-});
+ await this.userGroupInvitationsRepository.delete(invitation.id);
+ });
+ }
+}
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 1a8d320f3a..4ae32a6bda 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invite.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
@@ -1,10 +1,12 @@
-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';
-import { getUser } from '../../../common/getters.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository, UserGroupInvitationsRepository } from '@/models/index.js';
+import { IdService } from '@/core/IdService.js';
+import type { UserGroupInvitation } from '@/models/entities/UserGroupInvitation.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { GetterService } from '@/server/api/common/GetterService.js';
+import { CreateNotificationService } from '@/core/CreateNotificationService.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
-import define from '../../../define.js';
export const meta = {
tags: ['groups', 'users'],
@@ -52,51 +54,69 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- // Fetch the group
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- userId: me.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ @Inject(DI.userGroupInvitationsRepository)
+ private userGroupInvitationsRepository: UserGroupInvitationsRepository,
- // 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;
- });
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- const joining = await UserGroupJoinings.findOneBy({
- userGroupId: userGroup.id,
- userId: user.id,
- });
+ private idService: IdService,
+ private getterService: GetterService,
+ private createNotificationService: CreateNotificationService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ userId: me.id,
+ });
- if (joining) {
- throw new ApiError(meta.errors.alreadyAdded);
- }
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
- const existInvitation = await UserGroupInvitations.findOneBy({
- userGroupId: userGroup.id,
- userId: user.id,
- });
+ // Fetch the user
+ const user = await this.getterService.getUser(ps.userId).catch(err => {
+ if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
+ throw err;
+ });
- if (existInvitation) {
- throw new ApiError(meta.errors.alreadyInvited);
- }
+ const joining = await this.userGroupJoiningsRepository.findOneBy({
+ userGroupId: userGroup.id,
+ userId: user.id,
+ });
+
+ if (joining) {
+ throw new ApiError(meta.errors.alreadyAdded);
+ }
- const invitation = await UserGroupInvitations.insert({
- id: genId(),
- createdAt: new Date(),
- userId: user.id,
- userGroupId: userGroup.id,
- } as UserGroupInvitation).then(x => UserGroupInvitations.findOneByOrFail(x.identifiers[0]));
+ const existInvitation = await this.userGroupInvitationsRepository.findOneBy({
+ userGroupId: userGroup.id,
+ userId: user.id,
+ });
- // 通知を作成
- createNotification(user.id, 'groupInvited', {
- notifierId: me.id,
- userGroupInvitationId: invitation.id,
- });
-});
+ if (existInvitation) {
+ throw new ApiError(meta.errors.alreadyInvited);
+ }
+
+ const invitation = await this.userGroupInvitationsRepository.insert({
+ id: this.idService.genId(),
+ createdAt: new Date(),
+ userId: user.id,
+ userGroupId: userGroup.id,
+ } as UserGroupInvitation).then(x => this.userGroupInvitationsRepository.findOneByOrFail(x.identifiers[0]));
+
+ // 通知を作成
+ this.createNotificationService.createNotification(user.id, 'groupInvited', {
+ notifierId: me.id,
+ userGroupInvitationId: invitation.id,
+ });
+ });
+ }
+}
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 16c6e544e5..e7e69f257d 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/joined.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
@@ -1,6 +1,9 @@
import { Not, In } from 'typeorm';
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UserGroupEntityService } from '@/core/entities/UserGroupEntityService.js';
+import { DI } from '@/di-symbols.js';
export const meta = {
tags: ['groups', 'account'],
@@ -29,17 +32,30 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- const ownedGroups = await UserGroups.findBy({
- userId: me.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- const joinings = await UserGroupJoinings.findBy({
- userId: me.id,
- ...(ownedGroups.length > 0 ? {
- userGroupId: Not(In(ownedGroups.map(x => x.id))),
- } : {}),
- });
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- return await Promise.all(joinings.map(x => UserGroups.pack(x.userGroupId)));
-});
+ private userGroupEntityService: UserGroupEntityService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const ownedGroups = await this.userGroupsRepository.findBy({
+ userId: me.id,
+ });
+
+ const joinings = await this.userGroupJoiningsRepository.findBy({
+ userId: me.id,
+ ...(ownedGroups.length > 0 ? {
+ userGroupId: Not(In(ownedGroups.map(x => x.id))),
+ } : {}),
+ });
+
+ return await Promise.all(joinings.map(x => this.userGroupEntityService.pack(x.userGroupId)));
+ });
+ }
+}
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 83dc757db1..0a63dbb7f1 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/leave.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
@@ -1,5 +1,7 @@
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
export const meta = {
@@ -35,19 +37,30 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- // Fetch the group
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ });
- if (me.id === userGroup.userId) {
- throw new ApiError(meta.errors.youAreOwner);
- }
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
- await UserGroupJoinings.delete({ userGroupId: userGroup.id, userId: me.id });
-});
+ if (me.id === userGroup.userId) {
+ throw new ApiError(meta.errors.youAreOwner);
+ }
+
+ await this.userGroupJoiningsRepository.delete({ userGroupId: userGroup.id, userId: me.id });
+ });
+ }
+}
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 d77cf1a52e..c9ae39561f 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,8 @@
-import { UserGroups } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UserGroupEntityService } from '@/core/entities/UserGroupEntityService.js';
+import { DI } from '@/di-symbols.js';
export const meta = {
tags: ['groups', 'account'],
@@ -28,10 +31,20 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- const userGroups = await UserGroups.findBy({
- userId: me.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- return await Promise.all(userGroups.map(x => UserGroups.pack(x)));
-});
+ private userGroupEntityService: UserGroupEntityService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const userGroups = await this.userGroupsRepository.findBy({
+ userId: me.id,
+ });
+
+ return await Promise.all(userGroups.map(x => this.userGroupEntityService.pack(x)));
+ });
+ }
+}
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 ba67a1e5c9..e6f60eef0a 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
@@ -1,7 +1,9 @@
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { GetterService } from '@/server/api/common/GetterService.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
-import { getUser } from '../../../common/getters.js';
export const meta = {
tags: ['groups', 'users'],
@@ -43,27 +45,40 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- // Fetch the group
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- userId: me.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- // 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;
- });
+ private getterService: GetterService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ userId: me.id,
+ });
- if (user.id === userGroup.userId) {
- throw new ApiError(meta.errors.isOwner);
- }
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
+
+ // Fetch the user
+ const user = await this.getterService.getUser(ps.userId).catch(err => {
+ if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
+ throw err;
+ });
- // Pull the user
- await UserGroupJoinings.delete({ userGroupId: userGroup.id, userId: user.id });
-});
+ if (user.id === userGroup.userId) {
+ throw new ApiError(meta.errors.isOwner);
+ }
+
+ // Pull the user
+ await this.userGroupJoiningsRepository.delete({ userGroupId: userGroup.id, userId: user.id });
+ });
+ }
+}
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 21e3d9da26..1cebfcd204 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/show.ts
@@ -1,5 +1,8 @@
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UserGroupEntityService } from '@/core/entities/UserGroupEntityService.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
export const meta = {
@@ -35,24 +38,37 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- // Fetch the group
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- const joining = await UserGroupJoinings.findOneBy({
- userId: me.id,
- userGroupId: userGroup.id,
- });
+ private userGroupEntityService: UserGroupEntityService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ });
- if (joining == null && userGroup.userId !== me.id) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
+
+ const joining = await this.userGroupJoiningsRepository.findOneBy({
+ userId: me.id,
+ userGroupId: userGroup.id,
+ });
- return await UserGroups.pack(userGroup);
-});
+ if (joining == null && userGroup.userId !== me.id) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
+
+ return await this.userGroupEntityService.pack(userGroup);
+ });
+ }
+}
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 6456e70dd5..a8b2533b73 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
@@ -1,7 +1,10 @@
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository, UserGroupJoiningsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UserGroupEntityService } from '@/core/entities/UserGroupEntityService.js';
+import { GetterService } from '@/server/api/common/GetterService.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
-import { getUser } from '../../../common/getters.js';
export const meta = {
tags: ['groups', 'users'],
@@ -49,35 +52,49 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- // Fetch the group
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- userId: me.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
- // 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;
- });
+ private userGroupEntityService: UserGroupEntityService,
+ private getterService: GetterService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ userId: me.id,
+ });
- const joining = await UserGroupJoinings.findOneBy({
- userGroupId: userGroup.id,
- userId: user.id,
- });
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
- if (joining == null) {
- throw new ApiError(meta.errors.noSuchGroupMember);
- }
+ // Fetch the user
+ const user = await this.getterService.getUser(ps.userId).catch(err => {
+ if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
+ throw err;
+ });
+
+ const joining = await this.userGroupJoiningsRepository.findOneBy({
+ userGroupId: userGroup.id,
+ userId: user.id,
+ });
- await UserGroups.update(userGroup.id, {
- userId: ps.userId,
- });
+ if (joining == null) {
+ throw new ApiError(meta.errors.noSuchGroupMember);
+ }
- return await UserGroups.pack(userGroup.id);
-});
+ await this.userGroupsRepository.update(userGroup.id, {
+ userId: ps.userId,
+ });
+
+ return await this.userGroupEntityService.pack(userGroup.id);
+ });
+ }
+}
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 0a96165fc4..b679625c85 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/update.ts
@@ -1,5 +1,8 @@
-import { UserGroups } from '@/models/index.js';
-import define from '../../../define.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupsRepository } from '@/models/index.js';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { UserGroupEntityService } from '@/core/entities/UserGroupEntityService.js';
+import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
export const meta = {
@@ -36,20 +39,30 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, me) => {
- // Fetch the group
- const userGroup = await UserGroups.findOneBy({
- id: ps.groupId,
- userId: me.id,
- });
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+ constructor(
+ @Inject(DI.userGroupsRepository)
+ private userGroupsRepository: UserGroupsRepository,
- if (userGroup == null) {
- throw new ApiError(meta.errors.noSuchGroup);
- }
+ private userGroupEntityService: UserGroupEntityService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ // Fetch the group
+ const userGroup = await this.userGroupsRepository.findOneBy({
+ id: ps.groupId,
+ userId: me.id,
+ });
+
+ if (userGroup == null) {
+ throw new ApiError(meta.errors.noSuchGroup);
+ }
- await UserGroups.update(userGroup.id, {
- name: ps.name,
- });
+ await this.userGroupsRepository.update(userGroup.id, {
+ name: ps.name,
+ });
- return await UserGroups.pack(userGroup.id);
-});
+ return await this.userGroupEntityService.pack(userGroup.id);
+ });
+ }
+}