Skip to content

Commit

Permalink
✨ add judge response watcher
Browse files Browse the repository at this point in the history
  • Loading branch information
AlphaNecron committed Aug 3, 2023
1 parent aa5c52d commit 72b94b4
Show file tree
Hide file tree
Showing 56 changed files with 1,184 additions and 1,173 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
- name: Push to DockerHub
uses: docker/build-push-action@v4
with:
platforms: linux/amd64,linux/arm64
platforms: linux/amd64
cache-from: type=gha
cache-to: type=gha,mode=max
context: .
Expand Down
Empty file added blizzard.prof
Empty file.
63 changes: 63 additions & 0 deletions blizzard/cache/cache.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package cache

import (
"blizzard/blizzard/config"
"blizzard/blizzard/logger"
"context"
"fmt"
"github.com/allegro/bigcache/v3"
"github.com/eko/gocache/lib/v4/cache"
"github.com/eko/gocache/lib/v4/marshaler"
cachestore "github.com/eko/gocache/lib/v4/store"
bcstore "github.com/eko/gocache/store/bigcache/v4"
"strings"
"time"
)

type Store struct {
ctx context.Context
*marshaler.Marshaler
}

var store *Store

func Init() {
ctx := context.Background()
bc, _ := bigcache.NewBigCache(bigcache.DefaultConfig(5 * time.Minute))
bcStore := bcstore.NewBigcache(bc)
cacheManager := cache.New[interface{}](bcStore)
store = &Store{Marshaler: marshaler.New(cacheManager), ctx: ctx}
}

func Get[T any](category, key string, loader func() (T, error)) *T {
if config.Config.Debug {
v, e := loader()
if e != nil {
return nil
}
return &v
}
if strings.TrimSpace(key) == "" {
return nil
}
val, e := store.Get(store.ctx, key, new(T))
if e != nil {
v, e := loader()
if e != nil {
return nil
}
e = store.Set(store.ctx, key, v, cachestore.WithExpiration(time.Hour*24))
return &v
}
if v, ok := val.(*T); ok {
logger.Logger.Debug().Str("key", category+"_"+key).Interface("data", v).Msg("cache hit")
return v
} else {
fmt.Println("fail")
}
return nil
}

func Invalidate(category, key string) bool {
return store.Delete(store.ctx, category+"_"+key) == nil
}
25 changes: 0 additions & 25 deletions blizzard/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,43 +3,18 @@ package config
import (
"blizzard/blizzard/logger"
"blizzard/blizzard/models"
"blizzard/blizzard/utils"
"github.com/spf13/viper"
)

var Config *models.BlizzardConfig

// TODO: finalize defaultConfig
var defaultConfig = map[string]interface{}{
"host": "0.0.0.0",
"port": 2999,
// TODO: use a machine-bound key as privateKey instead of cryptographically random key
"privateKey": utils.Rand(16, ""),
"debug": false,
"enableCors": true,
"rateLimit": 1000,
"judges": map[string]models.Judge{},
"oauth": map[string]models.OAuthProvider{},
"storage": models.StorageConfig{},
"database": models.DatabaseConfig{
Address: "localhost:5432",
Name: "postgres",
Username: "postgres",
Password: "postgres",
Secure: false,
},
}

