Refactoring to Typescript...
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// Common
|
||||
//
|
||||
|
||||
export type CommonProps = 'id' | 'createdAt'
|
||||
|
||||
type Opaque<T, K, L extends string = 'opaque'> = T & { _: K; __: L }
|
||||
|
||||
type Id<T> = Opaque<string, T, 'id'>
|
||||
|
||||
//
|
||||
// Users
|
||||
//
|
||||
|
||||
export type AdministratorRole = 'admin' | 'moderator'
|
||||
export type StudentRole = 'student'
|
||||
|
||||
export type UserRole = AdministratorRole | StudentRole
|
||||
|
||||
export type UserId = Id<User>
|
||||
|
||||
export type User = {
|
||||
id: UserId
|
||||
role: UserRole
|
||||
}
|
||||
|
||||
export function isAdministrator(role: UserRole): role is AdministratorRole {
|
||||
return role !== 'student'
|
||||
}
|
||||
|
||||
export function isStudent(role: UserRole): role is StudentRole {
|
||||
return role === 'student'
|
||||
}
|
||||
|
||||
//
|
||||
// Problems
|
||||
//
|
||||
|
||||
export type ProblemId = Id<Problem>
|
||||
|
||||
export type Problem = {
|
||||
id: ProblemId
|
||||
content: string
|
||||
createdBy: UserId
|
||||
createdAt: string
|
||||
}
|
||||
|
||||
//
|
||||
// Solutions
|
||||
//
|
||||
|
||||
export type SolutionStatus = 'pending' | 'rejected' | 'accepted'
|
||||
|
||||
export type SolutionId = string
|
||||
|
||||
export type Solution = {
|
||||
id: SolutionId
|
||||
sentBy: UserId
|
||||
forProblem: ProblemId
|
||||
content: string
|
||||
status: SolutionStatus
|
||||
}
|
||||
Reference in New Issue
Block a user