Skip to content

Commit 98cd08e

Browse files
committed
[refactor] move Static methods of controllers to services
[optimize] clean Empty fields of Query filters
1 parent b8d64c8 commit 98cd08e

24 files changed

+534
-347
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"node": ">=22"
1111
},
1212
"dependencies": {
13-
"@aws-sdk/client-s3": "^3.943.0",
14-
"@aws-sdk/s3-request-presigner": "^3.943.0",
13+
"@aws-sdk/client-s3": "^3.946.0",
14+
"@aws-sdk/s3-request-presigner": "^3.946.0",
1515
"@koa/cors": "^5.0.0",
1616
"@koa/multer": "^4.0.0",
1717
"@koa/router": "^15.0.0",

pnpm-lock.yaml

Lines changed: 110 additions & 110 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

source/controller/ActivityLog.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ export class ActivityLogController {
4343
@Param('id') id: number,
4444
@QueryParams() { operation, pageSize, pageIndex }: ActivityLogFilter
4545
) {
46-
return this.queryList({ operation, createdBy: { id } }, { pageSize, pageIndex });
46+
return this.queryList(
47+
{ ...(operation && { operation }), createdBy: { id } },
48+
{ pageSize, pageIndex }
49+
);
4750
}
4851

4952
@Get('/:table/:id')
@@ -53,7 +56,10 @@ export class ActivityLogController {
5356
@Param('id') recordId: number,
5457
@QueryParams() { operation, pageSize, pageIndex }: ActivityLogFilter
5558
) {
56-
return this.queryList({ operation, tableName, recordId }, { pageSize, pageIndex });
59+
return this.queryList(
60+
{ ...(operation && { operation }), tableName, recordId },
61+
{ pageSize, pageIndex }
62+
);
5763
}
5864

5965
async queryList(where: FindOptionsWhere<ActivityLog>, { pageSize, pageIndex }: BaseFilter) {

source/controller/Award.ts

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,13 @@ import {
2626
Hackathon,
2727
User
2828
} from '../model';
29-
import { UserServiceWithLog } from '../service';
30-
import { HackathonController } from './Hackathon';
29+
import { awardAssignmentService, awardService, hackathonService } from '../service';
3130

3231
const hackathonStore = dataSource.getRepository(Hackathon);
33-
const awardAssignmentService = new UserServiceWithLog(AwardAssignment);
3432

3533
@JsonController('/hackathon/:name/award')
3634
export class AwardController {
37-
service = new UserServiceWithLog(Award, ['name', 'description']);
35+
service = awardService;
3836

3937
@Post()
4038
@Authorized()
@@ -49,7 +47,7 @@ export class AwardController {
4947

5048
if (!hackathon) throw new NotFoundError(`Hackathon ${name} is not found`);
5149

52-
await HackathonController.ensureAdmin(createdBy.id, name);
50+
await hackathonService.ensureAdmin(createdBy.id, name);
5351

5452
return this.service.createOne({ ...award, hackathon }, createdBy);
5553
}
@@ -70,7 +68,7 @@ export class AwardController {
7068
@Param('id') id: number,
7169
@Body() updateData: Award
7270
) {
73-
await HackathonController.ensureAdmin(updatedBy.id, name);
71+
await hackathonService.ensureAdmin(updatedBy.id, name);
7472

7573
return this.service.editOne(id, updateData, updatedBy);
7674
}
@@ -83,22 +81,26 @@ export class AwardController {
8381
@Param('name') name: string,
8482
@Param('id') id: number
8583
) {
86-
await HackathonController.ensureAdmin(deletedBy.id, name);
84+
await hackathonService.ensureAdmin(deletedBy.id, name);
8785

8886
await this.service.deleteOne(id, deletedBy);
8987
}
9088

9189
@Get()
9290
@ResponseSchema(AwardListChunk)
9391
getList(@Param('name') name: string, @QueryParams() { ...filter }: BaseFilter) {
94-
return this.service.getList(filter, { hackathon: { name } }, { relations: ['createdBy', 'updatedBy'] });
92+
return this.service.getList(
93+
filter,
94+
{ hackathon: { name } },
95+
{ relations: ['createdBy', 'updatedBy'] }
96+
);
9597
}
9698
}
9799

98100
@JsonController('/hackathon/:name/award/:aid/assignment')
99101
export class AwardAssignmentController {
100102
service = awardAssignmentService;
101-
awardService = new UserServiceWithLog(Award);
103+
awardService = awardService;
102104

103105
@Post()
104106
@Authorized()
@@ -113,9 +115,12 @@ export class AwardAssignmentController {
113115
const award = await this.awardService.getOne(aid, ['hackathon']);
114116
if (!award) throw new NotFoundError(`Award "${aid}" is not found`);
115117

116-
await HackathonController.ensureAdmin(currentUser.id, name);
118+
await hackathonService.ensureAdmin(currentUser.id, name);
117119

118-
return this.service.createOne({ ...assignment, hackathon: award.hackathon, award }, currentUser);
120+
return this.service.createOne(
121+
{ ...assignment, hackathon: award.hackathon, award },
122+
currentUser
123+
);
119124
}
120125

121126
@Put('/:id')
@@ -127,23 +132,15 @@ export class AwardAssignmentController {
127132
@Param('id') id: number,
128133
@Body() newData: AwardAssignment
129134
) {
130-
await HackathonController.ensureAdmin(currentUser.id, name);
135+
await hackathonService.ensureAdmin(currentUser.id, name);
131136

132137
return this.service.editOne(id, newData, currentUser);
133138
}
134139

135-
static getList(dimension: keyof AwardAssignment, id: number, pageSize: number, pageIndex: number) {
136-
return awardAssignmentService.getList(
137-
{ pageSize, pageIndex },
138-
{ [dimension]: { id } },
139-
{ relations: ['createdBy', 'updatedBy', 'award', 'user', 'team'] }
140-
);
141-
}
142-
143140
@Get()
144141
@ResponseSchema(AwardAssignmentListChunk)
145142
getList(@Param('aid') aid: number, @QueryParams() { pageSize, pageIndex }: BaseFilter) {
146-
return AwardAssignmentController.getList('award', aid, pageSize, pageIndex);
143+
return awardAssignmentService.getListByDimension('award', aid, pageSize, pageIndex);
147144
}
148145
}
149146

@@ -152,6 +149,6 @@ export class TeamAwardAssignmentController {
152149
@Get()
153150
@ResponseSchema(AwardAssignmentListChunk)
154151
getList(@Param('id') id: number, @QueryParams() { pageSize, pageIndex }: BaseFilter) {
155-
return AwardAssignmentController.getList('team', id, pageSize, pageIndex);
152+
return awardAssignmentService.getListByDimension('team', id, pageSize, pageIndex);
156153
}
157154
}

source/controller/Enrollment.ts

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,14 @@ import {
2323
Hackathon,
2424
User
2525
} from '../model';
26-
import { UserServiceWithLog } from '../service';
26+
import { enrollmentService, hackathonService } from '../service';
2727
import { searchConditionOf } from '../utility';
28-
import { HackathonController } from './Hackathon';
2928

3029
const hackathonStore = dataSource.getRepository(Hackathon);
3130

3231
@JsonController('/hackathon/:name/enrollment')
3332
export class EnrollmentController {
34-
service = new UserServiceWithLog(Enrollment, ['form']);
35-
36-
static isEnrolled = (userId: number, hackathonName: string) =>
37-
dataSource
38-
.getRepository(Enrollment)
39-
.existsBy({ hackathon: { name: hackathonName }, createdBy: { id: userId } });
33+
service = enrollmentService;
4034

4135
@Get('/session')
4236
@Authorized()
@@ -48,11 +42,15 @@ export class EnrollmentController {
4842
@Put('/:id')
4943
@Authorized()
5044
@ResponseSchema(Enrollment)
51-
async updateOne(@CurrentUser() updatedBy: User, @Param('id') id: number, @Body() { status }: Enrollment) {
45+
async updateOne(
46+
@CurrentUser() updatedBy: User,
47+
@Param('id') id: number,
48+
@Body() { status }: Enrollment
49+
) {
5250
const old = await this.service.getOne(id, ['hackathon']);
5351
if (!old) throw new NotFoundError();
5452

55-
await HackathonController.ensureAdmin(updatedBy.id, old.hackathon.name);
53+
await hackathonService.ensureAdmin(updatedBy.id, old.hackathon.name);
5654

5755
return this.service.editOne(id, { status }, updatedBy);
5856
}
@@ -61,28 +59,39 @@ export class EnrollmentController {
6159
@Authorized()
6260
@HttpCode(201)
6361
@ResponseSchema(Enrollment)
64-
async createOne(@CurrentUser() createdBy: User, @Param('name') name: string, @Body() { form }: Enrollment) {
62+
async createOne(
63+
@CurrentUser() createdBy: User,
64+
@Param('name') name: string,
65+
@Body() { form }: Enrollment
66+
) {
6567
const hackathon = await hackathonStore.findOneBy({ name }),
6668
now = Date.now();
6769

6870
if (!hackathon) throw new NotFoundError();
6971

70-
if (now < +new Date(hackathon.enrollmentStartedAt) || now > +new Date(hackathon.enrollmentEndedAt))
72+
if (
73+
now < +new Date(hackathon.enrollmentStartedAt) ||
74+
now > +new Date(hackathon.enrollmentEndedAt)
75+
)
7176
throw new ForbiddenError('Not in enrollment period');
7277

7378
return this.service.createOne(
7479
{
7580
hackathon,
7681
form,
77-
status: hackathon.autoApprove ? EnrollmentStatus.Approved : EnrollmentStatus.PendingApproval
82+
status: hackathon.autoApprove
83+
? EnrollmentStatus.Approved
84+
: EnrollmentStatus.PendingApproval
7885
},
7986
createdBy
8087
);
8188
}
8289

8390
@Get()
8491
@ResponseSchema(EnrollmentListChunk)
85-
getList(@QueryParams() { keywords, status, createdBy, updatedBy, ...filter }: EnrollmentFilter) {
92+
getList(
93+
@QueryParams() { keywords, status, createdBy, updatedBy, ...filter }: EnrollmentFilter
94+
) {
8695
const where = searchConditionOf<Enrollment>(['form'], keywords, {
8796
...(status && { status }),
8897
...(createdBy && { createdBy: { id: createdBy } }),

source/controller/GitTemplate.ts

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,40 +22,16 @@ import {
2222
GitTemplate,
2323
GitTemplateListChunk,
2424
Hackathon,
25-
HackathonBase,
2625
User
2726
} from '../model';
28-
import { UserServiceWithLog } from '../service';
27+
import { gitTemplateService, hackathonService } from '../service';
2928
import { searchConditionOf } from '../utility';
30-
import { HackathonController } from './Hackathon';
3129

3230
const hackathonStore = dataSource.getRepository(Hackathon);
33-
const repositoryStore = new RepositoryModel();
3431

3532
@JsonController('/hackathon/:name/git-template')
3633
export class GitTemplateController {
37-
service = new UserServiceWithLog(GitTemplate, [
38-
'name',
39-
'full_name',
40-
'html_url',
41-
'default_branch',
42-
'languages',
43-
'topics',
44-
'description',
45-
'homepage'
46-
]);
47-
48-
static async getRepository(URI: string): Promise<Omit<GitTemplate, keyof HackathonBase>> {
49-
const path = URI.replace(new RegExp(String.raw`^https://github.com/`), 'repos');
50-
const repository = await repositoryStore.getOne(path, ['languages']);
51-
52-
const { name, full_name, html_url, default_branch } = repository,
53-
{ languages, topics, description, homepage } = repository;
54-
return {
55-
...{ name, full_name, html_url, default_branch },
56-
...{ languages, topics, description, homepage }
57-
};
58-
}
34+
service = gitTemplateService;
5935

6036
@Post()
6137
@Authorized()
@@ -70,9 +46,9 @@ export class GitTemplateController {
7046

7147
if (!hackathon) throw new NotFoundError();
7248

73-
await HackathonController.ensureAdmin(createdBy.id, name);
49+
await hackathonService.ensureAdmin(createdBy.id, name);
7450

75-
const repository = await GitTemplateController.getRepository(html_url);
51+
const repository = await gitTemplateService.getRepository(html_url);
7652

7753
return this.service.createOne({ ...repository, hackathon }, createdBy);
7854
}
@@ -85,7 +61,7 @@ export class GitTemplateController {
8561
@Param('name') name: string,
8662
@Param('id') id: number
8763
) {
88-
await HackathonController.ensureAdmin(deletedBy.id, name);
64+
await hackathonService.ensureAdmin(deletedBy.id, name);
8965

9066
await this.service.deleteOne(id, deletedBy);
9167
}

0 commit comments

Comments
 (0)