func readConfig() *models.BlizzardConfig {
// TODO: Command line arguments, env config and config file
var conf models.BlizzardConfig
v := viper.New()
v.SetConfigName("blizzard")
v.SetConfigType("yaml")
v.AddConfigPath(".")
for key, val := range defaultConfig {
v.SetDefault(key, val)
}
if e := v.ReadInConfig(); e != nil {
logger.Logger.Err(e).Msg("config_reader")
}
Expand Down
16 changes: 8 additions & 8 deletions blizzard/db/models/contest/contest.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,24 @@ import (

type (
Contest struct {
ID uint32 `bun:",pk,autoincrement" json:"id"`
Title string `bun:",notnull" json:"title"`
Tags []string `bun:",array,notnull" json:"tags"`
Organizers []user.User `bun:"m2m:contest_to_organizers,join:Contest=User"`
Problems []Problem `bun:"m2m:contest_to_problems,join:Contest=Problem" json:"contests"`
ID uint32 `bun:",pk,autoincrement" json:"id"`
Title string `bun:",notnull" json:"title"`
Tags []string `bun:",array,notnull" json:"tags"`
Organizers []*user.User `bun:"m2m:contest_to_organizers,join:Contest=User"`
Problems []*Problem `bun:"m2m:contest_to_problems,join:Contest=Problem" json:"contests"`
}

ContestToOrganizer struct {
ContestID uint64 `bun:",pk"`
ContestID uint32 `bun:",pk"`
Contest *Contest `bun:"rel:belongs-to,join:contest_id=id"`
UserID string `bun:",pk"`
User *user.User `bun:"rel:belongs-to,join:user_id=id"`
}

ContestToProblem struct {
ProblemID string `bun:",pk"`
Problem Problem `bun:"rel:belongs-to,join:problem_id=id"`
ContestID uint64 `bun:",pk"`
Problem *Problem `bun:"rel:belongs-to,join:problem_id=id"`
ContestID uint32 `bun:",pk"`
Contest *Contest `bun:"rel:belongs-to,join:contest_id=id"`
}
)
51 changes: 42 additions & 9 deletions blizzard/db/models/contest/problem.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,44 @@
package contest

import "blizzard/blizzard/db/models/user"

type Problem struct {
ID string `bun:",pk" json:"id"`
Tags []string `bun:",array,notnull" json:"tags"`
AuthorID string
Author user.User `bun:"rel:has-one,join:author_id=id"`
Content string `json:"content"`
}
import (
"blizzard/blizzard/db/models/user"
"github.com/google/uuid"
)

type (
Problem struct {
ID string `bun:",pk" json:"id"`
Tags []string `bun:",array,notnull" json:"tags"`
Source string `json:"source"`
AuthorID uuid.UUID `bun:",type:uuid" json:"authorID,omitempty"`
Author *user.User `bun:"rel:has-one,join:author_id=id" json:"-"`
*ProblemContent `bun:"embed:"`
Constraints *Constraints `bun:"embed:" json:"constraints,omitempty"`
TestCount uint16 `bun:",notnull" json:"testCount,omitempty"`
PointPerTest uint16 `bun:",default:1" json:"pointPerTest,omitempty"`
}

ProblemContent struct {
Title string `bun:",notnull" json:"title,omitempty"`
Statement string `bun:",notnull" json:"statement,omitempty"`
Input string `bun:",notnull" json:"input,omitempty"`
Output string `bun:",notnull" json:"output,omitempty"`
Scoring []string `bun:",array" json:"scoring,omitempty"`
SampleTestCases []*SampleTestCases `json:"sampleTestCases,omitempty"`
}

SampleTestCases struct {
Input string `json:"input"`
Output string `json:"output"`
Note string `json:"note"`
}

Constraints struct {
IsInteractive bool `bun:",default:false" json:"isInteractive"`
TimeLimit float32 `bun:",default:1" json:"timeLimit"`
MemoryLimit uint32 `bun:",default:128" json:"memoryLimit"`
OutputLimit uint32 `bun:",default:64" json:"outputLimit"`
AllowPartial bool `bun:",default:false" json:"allowPartial"`
ShortCircuit bool `bun:",default:false" json:"shortCircuit"`
}
)
43 changes: 35 additions & 8 deletions blizzard/db/models/contest/submission.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,37 @@
package contest

import "blizzard/blizzard/db/models/user"

type Submission struct {
// save the source code in a folder and load it by id
ID uint64 `bun:",pk,autoincrement" json:"id"`
AuthorID string
Author *user.User
}
import (
"blizzard/blizzard/db/models/user"
"github.com/google/uuid"
"time"
)

type (
Submission struct {
// save the source code in a folder and load it by id
ID uint32 `bun:",pk,autoincrement" json:"id"`
AuthorID uuid.UUID `bun:",type:uuid"`
ProblemID string
Language string
SubmittedAt *time.Time `bun:",nullzero,type:timestamptz,notnull,default:'now()'::timestamptz"`
Verdict Verdict `bun:",nullzero" json:"verdict"`
Author *user.User
}

Verdict = uint8
)

const (
Queued Verdict = iota
Accepted
InternalError
Rejected
Cancelled
RuntimeError
TimeLimitExceeded
MemoryLimitExceeded
OutputLimitExceeded
StackLimitExceeded
InvalidReturn
CompilerError
)
9 changes: 0 additions & 9 deletions blizzard/db/models/feeds/post.go

This file was deleted.

17 changes: 17 additions & 0 deletions blizzard/db/models/post/comment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package post

import (
"blizzard/blizzard/db/models/user"
"github.com/google/uuid"
"time"
)

type Comment struct {
ID uint32 `bun:",pk,autoincrement" json:"id"`
CommentedAt *time.Time `bun:",nullzero,type:timestamptz,notnull,default:'now()'::timestamptz" json:"commentedAt,omitempty"`
AuthorID uuid.UUID `bun:",type:uuid" json:"-"`
Author *user.User `bun:"rel:has-one,join:author_id=id" json:"author,omitempty"`
PostID uint32
Post *Post `bun:"rel:belongs-to,join:post_id=id"`
Content string
}
16 changes: 16 additions & 0 deletions blizzard/db/models/post/post.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package post

import (
"blizzard/blizzard/db/models/user"
"github.com/google/uuid"
"time"
)

type Post struct {
ID uint32 `bun:",pk,autoincrement" json:"id"`
Title string `bun:",notnull" json:"title"`
PostedAt *time.Time `bun:",nullzero,type:timestamptz,notnull,default:'now()'::timestamptz" json:"postedAt,omitempty"`
AuthorID uuid.UUID `bun:",type:uuid" json:"authorID,omitempty"`
Author *user.User `bun:"rel:has-one,join:author_id=id" json:"-"`
Comments []*Comment `bun:"rel:has-many,join:id=author_id" json:"comments,omitempty"`
}
4 changes: 2 additions & 2 deletions blizzard/db/models/user/oauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import (

type OAuthConnection struct {
ID string `bun:",pk" json:"-"`
Provider string `bun:",pk,notnull" json:"provider"`
Provider string `bun:",pk,unique:provider,notnull" json:"provider"`
Username string `bun:",notnull" json:"username"`
UserID uuid.UUID `bun:",type:uuid" json:"-"`
UserID uuid.UUID `bun:",type:uuid,unique:provider" json:"-"`
ShowInProfile bool `bun:",default:true" json:"-"`
}

Expand Down
14 changes: 8 additions & 6 deletions blizzard/db/models/user/role.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ import (
)

type Role struct {
ID uint16 `bun:",pk,autoincrement" json:"id"`
Name string `bun:",unique,notnull" json:"name"`
Permissions permission.Permission `bun:",default:0" json:"permissions"`
Badge string `json:"badge"`
Style string `bun:",default:'background-color:#90a8bb'" json:"style"`
Priority uint16 `bun:",notnull,default:1000" json:"priority"`
ID uint16 `bun:",pk,autoincrement" json:"id,omitempty"`
Name string `bun:",unique,notnull" json:"name,omitempty"`
Permissions permission.Permission `bun:",default:0" json:"permissions,omitempty"`
Icon string `json:"icon"`
Style string `bun:",default:'background-color:#90a8bb;color:black'" json:"style,omitempty"`
NameStyle string `json:"nameStyle"`
Priority uint16 `bun:",notnull,default:1000" json:"priority,omitempty"`
Members []*User `bun:"m2m:user_to_roles,join:Role=User" json:"members,omitempty"`
}
40 changes: 17 additions & 23 deletions blizzard/db/models/user/user.go
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
package user

import (
"blizzard/blizzard/db/utils"
"context"
"github.com/google/uuid"
"github.com/uptrace/bun"
"time"
)

type (
User struct {
ID uuid.UUID `bun:",pk,unique,type:uuid,default:gen_random_uuid()" json:"id"`
DisplayName string `json:"displayName,omitempty"`
Handle string `bun:",notnull,unique" json:"handle"`
Email string `bun:",notnull,unique" json:"email,omitempty"`
EmailVerified bool `bun:",default:false" json:"emailVerified,omitempty"`
Avatar string `bun:"-" json:"avatar"`
Password string `bun:",notnull" json:"password,omitempty"`
Organization string `json:"organization,omitempty"`
RegisteredAt *bun.NullTime `bun:",nullzero,type:timestamptz,notnull,default:'now()'::timestamptz" json:"registeredAt,omitempty"`
ApiKey string `json:"-"`
Connections []OAuthConnection `bun:",rel:has-many,join:id=user_id" json:"connections,omitempty"`
Roles []Role `bun:",m2m:user_to_roles,join:User=Role" json:"roles,omitempty"`
DeletedAt *bun.NullTime `bun:",soft_delete,nullzero" json:"deletedAt,omitempty"`
Rating uint16 `bun:",default:1000" json:"rating"`
ID uuid.UUID `bun:",pk,unique,type:uuid,default:gen_random_uuid()" json:"id,omitempty"`
DisplayName string `json:"displayName,omitempty"`
Handle string `bun:",notnull,unique" json:"handle,omitempty"`
Email string `bun:",notnull,unique" json:"email,omitempty"`
EmailVerified bool `bun:",default:false" json:"emailVerified,omitempty"`
Avatar string `bun:"-" json:"avatar,omitempty"`
Password string `bun:",notnull" json:"password,omitempty"`
Organization string `json:"organization,omitempty"`
RegisteredAt *time.Time `bun:",nullzero,type:timestamptz,notnull,default:'now()'::timestamptz" json:"registeredAt,omitempty"`
ApiKey string `json:"-"`
Connections []*OAuthConnection `bun:"rel:has-many,join:id=user_id" json:"connections,omitempty"`
Roles []*Role `bun:"m2m:user_to_roles,join:User=Role" json:"roles,omitempty"`
ProblemsSolved uint16 `bun:",scanonly" json:"problemsSolved,omitempty"`
DeletedAt *time.Time `bun:",soft_delete,nullzero" json:"deletedAt,omitempty"`
Rating uint16 `bun:",default:0" json:"rating"`
LastUsernameChange *time.Time `bun:",nullzero,type:timestamptz" json:"lastUsernameChange,omitempty"`
}

UserToRole struct {
Expand All @@ -32,9 +32,3 @@ type (
User *User `bun:"rel:belongs-to,join:user_id=id"`
}
)

func (UserToRole) BeforeCreateTable(_ context.Context, query *bun.CreateTableQuery) error {
utils.Cascade(query, "user_id", "users", "id")
utils.Cascade(query, "role_id", "roles", "id")
return nil
}
Loading

0 comments on commit 72b94b4

Please sign in to comment.