From 466a81903af8ed168e586ba39ae2cf986f1adee3 Mon Sep 17 00:00:00 2001 From: dragonmuffin Date: Mon, 23 Sep 2024 23:38:34 +0500 Subject: [PATCH] init --- contest.go | 10 ++++++++++ language.go | 14 +++++++++++++ participant.go | 8 ++++++++ problem.go | 13 +++++++++++++ result.go | 31 +++++++++++++++++++++++++++++ role.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ solution.go | 14 +++++++++++++ subtask.go | 8 ++++++++ task.go | 9 +++++++++ testgroup.go | 34 ++++++++++++++++++++++++++++++++ user.go | 9 +++++++++ 11 files changed, 203 insertions(+) create mode 100644 contest.go create mode 100644 language.go create mode 100644 participant.go create mode 100644 problem.go create mode 100644 result.go create mode 100644 role.go create mode 100644 solution.go create mode 100644 subtask.go create mode 100644 task.go create mode 100644 testgroup.go create mode 100644 user.go diff --git a/contest.go b/contest.go new file mode 100644 index 0000000..40a4e2b --- /dev/null +++ b/contest.go @@ -0,0 +1,10 @@ +package models + +import "time" + +type Contest struct { + Id *int `db:"id"` + Name *string `db:"name"` + CreatedAt *time.Time `db:"created_at"` + UpdatedAt *time.Time `db:"updated_at"` +} diff --git a/language.go b/language.go new file mode 100644 index 0000000..da0b1b6 --- /dev/null +++ b/language.go @@ -0,0 +1,14 @@ +package models + +type Language struct { + Name string + CompileCmd []string //source: src;result:executable + RunCmd []string //source: executable +} + +var Languages = [...]Language { + {Name : "gcc std=c90", + CompileCmd : []string{"gcc", "src","-std=c90","-o","executable"}, + RunCmd : []string{"executable"}}, +} + diff --git a/participant.go b/participant.go new file mode 100644 index 0000000..8db6814 --- /dev/null +++ b/participant.go @@ -0,0 +1,8 @@ +package models + +type Participant struct { + Id *int32 `db:"id"` + UserId *int32 `db:"user_id"` + ContestId *int32 `db:"contest_id"` + Name *string `db:"name"` +} diff --git a/problem.go b/problem.go new file mode 100644 index 0000000..80fbe9c --- /dev/null +++ b/problem.go @@ -0,0 +1,13 @@ +package models + +import "time" + +type Problem struct { + Id *int32 `db:"id"` + Name *string `db:"name"` + Description *string `db:"description"` + TimeLimit *int32 `db:"time_limit"` + MemoryLimit *int32 `db:"memory_limit"` + CreatedAt *time.Time `db:"created_at"` + UpdatedAt *time.Time `db:"updated_at"` +} diff --git a/result.go b/result.go new file mode 100644 index 0000000..d427a6d --- /dev/null +++ b/result.go @@ -0,0 +1,31 @@ +package models + +import ( + "errors" + "git.sch9.ru/new_gate/ms-tester/internal/lib" +) + +type Result int32 + +const ( + NotTested Result = 1 // change only with schema change + Accepted Result = 2 + WrongAnswer Result = 3 + PresentationError Result = 4 + CompilationError Result = 5 + MemoryLimitExceeded Result = 6 + TimeLimitExceeded Result = 7 + RuntimeError Result = 8 + SystemFailDuringTesting Result = 9 + Testing Result = 10 +) + +var ErrBadResult = errors.New("bad result") + +func (result Result) Valid() error { + switch result { + case NotTested, Accepted, TimeLimitExceeded, MemoryLimitExceeded, CompilationError, SystemFailDuringTesting: + return nil + } + return lib.ServiceError(ErrBadResult, lib.ErrValidationFailed, "bad result") +} diff --git a/role.go b/role.go new file mode 100644 index 0000000..a48cca8 --- /dev/null +++ b/role.go @@ -0,0 +1,53 @@ +package models + +import ( + "errors" + "git.sch9.ru/new_gate/ms-tester/internal/lib" +) + +type Role int32 + +const ( + RoleSpectator Role = 0 + RoleParticipant Role = 1 + RoleModerator Role = 2 + RoleAdmin Role = 3 +) + +func (role Role) IsAdmin() bool { + return role == RoleAdmin +} + +func (role Role) IsModerator() bool { + return role == RoleModerator +} + +func (role Role) IsParticipant() bool { + return role == RoleParticipant +} + +func (role Role) IsSpectator() bool { + return role == RoleSpectator +} + +func (role Role) AtLeast(other Role) bool { + return role >= other +} + +func (role Role) AtMost(other Role) bool { + return role <= other +} + +var ErrBadRole = errors.New("bad role") + +func (role Role) Valid() error { + switch role { + case RoleSpectator, RoleParticipant, RoleModerator, RoleAdmin: + return nil + } + return lib.ServiceError(ErrBadRole, lib.ErrValidationFailed, "bad role") +} + +func (role Role) AsPointer() *Role { + return &role +} diff --git a/solution.go b/solution.go new file mode 100644 index 0000000..9eb54aa --- /dev/null +++ b/solution.go @@ -0,0 +1,14 @@ +package models + +import "time" + +type Solution struct { + Id *int32 `db:"id"` + ParticipantId *int32 `db:"participant_id"` + TaskId *int32 `db:"task_id"` + LanguageId *int32 `db:"language_id"` + SolutionHash *string `db:"solution_hash"` + Result *int32 `db:"result"` + Score *int32 `db:"score"` + CreatedAt *time.Time `db:"created_at"` +} diff --git a/subtask.go b/subtask.go new file mode 100644 index 0000000..d4d51c0 --- /dev/null +++ b/subtask.go @@ -0,0 +1,8 @@ +package models + +type SubTask struct { + Id *int32 `db:"id"` + ContestId *int32 `db:"contest_id"` + TestgroupId *int32 `db:"testgroup_id"` + TaskId *int32 `db:"task_id"` +} diff --git a/task.go b/task.go new file mode 100644 index 0000000..f5e96a4 --- /dev/null +++ b/task.go @@ -0,0 +1,9 @@ +package models + +type Task struct { + Id *int32 `db:"id"` + ContestId *int32 `db:"contest_id"` + ProblemId *int32 `db:"problem_id"` + Position *int32 `db:"position"` + PositionName *string `db:"position_name"` +} diff --git a/testgroup.go b/testgroup.go new file mode 100644 index 0000000..f102a0c --- /dev/null +++ b/testgroup.go @@ -0,0 +1,34 @@ +package models + +import ( + "errors" + "git.sch9.ru/new_gate/ms-tester/internal/lib" +) + +type TestingStrategy int32 + +const ( + EachTestTS TestingStrategy = 1 + CompleteGroupTS TestingStrategy = 2 +) + +type Testgroup struct { + Id *int32 `db:"id"` + ProblemId *int32 `db:"problem_id"` + TestingStrategy *TestingStrategy `db:"testing_strategy"` +} + +type TestGroupData struct { + Ts TestingStrategy + TestAmount int32 +} + +var ErrBadTestingStrategy = errors.New("bad testing strategy") + +func (ts TestingStrategy) Valid() error { + switch ts { + case EachTestTS, CompleteGroupTS: + return nil + } + return lib.ServiceError(ErrBadTestingStrategy, lib.ErrValidationFailed, "bad testing strategy") +} diff --git a/user.go b/user.go new file mode 100644 index 0000000..357600c --- /dev/null +++ b/user.go @@ -0,0 +1,9 @@ +package models + +import "time" + +type User struct { + UserId *int32 `json:"user_id" db:"user_id"` + Role *Role `json:"role" db:"role"` + UpdatedAt *time.Time `json:"updated_at" db:"updated_at"` +}