Skip to content

Commit 94c1e20

Browse files
committed
refactor: clean-up types across the codebase
1 parent 66ffb9c commit 94c1e20

22 files changed

Lines changed: 85 additions & 225 deletions

File tree

backend/src/controllers/problem.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { CourseEntity, ProblemEntity, ProblemEntityItem, ProblemEntityPrevi
77
import {
88
DiscussionListQueryResultSchema,
99
DiscussionListQuerySchema,
10+
JudgeStatus,
1011
ProblemSolutionListQueryResultSchema,
1112
ProblemSolutionListQuerySchema,
1213
ProblemStatisticsQueryResultSchema,
@@ -25,9 +26,7 @@ import solutionService from '../services/solution'
2526
import tagService from '../services/tag'
2627
import { getUser } from '../services/user'
2728
import { createEnvelopedResponse, createZodErrorResponse, parsePaginateOption } from '../utils'
28-
import constants, { ERR_PERM_DENIED } from '../utils/constants'
29-
30-
const { judge } = constants
29+
import { ERR_PERM_DENIED } from '../utils/constants'
3130

3231
const findProblems = async (ctx: Context) => {
3332
const opt = ctx.request.query
@@ -89,7 +88,7 @@ const findProblems = async (ctx: Context) => {
8988
.find({
9089
uid: profile.uid,
9190
pid: { $in: list.docs.map(p => p.pid) },
92-
judge: judge.Accepted,
91+
judge: JudgeStatus.Accepted,
9392
})
9493
.distinct('pid')
9594
.lean()

backend/src/controllers/solution.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Context } from 'koa'
22
import type { CourseDocument } from '../models/Course'
33
import { Buffer } from 'node:buffer'
44
import path from 'node:path'
5-
import { ErrorCode } from '@putongoj/shared'
5+
import { ErrorCode, JudgeStatus } from '@putongoj/shared'
66
import fse from 'fs-extra'
77
import { pick } from 'lodash'
88
import redis from '../config/redis'
@@ -12,7 +12,6 @@ import Problem from '../models/Problem'
1212
import Solution from '../models/Solution'
1313
import { loadCourseStateOrThrow } from '../policies/course'
1414
import { createEnvelopedResponse, createErrorResponse } from '../utils'
15-
import { judgeResult } from '../utils/constants'
1615

1716
export async function findOne (ctx: Context) {
1817
const opt = Number.parseInt(ctx.params.sid, 10)
@@ -174,7 +173,7 @@ async function updateSolution (ctx: Context) {
174173
return createErrorResponse(ctx, ErrorCode.BadRequest, 'Invalid submission id')
175174
}
176175
const updatedJudge = Number(opt.judge)
177-
if (updatedJudge !== judgeResult.RejudgePending && updatedJudge !== judgeResult.Skipped) {
176+
if (updatedJudge !== JudgeStatus.RejudgePending && updatedJudge !== JudgeStatus.Skipped) {
178177
return createErrorResponse(ctx, ErrorCode.BadRequest, 'Invalid judge status, only support RejudgePending and Skipped')
179178
}
180179

@@ -203,7 +202,7 @@ async function updateSolution (ctx: Context) {
203202
return createErrorResponse(ctx, ErrorCode.InternalServerError)
204203
}
205204

206-
if (updatedJudge !== judgeResult.RejudgePending) {
205+
if (updatedJudge !== JudgeStatus.RejudgePending) {
207206
return createEnvelopedResponse(ctx, solution)
208207
}
209208

backend/src/controllers/user.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Context } from 'koa'
22
import type { UserDocument } from '../models/User'
33
import {
44
ErrorCode,
5+
JudgeStatus,
56
UserItemListQueryResultSchema,
67
UserProfileQueryResultSchema,
78
UserRanklistExportQueryResultSchema,
@@ -12,7 +13,6 @@ import {
1213
UserSuggestQuerySchema,
1314
} from '@putongoj/shared'
1415
import difference from 'lodash/difference'
15-
import config from '../config'
1616
import { loadProfile } from '../middlewares/authn'
1717
import Group from '../models/Group'
1818
import Solution from '../models/Solution'
@@ -75,11 +75,11 @@ export async function getUser (ctx: Context) {
7575
const user = await loadUser(ctx)
7676
const [ solved, failed, groups ] = await Promise.all([
7777
Solution
78-
.find({ uid: user.uid, judge: config.judge.Accepted })
78+
.find({ uid: user.uid, judge: JudgeStatus.Accepted })
7979
.distinct('pid')
8080
.lean(),
8181
Solution
82-
.find({ uid: user.uid, judge: { $nin: [ config.judge.Accepted, config.judge.Skipped ] } })
82+
.find({ uid: user.uid, judge: { $nin: [ JudgeStatus.Accepted, JudgeStatus.Skipped ] } })
8383
.distinct('pid')
8484
.lean(),
8585
Group

backend/src/jobs/tasks/checkSimilarity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { JudgeStatus } from '@putongoj/shared'
12
import levenshtein from 'fast-levenshtein'
23
import Solution from '../../models/Solution'
3-
import { judge } from '../../utils/constants'
44
import logger from '../../utils/logger'
55

66
function codeNormalize (code: string): string {
@@ -28,7 +28,7 @@ async function checkSimilarity (item: string) {
2828
pid: solution.pid,
2929
uid: { $ne: solution.uid },
3030
create: { $lt: solution.create },
31-
judge: judge.Accepted,
31+
judge: JudgeStatus.Accepted,
3232
}, {
3333
code: 1, sid: 1,
3434
}).lean().exec()

backend/src/jobs/tasks/updateStatistic.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
import { JudgeStatus } from '@putongoj/shared'
12
import Comment from '../../models/Comment'
23
import Discussion from '../../models/Discussion'
34
import Problem from '../../models/Problem'
45
import Solution from '../../models/Solution'
56
import User from '../../models/User'
6-
import { judge } from '../../utils/constants'
77
import logger from '../../utils/logger'
88

99
/**
@@ -14,8 +14,8 @@ async function updateUserStatistic (uid: string) {
1414
uid = uid.trim()
1515

1616
const [ submitProblems, solveProblems ] = await Promise.all([
17-
Solution.distinct('pid', { uid, judge: { $ne: judge.Skipped } }),
18-
Solution.distinct('pid', { uid, judge: judge.Accepted }),
17+
Solution.distinct('pid', { uid, judge: { $ne: JudgeStatus.Skipped } }),
18+
Solution.distinct('pid', { uid, judge: JudgeStatus.Accepted }),
1919
])
2020
await User.findOneAndUpdate(
2121
{ uid },
@@ -40,8 +40,8 @@ async function updateProblemStatistic (pid: number | string) {
4040
}
4141

4242
const [ submitUsers, acceptedUsers ] = await Promise.all([
43-
Solution.distinct('uid', { pid, judge: { $ne: judge.Skipped } }),
44-
Solution.distinct('uid', { pid, judge: judge.Accepted }),
43+
Solution.distinct('uid', { pid, judge: { $ne: JudgeStatus.Skipped } }),
44+
Solution.distinct('uid', { pid, judge: JudgeStatus.Accepted }),
4545
])
4646
await Problem.findOneAndUpdate(
4747
{ pid },

backend/src/jobs/updater.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import type { WebSocketDispatch, WebSocketMessage } from '@putongoj/shared'
2-
import { WebSocketDispatchType, WebSocketMessageType } from '@putongoj/shared'
2+
import { JudgeStatus, WebSocketDispatchType, WebSocketMessageType } from '@putongoj/shared'
33
import redis from '../config/redis'
44
import Solution from '../models/Solution'
5-
import { judge } from '../utils/constants'
65
import logger from '../utils/logger'
76
import { distributeWork } from './helper'
87
import '../config/db'
@@ -47,12 +46,12 @@ async function updateResult (result: any) {
4746
logger.info(`Solution <${sid}> update to status ${solution.judge}`)
4847

4948
const tasks = [] as Promise<any>[]
50-
if (solution.judge !== judge.Running) {
49+
if (solution.judge !== JudgeStatus.RunningJudge) {
5150
tasks.push(distributeWork('updateStatistic', `problem:${solution.pid}`))
5251
tasks.push(distributeWork('updateStatistic', `user:${solution.uid}`))
5352
tasks.push(redis.publish('websocket:message', JSON.stringify(dispatch)))
5453
}
55-
if (solution.judge === judge.Accepted) {
54+
if (solution.judge === JudgeStatus.Accepted) {
5655
tasks.push(distributeWork('checkSimilarity', solution.sid))
5756
}
5857
await Promise.all(tasks)

backend/src/models/Contest.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { LabelingStyle, TITLE_LENGTH_MAX } from '@putongoj/shared'
1+
import { LabelingStyle, LabelingStyleValues, TITLE_LENGTH_MAX } from '@putongoj/shared'
22
import mongoose from '../config/db'
33
import ID from './ID'
44

@@ -80,7 +80,7 @@ const contestSchema = new mongoose.Schema({
8080
} ],
8181
labelingStyle: {
8282
type: Number,
83-
enum: Object.values(LabelingStyle),
83+
enum: LabelingStyleValues,
8484
default: LabelingStyle.Numeric,
8585
},
8686
course: {

backend/src/models/Solution.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import type { Document, PaginateModel, Types } from 'mongoose'
22
import type { SolutionEntity } from '../types/entity'
3+
import { JudgeStatus, JudgeStatusValues } from '@putongoj/shared'
34
import mongoosePaginate from 'mongoose-paginate-v2'
45
import mongoose from '../config/db'
5-
import { judge, status } from '../utils/constants'
6+
import { status } from '../utils/constants'
67
import ID from './ID'
78

89
export interface SolutionDocument extends Document<Types.ObjectId>, SolutionEntity {
@@ -106,8 +107,8 @@ const solutionSchema = new mongoose.Schema({
106107
},
107108
judge: {
108109
type: Number,
109-
enum: Object.values(judge),
110-
default: judge.Pending,
110+
enum: JudgeStatusValues,
111+
default: JudgeStatus.Pending,
111112
index: true,
112113
},
113114
time: {
@@ -142,10 +143,10 @@ const solutionSchema = new mongoose.Schema({
142143
solutionSchema.plugin(mongoosePaginate)
143144

144145
solutionSchema.virtual('isAccepted').get(function () {
145-
return this.judge === judge.Accepted
146+
return this.judge === JudgeStatus.Accepted
146147
})
147148
solutionSchema.virtual('isPending').get(function () {
148-
return this.judge === judge.Pending
149+
return this.judge === JudgeStatus.Pending
149150
})
150151

151152
solutionSchema.index({ createdAt: -1 })

backend/src/services/contest.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@ import type { Types } from 'mongoose'
33
import type { CourseDocument } from '../models/Course'
44
import type { PaginateOption, SortOption } from '../types'
55
import type { QueryFilter } from '../types/mongo'
6-
import { ParticipationStatus } from '@putongoj/shared'
6+
import { JudgeStatus, ParticipationStatus } from '@putongoj/shared'
77
import { escapeRegExp } from 'lodash'
88
import Contest from '../models/Contest'
99
import ContestParticipation from '../models/ContestParticipation'
1010
import Problem from '../models/Problem'
1111
import Solution from '../models/Solution'
1212
import User from '../models/User'
13-
import { judge } from '../utils/constants'
1413
import { CacheKey, cacheService } from './cache'
1514

1615
async function findContests (
@@ -125,7 +124,7 @@ export type ContestProblemsWithStats = {
125124
solve: number
126125
}[]
127126

128-
const ignoredJudges = [ judge.CompileError, judge.SystemError, judge.Skipped ] as number[]
127+
const ignoredJudges = [ JudgeStatus.CompileError, JudgeStatus.SystemError, JudgeStatus.Skipped ] as number[]
129128

130129
async function getProblemsWithStats (contest: Types.ObjectId, isJury: boolean) {
131130
return await cacheService.getOrCreate<ContestProblemsWithStats>(
@@ -160,7 +159,7 @@ async function getProblemsWithStats (contest: Types.ObjectId, isJury: boolean) {
160159
Solution.distinct('uid', {
161160
mid: contestId,
162161
pid,
163-
judge: judge.Accepted,
162+
judge: JudgeStatus.Accepted,
164163
createdAt: { $lt: before },
165164
}).lean(),
166165
])
@@ -175,7 +174,7 @@ async function getProblemsWithStats (contest: Types.ObjectId, isJury: boolean) {
175174
)
176175
}
177176

178-
const pendingJudges = [ judge.Pending, judge.RejudgePending, judge.Running ] as number[]
177+
const pendingJudges = [ JudgeStatus.Pending, JudgeStatus.RejudgePending, JudgeStatus.RunningJudge ] as number[]
179178

180179
async function getRanklist (contest: Types.ObjectId, isJury: boolean) {
181180
return await cacheService.getOrCreate<ContestRanklist>(
@@ -231,7 +230,7 @@ async function getRanklist (contest: Types.ObjectId, isJury: boolean) {
231230
return
232231
}
233232

234-
if (judgement === judge.Accepted) {
233+
if (judgement === JudgeStatus.Accepted) {
235234
item.solvedAt = createdAt.toISOString()
236235
return
237236
}

backend/src/types/entity.ts

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { TagColor } from '@putongoj/shared'
22
import type { Types } from 'mongoose'
3-
import type { ContestOption, CourseRole } from '.'
3+
import type { CourseRole } from '.'
44
import type { CourseDocument } from '../models/Course'
55
import type { UserEntity } from '../models/User'
66
import type { encrypt, problemType, status } from '../utils/constants'
@@ -133,35 +133,6 @@ export type ProblemEntityView = Pick<ProblemEntity,
133133
tags: TagEntityItem[]
134134
}
135135

136-
// Contest
137-
138-
export interface ContestEntity extends Entity {
139-
cid: number
140-
title: string
141-
start: number
142-
end: number
143-
list: number[]
144-
status: number
145-
encrypt: number
146-
argument: string
147-
option: ContestOption
148-
course: CourseDocument | null
149-
}
150-
151-
export type ContestEntityEditable = Pick<ContestEntity,
152-
'title' | 'start' | 'end' | 'list' | 'status' | 'encrypt' | 'argument' | 'option'
153-
> & { course?: Types.ObjectId | null }
154-
155-
export type ContestEntityPreview = Pick<ContestEntity,
156-
'cid' | 'title' | 'start' | 'end' | 'status' | 'encrypt'
157-
>
158-
159-
export type ContestEntityView = Pick<ContestEntity,
160-
'cid' | 'title' | 'start' | 'end' | 'status' | 'encrypt' | 'list' | 'option'
161-
> & Partial<Pick<ContestEntity, 'argument'>> & {
162-
course: CourseEntityPreviewWithRole | null
163-
}
164-
165136
// Solution
166137

167138
export interface SolutionEntity extends Entity {
@@ -230,18 +201,3 @@ export interface GroupEntity extends Entity {
230201
list: string[]
231202
create: number
232203
}
233-
234-
// Discuss
235-
236-
export interface DiscussEntity extends Entity {
237-
did: number
238-
title: string
239-
uid: string
240-
comments: {
241-
uid: string
242-
content: string
243-
create: number
244-
}[]
245-
create: number
246-
update: number
247-
}

0 commit comments

Comments
 (0)