Compare commits
9 Commits
6617b6d68e
...
b86ea2737d
Author | SHA1 | Date | |
---|---|---|---|
b86ea2737d | |||
bcf2699feb | |||
a9106ed363 | |||
596a7219cf | |||
988206ee5d | |||
036e0f1fe6 | |||
992b21fb9f | |||
1365e54aec | |||
87d5506085 |
8
.dockerignore
Normal file
8
.dockerignore
Normal file
@ -0,0 +1,8 @@
|
||||
# top
|
||||
/woj
|
||||
|
||||
# runner
|
||||
resource/runner/.mark.container
|
||||
resource/runner/problem/*
|
||||
resource/runner/tmp/*
|
||||
resource/runner/user/*
|
25
.idea/jsonSchemas.xml
Normal file
25
.idea/jsonSchemas.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JsonSchemaMappingsProjectConfiguration">
|
||||
<state>
|
||||
<map>
|
||||
<entry key="docker-compose.yml">
|
||||
<value>
|
||||
<SchemaInfo>
|
||||
<option name="name" value="docker-compose.yml" />
|
||||
<option name="relativePathToSchema" value="https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json" />
|
||||
<option name="applicationDefined" value="true" />
|
||||
<option name="patterns">
|
||||
<list>
|
||||
<Item>
|
||||
<option name="path" value="docker-compose.yml" />
|
||||
</Item>
|
||||
</list>
|
||||
</option>
|
||||
</SchemaInfo>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</state>
|
||||
</component>
|
||||
</project>
|
13
Makefile
13
Makefile
@ -1,8 +1,12 @@
|
||||
GO := go
|
||||
|
||||
LDFLAGS += -X cmd.BuildTime=$(shell date -u '+%Y-%m-%d-%I-%M-%S')
|
||||
LDFLAGS += -X cmd.Version=$(shell cat VERSION)+$(shell git rev-parse --short HEAD)
|
||||
LDFLAGS += -X cmd.SentryDSN=$(shell cat dsn.txt)
|
||||
PKG_BASE := $(shell head -n 1 go.mod | awk '{print $$2}')
|
||||
BUILD_TIME := $(shell date -u '+%Y%m%d-%I%M%S')
|
||||
VERSION := $(shell cat VERSION)+$(shell git rev-parse --short HEAD)
|
||||
|
||||
LDFLAGS += -X $(PKG_BASE)/cmd.BuildTime=$(BUILD_TIME)
|
||||
LDFLAGS += -X $(PKG_BASE)/cmd.Version=$(VERSION)
|
||||
LDFLAGS += -X $(PKG_BASE)/cmd.SentryDSN=$(shell cat dsn.txt)
|
||||
LDFLAGS += -s -w
|
||||
|
||||
GOBUILD := $(GO) build -ldflags '$(LDFLAGS)'
|
||||
@ -18,8 +22,7 @@ build: swagger dep
|
||||
$(GOBUILD) -o woj ./cmd/woj
|
||||
|
||||
clean:
|
||||
rm -f runner
|
||||
rm -f server
|
||||
rm -f woj
|
||||
|
||||
dep:
|
||||
go mod download
|
||||
|
35
Runner.Dockerfile
Normal file
35
Runner.Dockerfile
Normal file
@ -0,0 +1,35 @@
|
||||
# builder
|
||||
FROM docker.io/library/golang:alpine AS builder
|
||||
|
||||
ENV GOPROXY=https://goproxy.cn
|
||||
WORKDIR /builder
|
||||
|
||||
RUN apk add --no-cache git make
|
||||
RUN go install github.com/swaggo/swag/cmd/swag@latest
|
||||
|
||||
COPY go.mod /builder/go.mod
|
||||
COPY go.sum /builder/go.sum
|
||||
RUN go mod download
|
||||
|
||||
COPY . /builder
|
||||
RUN make build
|
||||
|
||||
|
||||
# main image
|
||||
FROM quay.io/podman/stable
|
||||
|
||||
# pkill
|
||||
RUN yum -y install jq procps-ng && yum -y clean all && rm -rf /var/cache
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# prepare images
|
||||
COPY --from=builder /builder/resource/runner /app/resource/runner
|
||||
RUN bash -c "cd /app/resource/runner/scripts && ./prepare_images.sh save"
|
||||
|
||||
# sources
|
||||
COPY --from=builder /builder/config.docker.yaml /app
|
||||
COPY --from=builder /builder/docker-entrypoint.sh /app
|
||||
COPY --from=builder /builder/woj /app
|
||||
|
||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
@ -1,5 +1,5 @@
|
||||
# builder
|
||||
FROM golang:alpine AS builder
|
||||
FROM docker.io/library/golang:alpine AS builder
|
||||
|
||||
ENV GOPROXY=https://goproxy.cn
|
||||
WORKDIR /builder
|
||||
@ -16,16 +16,14 @@ RUN make build
|
||||
|
||||
|
||||
# main image
|
||||
FROM alpine:latest
|
||||
FROM docker.io/library/alpine
|
||||
|
||||
WORKDIR /app
|
||||
RUN apk --no-cache add tzdata ca-certificates libc6-compat
|
||||
RUN apk --no-cache add tzdata ca-certificates libc6-compat bash
|
||||
|
||||
COPY --from=builder /builder/config.docker.yaml /app
|
||||
COPY --from=builder /builder/docker-entrypoint.sh /app
|
||||
COPY --from=builder /builder/resource/frontend /app/resource/frontend
|
||||
COPY --from=builder /builder/resource/runner /app/resource/runner
|
||||
|
||||
COPY --from=builder /builder/woj /app
|
||||
|
||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
57
build_image.sh
Executable file
57
build_image.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
. resource/runner/scripts/common.sh
|
||||
|
||||
# version
|
||||
VERSION="$(cat VERSION)"
|
||||
log_info "VERSION: $VERSION"
|
||||
|
||||
function build_base() {
|
||||
log_info "[+] Building Base Images"
|
||||
pushd resource/runner || exit 1
|
||||
$DOCKER build -t git.0x7f.app/woj/ubuntu-full:latest -f scripts/ubuntu-full.Dockerfile . ||
|
||||
(log_error "Build Full Image failed" && exit 1)
|
||||
$DOCKER build -t git.0x7f.app/woj/ubuntu-run:latest -f scripts/ubuntu-run.Dockerfile . ||
|
||||
(log_error "Build Tiny Image failed" && exit 1)
|
||||
popd
|
||||
}
|
||||
|
||||
function push_base() {
|
||||
log_info "[+] Pushing Base Images"
|
||||
$DOCKER push "git.0x7f.app/woj/ubuntu-full:latest"
|
||||
$DOCKER push "git.0x7f.app/woj/ubuntu-run:latest"
|
||||
}
|
||||
|
||||
function build_server() {
|
||||
log_info "[+] Building Server"
|
||||
$DOCKER build -t "git.0x7f.app/woj/woj-server:$VERSION" -f Server.Dockerfile . ||
|
||||
(log_error "[!] Failed to build Server" && exit 1)
|
||||
}
|
||||
|
||||
function build_runner() {
|
||||
log_info "[+] Building Runner"
|
||||
$DOCKER build \
|
||||
--cap-add=sys_admin,mknod \
|
||||
--device=/dev/fuse \
|
||||
--security-opt label=disable \
|
||||
-t "git.0x7f.app/woj/woj-runner:$VERSION" \
|
||||
-f Runner.Dockerfile . ||
|
||||
(log_error "[!] Failed to build Runner" && exit 1)
|
||||
}
|
||||
|
||||
function push_server() {
|
||||
log_info "[+] Pushing Server Images"
|
||||
$DOCKER push "git.0x7f.app/woj/woj-server:$VERSION"
|
||||
}
|
||||
|
||||
function push_runner() {
|
||||
log_info "[+] Pushing Runner Images"
|
||||
$DOCKER push "git.0x7f.app/woj/woj-runner:$VERSION"
|
||||
}
|
||||
|
||||
build_base
|
||||
push_base
|
||||
build_server
|
||||
push_server
|
||||
build_runner
|
||||
push_runner
|
@ -59,7 +59,7 @@ func init() {
|
||||
}
|
||||
|
||||
func getBuildTime() time.Time {
|
||||
build, err := time.Parse("2006-01-02-15-04-05", BuildTime)
|
||||
build, err := time.Parse("20060102-150405", BuildTime)
|
||||
if err != nil {
|
||||
log.Printf("failed to parse build time: %v", err)
|
||||
build = time.Now()
|
||||
@ -72,6 +72,8 @@ func setupSentry() {
|
||||
Dsn: SentryDSN,
|
||||
EnableTracing: true,
|
||||
TracesSampleRate: 1.0,
|
||||
SendDefaultPII: true,
|
||||
Release: Version,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("sentry.Init: %s", err)
|
||||
@ -84,16 +86,3 @@ func cleanupSentry(*cli.Context) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func PanicWrapper(f func(*cli.Context) error) func(*cli.Context) error {
|
||||
return func(c *cli.Context) error {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
sentry.CaptureException(r.(error))
|
||||
sentry.Flush(time.Second * 2)
|
||||
log.Printf("Panic Captured: %v", r)
|
||||
}
|
||||
}()
|
||||
return f(c)
|
||||
}
|
||||
}
|
||||
|
@ -18,10 +18,12 @@ import (
|
||||
"git.0x7f.app/WOJ/woj-server/internal/web/jwt"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/web/metrics"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/web/router"
|
||||
"github.com/getsentry/sentry-go"
|
||||
"github.com/samber/do"
|
||||
"github.com/urfave/cli/v2"
|
||||
slog "log"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@ -29,16 +31,22 @@ func main() {
|
||||
a.Usage = "woj-server"
|
||||
a.Commands = []*cli.Command{
|
||||
{
|
||||
Name: "web",
|
||||
Aliases: []string{"w"},
|
||||
Name: "server",
|
||||
Aliases: []string{"s"},
|
||||
Usage: "start web api server",
|
||||
Action: cmd.PanicWrapper(runServer),
|
||||
Action: wrap(appServer.RunServer),
|
||||
},
|
||||
{
|
||||
Name: "init",
|
||||
Aliases: []string{"i"},
|
||||
Usage: "init database",
|
||||
Action: wrap(appServer.RunServerInit),
|
||||
},
|
||||
{
|
||||
Name: "runner",
|
||||
Aliases: []string{"r"},
|
||||
Usage: "start runner",
|
||||
Action: cmd.PanicWrapper(runRunner),
|
||||
Action: wrap(appRunner.RunRunner),
|
||||
},
|
||||
}
|
||||
|
||||
@ -83,22 +91,22 @@ func prepareServices(c *cli.Context) *do.Injector {
|
||||
return injector
|
||||
}
|
||||
|
||||
func runServer(c *cli.Context) error {
|
||||
injector := prepareServices(c)
|
||||
func wrap(f func(i *do.Injector) error) func(*cli.Context) error {
|
||||
return func(c *cli.Context) error {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
sentry.CaptureException(r.(error))
|
||||
sentry.Flush(time.Second * 2)
|
||||
slog.Printf("Panic Captured: %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
logger := do.MustInvoke[log.Service](injector)
|
||||
defer func() { _ = logger.GetRawLogger().Sync() }()
|
||||
logger.GetRawLogger().Info("starting...")
|
||||
injector := prepareServices(c)
|
||||
|
||||
return appServer.RunServer(injector)
|
||||
}
|
||||
|
||||
func runRunner(c *cli.Context) error {
|
||||
injector := prepareServices(c)
|
||||
|
||||
logger := do.MustInvoke[log.Service](injector)
|
||||
defer func() { _ = logger.GetRawLogger().Sync() }()
|
||||
logger.GetRawLogger().Info("starting...")
|
||||
|
||||
return appRunner.RunRunner(injector)
|
||||
logger := do.MustInvoke[log.Service](injector)
|
||||
defer func() { _ = logger.GetRawLogger().Sync() }()
|
||||
logger.GetRawLogger().Info("starting...")
|
||||
|
||||
return f(injector)
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,8 @@ WebServer:
|
||||
Redis:
|
||||
Db: ${REDIS_DB}
|
||||
QueueDb: ${REDIS_QUEUE_DB}
|
||||
Address: ${REDIS_ADDRESS_PORT}
|
||||
Address: ${REDIS_ADDRESS}
|
||||
Port: ${REDIS_PORT}
|
||||
Password: ${REDIS_PASSWORD}
|
||||
|
||||
Database:
|
||||
|
@ -1,20 +1,18 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
server:
|
||||
build: .
|
||||
image: git.0x7f.app/woj/woj-server:1.1.0
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [ "CMD", "wget", "-q", "http://127.0.0.1:8000/health" ]
|
||||
test: [ "CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:8000/health" ]
|
||||
interval: 5s
|
||||
command: web
|
||||
command: server
|
||||
environment:
|
||||
- REDIS_ADDRESS_PORT=cache:6379
|
||||
- REDIS_ADDRESS=cache
|
||||
- DATABASE_HOST=db
|
||||
- DATABASE_USER=dev
|
||||
- DATABASE_PASSWORD=password
|
||||
- DATABASE_NAME=dev
|
||||
- STORAGE_ENDPOINT=minio:9000
|
||||
- STORAGE_ENDPOINT=storage:9000
|
||||
- STORAGE_ACCESS_KEY=access_key
|
||||
- STORAGE_SECRET_KEY=secret_key
|
||||
- STORAGE_BUCKET=woj
|
||||
@ -23,6 +21,8 @@ services:
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
depends_on:
|
||||
runner:
|
||||
condition: service_started
|
||||
storage:
|
||||
condition: service_healthy
|
||||
cache:
|
||||
@ -32,22 +32,36 @@ services:
|
||||
ports:
|
||||
- "8000:8000"
|
||||
|
||||
#runner:
|
||||
# build: .
|
||||
# restart: unless-stopped
|
||||
# command: runner
|
||||
# environment:
|
||||
# - REDIS_ADDRESS_PORT=cache:6379
|
||||
# - DEVELOPMENT=true
|
||||
# volumes:
|
||||
# - runner:/app/resource/runner/user
|
||||
# - /etc/timezone:/etc/timezone:ro
|
||||
# - /etc/localtime:/etc/localtime:ro
|
||||
# depends_on:
|
||||
# - cache
|
||||
runner:
|
||||
image: git.0x7f.app/woj/woj-runner:1.1.0
|
||||
restart: unless-stopped
|
||||
command: runner
|
||||
security_opt:
|
||||
- "label=disable"
|
||||
cap_add:
|
||||
- SYS_ADMIN
|
||||
- MKNOD
|
||||
devices:
|
||||
- "/dev/fuse"
|
||||
environment:
|
||||
- REDIS_ADDRESS=cache
|
||||
- STORAGE_ENDPOINT=storage:9000
|
||||
- STORAGE_ACCESS_KEY=access_key
|
||||
- STORAGE_SECRET_KEY=secret_key
|
||||
- STORAGE_BUCKET=woj
|
||||
- DEVELOPMENT=true
|
||||
volumes:
|
||||
- runner:/app/resource/runner/user
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
depends_on:
|
||||
storage:
|
||||
condition: service_healthy
|
||||
cache:
|
||||
condition: service_healthy
|
||||
|
||||
storage:
|
||||
image: minio/minio:latest
|
||||
image: quay.io/minio/minio:latest
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [ "CMD", "curl", "-f", "http://127.0.0.1:9000/minio/health/live" ]
|
||||
@ -55,13 +69,13 @@ services:
|
||||
entrypoint: sh
|
||||
command: -c 'mkdir -p /data/woj && minio server /data'
|
||||
environment:
|
||||
MINIO_ACCESS_KEY: "access_key"
|
||||
MINIO_SECRET_KEY: "secret_key"
|
||||
MINIO_ROOT_USER: "access_key"
|
||||
MINIO_ROOT_PASSWORD: "secret_key"
|
||||
volumes:
|
||||
- storage:/data
|
||||
|
||||
cache:
|
||||
image: redis:alpine
|
||||
image: docker.io/library/redis:alpine
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [ "CMD", "redis-cli", "ping" ]
|
||||
@ -70,7 +84,7 @@ services:
|
||||
- cache:/data
|
||||
|
||||
db:
|
||||
image: postgres:alpine
|
||||
image: docker.io/library/postgres:alpine
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [ "CMD", "pg_isready", "-U", "dev" ]
|
||||
@ -86,4 +100,4 @@ volumes:
|
||||
runner:
|
||||
storage:
|
||||
cache:
|
||||
db:
|
||||
db:
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/bin/ash
|
||||
#!/bin/bash
|
||||
set -eo pipefail
|
||||
|
||||
COLOR_RED="\e[0;31m"
|
||||
@ -41,7 +41,8 @@ check_env "WEB_SERVER_JWT_EXPIRE_HOUR" 12 false
|
||||
|
||||
check_env "REDIS_DB" 0 false
|
||||
check_env "REDIS_QUEUE_DB" 1 false
|
||||
check_env "REDIS_ADDRESS_PORT" "redis:6379" true
|
||||
check_env "REDIS_ADDRESS" "redis" true
|
||||
check_env "REDIS_PORT" 6379 false
|
||||
check_env "REDIS_PASSWORD" "" true
|
||||
|
||||
check_env "DATABASE_HOST" "postgres" true
|
||||
|
91
go.mod
91
go.mod
@ -3,93 +3,94 @@ module git.0x7f.app/WOJ/woj-server
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
github.com/gin-contrib/cors v1.4.0
|
||||
github.com/TheZeroSlave/zapsentry v1.20.0
|
||||
github.com/getsentry/sentry-go v0.25.0
|
||||
github.com/gin-contrib/cors v1.5.0
|
||||
github.com/gin-contrib/pprof v1.4.0
|
||||
github.com/gin-contrib/zap v0.1.0
|
||||
github.com/gin-contrib/zap v0.2.0
|
||||
github.com/gin-gonic/gin v1.9.1
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0
|
||||
github.com/hibiken/asynq v0.24.1
|
||||
github.com/jackc/pgtype v1.14.0
|
||||
github.com/minio/minio-go/v7 v7.0.60
|
||||
github.com/prometheus/client_golang v1.16.0
|
||||
github.com/redis/go-redis/v9 v9.0.5
|
||||
github.com/minio/minio-go/v7 v7.0.66
|
||||
github.com/prometheus/client_golang v1.17.0
|
||||
github.com/redis/go-redis/v9 v9.3.0
|
||||
github.com/samber/do v1.6.0
|
||||
github.com/swaggo/files v1.0.1
|
||||
github.com/swaggo/gin-swagger v1.6.0
|
||||
github.com/swaggo/swag v1.16.1
|
||||
github.com/urfave/cli/v2 v2.25.7
|
||||
go.uber.org/zap v1.24.0
|
||||
golang.org/x/crypto v0.11.0
|
||||
golang.org/x/text v0.11.0
|
||||
github.com/swaggo/swag v1.16.2
|
||||
github.com/urfave/cli/v2 v2.26.0
|
||||
go.uber.org/zap v1.26.0
|
||||
golang.org/x/crypto v0.16.0
|
||||
golang.org/x/text v0.14.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
gorm.io/driver/postgres v1.5.2
|
||||
gorm.io/gorm v1.25.2
|
||||
gorm.io/driver/postgres v1.5.4
|
||||
gorm.io/gorm v1.25.5
|
||||
moul.io/zapgorm2 v1.3.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||
github.com/TheZeroSlave/zapsentry v1.17.0 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bytedance/sonic v1.9.2 // indirect
|
||||
github.com/bytedance/sonic v1.10.2 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
|
||||
github.com/chenzhuoyu/iasm v0.9.1 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
|
||||
github.com/getsentry/sentry-go v0.22.0 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.20.0 // indirect
|
||||
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
||||
github.com/go-openapi/spec v0.20.9 // indirect
|
||||
github.com/go-openapi/swag v0.22.4 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.20.1 // indirect
|
||||
github.com/go-openapi/jsonreference v0.20.3 // indirect
|
||||
github.com/go-openapi/spec v0.20.12 // indirect
|
||||
github.com/go-openapi/swag v0.22.5 // indirect
|
||||
github.com/go-playground/locales v0.14.1 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||
github.com/go-playground/validator/v10 v10.14.1 // indirect
|
||||
github.com/go-playground/validator/v10 v10.16.0 // indirect
|
||||
github.com/goccy/go-json v0.10.2 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
github.com/google/uuid v1.5.0 // indirect
|
||||
github.com/jackc/pgio v1.0.0 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
|
||||
github.com/jackc/pgx/v4 v4.18.1 // indirect
|
||||
github.com/jackc/pgx/v5 v5.4.2 // indirect
|
||||
github.com/jackc/pgx/v5 v5.5.1 // indirect
|
||||
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/compress v1.16.7 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
||||
github.com/klauspost/compress v1.17.4 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
|
||||
github.com/leodido/go-urn v1.2.4 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
|
||||
github.com/minio/md5-simd v1.1.2 // indirect
|
||||
github.com/minio/sha256-simd v1.0.1 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.9 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.44.0 // indirect
|
||||
github.com/prometheus/procfs v0.11.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
|
||||
github.com/prometheus/client_model v0.5.0 // indirect
|
||||
github.com/prometheus/common v0.45.0 // indirect
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
github.com/robfig/cron/v3 v3.0.1 // indirect
|
||||
github.com/rs/xid v1.5.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/spf13/cast v1.5.1 // indirect
|
||||
github.com/spf13/cast v1.6.0 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.11 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||
go.opentelemetry.io/otel v1.16.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.16.0 // indirect
|
||||
go.uber.org/atomic v1.11.0 // indirect
|
||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/arch v0.4.0 // indirect
|
||||
golang.org/x/net v0.12.0 // indirect
|
||||
golang.org/x/sys v0.10.0 // indirect
|
||||
golang.org/x/time v0.3.0 // indirect
|
||||
golang.org/x/tools v0.11.0 // indirect
|
||||
golang.org/x/arch v0.6.0 // indirect
|
||||
golang.org/x/net v0.19.0 // indirect
|
||||
golang.org/x/sync v0.5.0 // indirect
|
||||
golang.org/x/sys v0.15.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
golang.org/x/tools v0.16.1 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
)
|
||||
|
233
go.sum
233
go.sum
@ -2,31 +2,33 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
|
||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/TheZeroSlave/zapsentry v1.17.0 h1:RIQCG89U7vWWZVmmCxeUz/g32WEcAYXUrXHoMlbSDmc=
|
||||
github.com/TheZeroSlave/zapsentry v1.17.0/go.mod h1:D1YMfSuu6xnkhwFXxrronesmsiyDhIqo+86I3Ok+r64=
|
||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||
github.com/TheZeroSlave/zapsentry v1.20.0 h1:PP7Qb2OPue+E87NqvEq4xcT50Y7BXKYHdGwb0GmsrpE=
|
||||
github.com/TheZeroSlave/zapsentry v1.20.0/go.mod h1:D1YMfSuu6xnkhwFXxrronesmsiyDhIqo+86I3Ok+r64=
|
||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
|
||||
github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
|
||||
github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||
github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
|
||||
github.com/bytedance/sonic v1.9.2 h1:GDaNjuWSGu09guE9Oql0MSTNhNCLlWwO8y/xM5BzcbM=
|
||||
github.com/bytedance/sonic v1.9.2/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
|
||||
github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
|
||||
github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=
|
||||
github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
|
||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=
|
||||
github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
|
||||
github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=
|
||||
github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@ -36,44 +38,34 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
|
||||
github.com/getsentry/sentry-go v0.22.0 h1:XNX9zKbv7baSEI65l+H1GEJgSeIC1c7EN5kluWaP6dM=
|
||||
github.com/getsentry/sentry-go v0.22.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
|
||||
github.com/gin-contrib/cors v1.4.0 h1:oJ6gwtUl3lqV0WEIwM/LxPF1QZ5qe2lGWdY2+bz7y0g=
|
||||
github.com/gin-contrib/cors v1.4.0/go.mod h1:bs9pNM0x/UsmHPBWT2xZz9ROh8xYjYkiURUfmBoMlcs=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
|
||||
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
|
||||
github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI=
|
||||
github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
|
||||
github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
|
||||
github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
|
||||
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
|
||||
github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg=
|
||||
github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-contrib/zap v0.1.0 h1:RMSFFJo34XZogV62OgOzvrlaMNmXrNxmJ3bFmMwl6Cc=
|
||||
github.com/gin-contrib/zap v0.1.0/go.mod h1:hvnZaPs478H1PGvRP8w89ZZbyJUiyip4ddiI/53WG3o=
|
||||
github.com/gin-contrib/zap v0.2.0 h1:HLvt3rZXyC8XC+s2lHzMFow3UDqiEbfrBWJyHHS6L8A=
|
||||
github.com/gin-contrib/zap v0.2.0/go.mod h1:eqfbe9ZmI+GgTZF6nRiC2ZwDeM4DK1Viwc8OxTCphh0=
|
||||
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
||||
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
|
||||
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
|
||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
|
||||
github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ=
|
||||
github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA=
|
||||
github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
|
||||
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
|
||||
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
|
||||
github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8=
|
||||
github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
|
||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
||||
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||
github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
|
||||
github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||
github.com/go-openapi/jsonpointer v0.20.1 h1:MkK4VEIEZMj4wT9PmjaUmGflVBr9nvud4Q4UVFbDoBE=
|
||||
github.com/go-openapi/jsonpointer v0.20.1/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
|
||||
github.com/go-openapi/jsonreference v0.20.3 h1:EjGcjTW8pD1mRis6+w/gmoBdqv5+RbE9B85D1NgDOVQ=
|
||||
github.com/go-openapi/jsonreference v0.20.3/go.mod h1:FviDZ46i9ivh810gqzFLl5NttD5q3tSlMLqLr6okedM=
|
||||
github.com/go-openapi/spec v0.20.12 h1:cgSLbrsmziAP2iais+Vz7kSazwZ8rsUZd6TUzdDgkVI=
|
||||
github.com/go-openapi/spec v0.20.12/go.mod h1:iSCgnBcwbMW9SfzJb8iYynXvcY6C/QFrI7otzF7xGM4=
|
||||
github.com/go-openapi/swag v0.22.5 h1:fVS63IE3M0lsuWRzuom3RLwUMVI2peDH01s6M70ugys=
|
||||
github.com/go-openapi/swag v0.22.5/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
|
||||
@ -83,8 +75,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
||||
github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k=
|
||||
github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
|
||||
github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE=
|
||||
github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||
@ -92,20 +84,19 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG
|
||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
||||
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/hibiken/asynq v0.24.1 h1:+5iIEAyA9K/lcSPvx3qoPtsKJeKI5u9aOIvUmSsazEw=
|
||||
github.com/hibiken/asynq v0.24.1/go.mod h1:u5qVeSbrnfT+vtG5Mq8ZPzQu/BmCKMHvTGb91uy9Tts=
|
||||
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
|
||||
@ -139,8 +130,9 @@ github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwX
|
||||
github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0=
|
||||
github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
|
||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA=
|
||||
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
|
||||
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
|
||||
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
|
||||
@ -153,12 +145,14 @@ github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQ
|
||||
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
|
||||
github.com/jackc/pgx/v4 v4.18.1 h1:YP7G1KABtKpB5IHrO9vYwSrCOhs7p3uqhvhhQBptya0=
|
||||
github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE=
|
||||
github.com/jackc/pgx/v5 v5.4.2 h1:u1gmGDwbdRUZiwisBm/Ky2M14uQyUP65bG8+20nnyrg=
|
||||
github.com/jackc/pgx/v5 v5.4.2/go.mod h1:q6iHT8uDNXWiFNOlRqJzBTaSH3+2xCXkokxHZC5qWFY=
|
||||
github.com/jackc/pgx/v5 v5.5.1 h1:5I9etrGkLrN+2XPCsi6XLlV5DITbSL/xBZdmAxFcXPI=
|
||||
github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
|
||||
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
||||
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
@ -166,17 +160,16 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
||||
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
|
||||
github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
|
||||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
|
||||
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
@ -196,9 +189,6 @@ github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
@ -207,14 +197,14 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
|
||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||
github.com/minio/minio-go/v7 v7.0.60 h1:iHkrmWyHFs/eZiWc2F/5jAHtNBAFy+HjdhMX6FkkPWc=
|
||||
github.com/minio/minio-go/v7 v7.0.60/go.mod h1:NUDy4A4oXPq1l2yK6LTSvCEzAMeIcoz9lcj5dbzSrRE=
|
||||
github.com/minio/minio-go/v7 v7.0.66 h1:bnTOXOHjOqv/gcMuiVbN9o2ngRItvqE774dG9nq0Dzw=
|
||||
github.com/minio/minio-go/v7 v7.0.66/go.mod h1:DHAgmyQEGdW3Cif0UooKOyrT3Vxs82zNdV6tkKhRtbs=
|
||||
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
||||
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
@ -222,34 +212,32 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
||||
github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0=
|
||||
github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
||||
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
|
||||
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
||||
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
|
||||
github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
|
||||
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
|
||||
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
|
||||
github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk=
|
||||
github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
|
||||
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
|
||||
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
|
||||
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
|
||||
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
|
||||
github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
|
||||
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
|
||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
||||
github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
|
||||
github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
|
||||
github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
|
||||
github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0=
|
||||
github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
|
||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
|
||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
|
||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
@ -262,14 +250,13 @@ github.com/samber/do v1.6.0/go.mod h1:DWqBvumy8dyb2vEnYZE7D7zaVEB64J45B0NjTlY/M4
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
|
||||
github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
|
||||
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
|
||||
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
@ -291,37 +278,29 @@ github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
|
||||
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
|
||||
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
|
||||
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
|
||||
github.com/swaggo/swag v1.16.1 h1:fTNRhKstPKxcnoKsytm4sahr8FaYzUcT7i1/3nd/fBg=
|
||||
github.com/swaggo/swag v1.16.1/go.mod h1:9/LMvHycG3NFHfR6LwvikHv5iFvmPADQ359cKikGxto=
|
||||
github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04=
|
||||
github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
|
||||
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
|
||||
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
|
||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
|
||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
||||
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
github.com/urfave/cli/v2 v2.26.0 h1:3f3AMg3HpThFNT4I++TKOejZO8yU55t3JnnSr4S4QEI=
|
||||
github.com/urfave/cli/v2 v2.26.0/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
|
||||
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
|
||||
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||
go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
|
||||
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
|
||||
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
|
||||
go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
|
||||
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
|
||||
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
||||
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
@ -334,12 +313,11 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
||||
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
|
||||
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
|
||||
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc=
|
||||
golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=
|
||||
golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
@ -351,14 +329,14 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
||||
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
||||
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||
golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
|
||||
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
|
||||
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
@ -368,12 +346,13 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
|
||||
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
|
||||
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
|
||||
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@ -396,8 +375,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
@ -409,11 +388,11 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
|
||||
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
@ -425,8 +404,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
|
||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
|
||||
golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
|
||||
golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
|
||||
golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@ -441,7 +420,6 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
@ -450,19 +428,18 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0=
|
||||
gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8=
|
||||
gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo=
|
||||
gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0=
|
||||
gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||
gorm.io/gorm v1.25.2 h1:gs1o6Vsa+oVKG/a9ElL3XgyGfghFfkKA2SInQaCyMho=
|
||||
gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
|
||||
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
|
||||
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
moul.io/zapgorm2 v1.3.0 h1:+CzUTMIcnafd0d/BvBce8T4uPn6DQnpIrz64cyixlkk=
|
||||
moul.io/zapgorm2 v1.3.0/go.mod h1:nPVy6U9goFKHR4s+zfSo1xVFaoU7Qgd5DoCdOfzoCqs=
|
||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
|
@ -15,6 +15,7 @@ type createVersionRequest struct {
|
||||
// CreateVersion
|
||||
// @Summary create a problem version
|
||||
// @Description create a problem version
|
||||
// @Tags problem
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param pid formData int true "problem id"
|
||||
|
@ -13,6 +13,7 @@ type detailsRequest struct {
|
||||
// Details
|
||||
// @Summary get details of a problem
|
||||
// @Description get details of a problem
|
||||
// @Tags problem
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param pid formData int true "problem id"
|
||||
|
@ -18,6 +18,7 @@ type Handler interface {
|
||||
Search(c *gin.Context)
|
||||
Update(c *gin.Context)
|
||||
Upload(c *gin.Context)
|
||||
CreateVersion(c *gin.Context)
|
||||
}
|
||||
|
||||
type handler struct {
|
||||
|
@ -12,6 +12,7 @@ type searchRequest struct {
|
||||
// Search
|
||||
// @Summary get detail of a problem
|
||||
// @Description get detail of a problem
|
||||
// @Tags problem
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param search formData string false "word search"
|
||||
|
@ -17,6 +17,7 @@ type updateRequest struct {
|
||||
// Update
|
||||
// @Summary create or update a problem
|
||||
// @Description create or update a problem
|
||||
// @Tags problem
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param pid formData int false "problem id, 0 for create"
|
||||
|
@ -11,6 +11,7 @@ import (
|
||||
// Upload
|
||||
// @Summary get upload url
|
||||
// @Description get upload url
|
||||
// @Tags problem
|
||||
// @Produce json
|
||||
// @Response 200 {object} e.Response "upload url and key"
|
||||
// @Security Authentication
|
||||
|
@ -12,6 +12,7 @@ type queryRequest struct {
|
||||
// Query
|
||||
// @Summary query submissions by via submission id
|
||||
// @Description query submissions by via submission id
|
||||
// @Tags status
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param sid formData uint true "submission id"
|
||||
|
@ -15,6 +15,7 @@ type queryByVersionRequest struct {
|
||||
// QueryByProblemVersion
|
||||
// @Summary query submissions by problem version (admin only)
|
||||
// @Description query submissions by problem version (admin only)
|
||||
// @Tags status
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param pvid formData uint true "problem version id"
|
||||
|
@ -16,6 +16,7 @@ type createRequest struct {
|
||||
// Create
|
||||
// @Summary create a submission
|
||||
// @Description create a submission
|
||||
// @Tags submission
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param pid formData int true "problem id"
|
||||
@ -32,14 +33,7 @@ func (h *handler) Create(c *gin.Context) {
|
||||
}
|
||||
|
||||
uid := claim.(*model.Claim).UID
|
||||
|
||||
role := claim.(*model.Claim).Role
|
||||
req := new(createRequest)
|
||||
|
||||
if err := c.ShouldBind(req); err != nil {
|
||||
e.Pong(c, e.InvalidParameter, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// guest can not submit
|
||||
if role < model.RoleGeneral {
|
||||
@ -47,6 +41,12 @@ func (h *handler) Create(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
req := new(createRequest)
|
||||
if err := c.ShouldBind(req); err != nil {
|
||||
e.Pong(c, e.InvalidParameter, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
createData := &submission.CreateData{
|
||||
ProblemID: req.Pid,
|
||||
UserID: uid,
|
||||
|
@ -21,6 +21,7 @@ type queryResponse struct {
|
||||
// Query
|
||||
// @Summary Query submissions
|
||||
// @Description Query submissions
|
||||
// @Tags submission
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param pid formData uint false "problem id"
|
||||
|
@ -13,6 +13,7 @@ type rejudgeRequest struct {
|
||||
// Rejudge
|
||||
// @Summary rejudge a submission
|
||||
// @Description rejudge a submission
|
||||
// @Tags submission
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param sid formData int true "submission id"
|
||||
|
@ -16,6 +16,7 @@ type createRequest struct {
|
||||
// Create
|
||||
// @Summary create a new user
|
||||
// @Description create a new user
|
||||
// @Tags user
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param username formData string true "username"
|
||||
|
@ -15,6 +15,7 @@ type loginRequest struct {
|
||||
// Login
|
||||
// @Summary login
|
||||
// @Description login and return token
|
||||
// @Tags user
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param username formData string true "username"
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
// Logout
|
||||
// @Summary logout
|
||||
// @Description logout
|
||||
// @Tags user
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Response 200 {object} e.Response "nil"
|
||||
|
@ -13,6 +13,7 @@ type profileRequest struct {
|
||||
// Profile
|
||||
// @Summary profile
|
||||
// @Description fetch user profile
|
||||
// @Tags user
|
||||
// @Accept application/x-www-form-urlencoded
|
||||
// @Produce json
|
||||
// @Param uid formData int false "user id"
|
||||
|
@ -1,6 +1,7 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/api/runner"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/log"
|
||||
@ -28,7 +29,7 @@ func RunRunner(i *do.Injector) error {
|
||||
|
||||
srv := asynq.NewServer(
|
||||
asynq.RedisClientOpt{
|
||||
Addr: conf.Redis.Address,
|
||||
Addr: fmt.Sprintf("%s:%d", conf.Redis.Address, conf.Redis.Port),
|
||||
Password: conf.Redis.Password,
|
||||
DB: conf.Redis.QueueDb,
|
||||
},
|
||||
|
@ -2,6 +2,7 @@ package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/api/consumer"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
|
||||
@ -22,10 +23,23 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func RunServer(i *do.Injector) error { // Prepare Router
|
||||
func RunServerInit(i *do.Injector) error {
|
||||
slog := do.MustInvoke[log.Service](i).GetLogger("app.server")
|
||||
|
||||
// Migrate and shutdown database
|
||||
err := do.MustInvoke[db.Service](i).Close()
|
||||
if err != nil {
|
||||
slog.Warn("Database Close Failed", zap.Error(err))
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func RunServer(i *do.Injector) error {
|
||||
conf := do.MustInvoke[config.Service](i).GetConfig()
|
||||
slog := do.MustInvoke[log.Service](i).GetLogger("app.server")
|
||||
|
||||
// Prepare Router
|
||||
routers := do.MustInvoke[router.Service](i).GetRouter()
|
||||
|
||||
// Create Server
|
||||
@ -37,7 +51,7 @@ func RunServer(i *do.Injector) error { // Prepare Router
|
||||
|
||||
// Run Server
|
||||
go func() {
|
||||
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||
if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||
slog.Fatal("ListenAndServe Failed", zap.Error(err))
|
||||
}
|
||||
}()
|
||||
@ -51,7 +65,7 @@ func RunServer(i *do.Injector) error { // Prepare Router
|
||||
}
|
||||
queueSrv := asynq.NewServer(
|
||||
asynq.RedisClientOpt{
|
||||
Addr: conf.Redis.Address,
|
||||
Addr: fmt.Sprintf("%s:%d", conf.Redis.Address, conf.Redis.Port),
|
||||
Password: conf.Redis.Password,
|
||||
DB: conf.Redis.QueueDb,
|
||||
},
|
||||
|
@ -11,6 +11,7 @@ type ConfigRedis struct {
|
||||
Db int `yaml:"Db"`
|
||||
QueueDb int `yaml:"QueueDb"`
|
||||
Address string `yaml:"Address"`
|
||||
Port int `yaml:"Port"`
|
||||
Password string `yaml:"Password"`
|
||||
}
|
||||
|
||||
|
3
internal/repo/cache/redis.go
vendored
3
internal/repo/cache/redis.go
vendored
@ -2,6 +2,7 @@ package cache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/log"
|
||||
"github.com/redis/go-redis/v9"
|
||||
@ -22,7 +23,7 @@ func NewService(i *do.Injector) (Service, error) {
|
||||
srv.log = do.MustInvoke[log.Service](i).GetLogger("redis")
|
||||
|
||||
conf := do.MustInvoke[config.Service](i).GetConfig()
|
||||
srv.setup(conf.Redis.Address, conf.Redis.Password, conf.Redis.Db)
|
||||
srv.setup(fmt.Sprintf("%s:%d", conf.Redis.Address, conf.Redis.Port), conf.Redis.Password, conf.Redis.Db)
|
||||
return srv, srv.err
|
||||
}
|
||||
|
||||
|
@ -18,9 +18,13 @@ func (s *service) EnsureDeps(force bool) e.Status {
|
||||
return e.Success
|
||||
}
|
||||
|
||||
script := filepath.Join(ScriptsDir, "prepare_container.sh")
|
||||
script := filepath.Join(ScriptsDir, "prepare_images.sh")
|
||||
cmd := exec.Command(script)
|
||||
cmd.Dir = ScriptsDir
|
||||
if s.verbose {
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
}
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
s.log.Warn("prebuild docker images failed", zap.Error(err))
|
||||
|
@ -2,6 +2,7 @@ package task
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/e"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/misc/log"
|
||||
@ -29,7 +30,7 @@ func NewService(i *do.Injector) (Service, error) {
|
||||
conf := do.MustInvoke[config.Service](i).GetConfig()
|
||||
|
||||
redisOpt := asynq.RedisClientOpt{
|
||||
Addr: conf.Redis.Address,
|
||||
Addr: fmt.Sprintf("%s:%d", conf.Redis.Address, conf.Redis.Port),
|
||||
Password: conf.Redis.Password,
|
||||
DB: conf.Redis.QueueDb,
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package jwt
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/e"
|
||||
"git.0x7f.app/WOJ/woj-server/internal/model"
|
||||
@ -26,7 +27,8 @@ func (s *service) ParseToken(tokenText string) (*model.Claim, e.Status) {
|
||||
return s.SigningKey, nil
|
||||
})
|
||||
|
||||
if ve, ok := err.(*jwt.ValidationError); ok {
|
||||
var ve *jwt.ValidationError
|
||||
if errors.As(err, &ve) {
|
||||
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
|
||||
return nil, e.TokenMalformed
|
||||
} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
|
||||
@ -35,9 +37,6 @@ func (s *service) ParseToken(tokenText string) (*model.Claim, e.Status) {
|
||||
} else {
|
||||
return nil, e.TokenInvalid
|
||||
}
|
||||
} else if err != nil {
|
||||
s.log.Warn("JWT Token Parse Error", zap.Error(err))
|
||||
return nil, e.TokenUnknown
|
||||
}
|
||||
|
||||
if token.Valid {
|
||||
|
@ -1,70 +0,0 @@
|
||||
import random
|
||||
import string
|
||||
|
||||
from locust import HttpUser, task
|
||||
|
||||
|
||||
def randomstring(length):
|
||||
return ''.join(random.choice(string.ascii_letters) for i in range(length))
|
||||
|
||||
|
||||
class WOJUser(HttpUser):
|
||||
|
||||
def on_start(self):
|
||||
self.username = randomstring(16)
|
||||
self.nickname = randomstring(16)
|
||||
self.password = randomstring(16)
|
||||
|
||||
with self.client.post("/api/v1/user/create", data={
|
||||
"username": self.username,
|
||||
"nickname": self.nickname,
|
||||
"password": self.password
|
||||
}) as resp:
|
||||
j = resp.json()
|
||||
if j["code"] != 0:
|
||||
resp.failure("create user failed")
|
||||
else:
|
||||
self.token = j["body"]
|
||||
|
||||
@task
|
||||
def view_problem(self):
|
||||
pid = []
|
||||
|
||||
with self.client.post("/api/v1/problem/search") as resp:
|
||||
j = resp.json()
|
||||
if j["code"] != 0:
|
||||
resp.failure("search problem failed")
|
||||
else:
|
||||
for p in j["body"]:
|
||||
pid.append(p["meta"]["ID"])
|
||||
|
||||
for p in pid:
|
||||
with self.client.post("/api/v1/problem/details", data={"pid": pid}) as resp:
|
||||
if resp.json()["code"] != 0:
|
||||
resp.failure("view problem failed")
|
||||
|
||||
@task
|
||||
def submit_code(self):
|
||||
code = """
|
||||
#include<iostream>
|
||||
using namespace std;
|
||||
int main() {
|
||||
int a, b;
|
||||
cin >> a >> b;
|
||||
cout << a + b;
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
|
||||
with self.client.post("/api/v1/submission/create",
|
||||
headers={"Authorization": "Bearer " + self.token},
|
||||
data={"pid": 5, "language": "cpp", "code": code}
|
||||
) as resp:
|
||||
if resp.json()["code"] != 0:
|
||||
resp.failure("submit code failed")
|
||||
|
||||
@task
|
||||
def view_submission(self):
|
||||
with self.client.post("/api/v1/submission/query", data={"pid": 5, "limit": 100}) as resp:
|
||||
if resp.json()["code"] != 0:
|
||||
resp.failure("view submission failed")
|
79
resource/deploy/cache.yaml
Normal file
79
resource/deploy/cache.yaml
Normal file
@ -0,0 +1,79 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: cache-config
|
||||
labels:
|
||||
app: cache
|
||||
data:
|
||||
redis.conf: |
|
||||
requirepass YeT_An0tHeR_VeRy-S3cUr3^PaSsWoRd
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: cache-pvc
|
||||
labels:
|
||||
app: cache
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: local-path
|
||||
resources:
|
||||
requests:
|
||||
storage: 2Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: cache-deployment
|
||||
labels:
|
||||
app: cache
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cache
|
||||
template:
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: cache-pod
|
||||
labels:
|
||||
app: cache
|
||||
spec:
|
||||
containers:
|
||||
- name: cache
|
||||
image: docker.io/library/redis:7-alpine
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 6379
|
||||
volumeMounts:
|
||||
- name: cache-vol
|
||||
mountPath: /data
|
||||
- name: cache-config
|
||||
mountPath: /etc/redis/
|
||||
volumes:
|
||||
- name: cache-vol
|
||||
persistentVolumeClaim:
|
||||
claimName: cache-pvc
|
||||
- name: cache-config
|
||||
configMap:
|
||||
name: cache-config
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: cache-service
|
||||
labels:
|
||||
app: cache
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: cache
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 6379
|
||||
targetPort: 6379
|
78
resource/deploy/db.yaml
Normal file
78
resource/deploy/db.yaml
Normal file
@ -0,0 +1,78 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: db-config
|
||||
labels:
|
||||
app: db
|
||||
data:
|
||||
POSTGRES_USER: "woj"
|
||||
POSTGRES_PASSWORD: "A_VeRy-S3cUr3^PaSsWoRd"
|
||||
POSTGRES_DB: "woj"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: db-pvc
|
||||
labels:
|
||||
app: db
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: local-path
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: db-deployment
|
||||
labels:
|
||||
app: db
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: db
|
||||
template:
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: db-pod
|
||||
labels:
|
||||
app: db
|
||||
spec:
|
||||
containers:
|
||||
- name: db
|
||||
image: docker.io/library/postgres:16-alpine
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: db-config
|
||||
volumeMounts:
|
||||
- name: db-vol
|
||||
mountPath: /var/lib/postgresql/data
|
||||
volumes:
|
||||
- name: db-vol
|
||||
persistentVolumeClaim:
|
||||
claimName: db-pvc
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: db-service
|
||||
labels:
|
||||
app: db
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: db
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
targetPort: 5432
|
74
resource/deploy/runner.yaml
Normal file
74
resource/deploy/runner.yaml
Normal file
@ -0,0 +1,74 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: runner-config
|
||||
labels:
|
||||
app: runner
|
||||
data:
|
||||
DATABASE_HOST: "db-service.woj.svc.cluster.local"
|
||||
DATABASE_USER: "woj"
|
||||
DATABASE_PASSWORD: "A_VeRy-S3cUr3^PaSsWoRd"
|
||||
DATABASE_NAME: "woj"
|
||||
|
||||
REDIS_ADDRESS: "cache-service.woj.svc.cluster.local"
|
||||
REDIS_PASSWORD: "YeT_An0tHeR_VeRy-S3cUr3^PaSsWoRd"
|
||||
|
||||
STORAGE_ENDPOINT: "storage-service.woj.svc.cluster.local:9000"
|
||||
STORAGE_ACCESS_KEY: "A_VeRy_CoMpLeX_AcCeSs_KeY"
|
||||
STORAGE_SECRET_KEY: "A_VeRy_CoMpLeX_ScReT_KeY"
|
||||
STORAGE_BUCKET: "woj"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: runner-pvc
|
||||
labels:
|
||||
app: runner
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: local-path
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: runner-deployment
|
||||
labels:
|
||||
app: runner
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: runner
|
||||
template:
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: runner-pod
|
||||
labels:
|
||||
app: runner
|
||||
spec:
|
||||
containers:
|
||||
- name: runner
|
||||
image: git.0x7f.app/woj/woj-runner:1.1.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- runner
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: runner-config
|
||||
securityContext:
|
||||
privileged: true
|
||||
volumeMounts:
|
||||
- name: runner-vol
|
||||
mountPath: /app/resource/runner/user
|
||||
volumes:
|
||||
- name: runner-vol
|
||||
persistentVolumeClaim:
|
||||
claimName: runner-pvc
|
77
resource/deploy/server.yaml
Normal file
77
resource/deploy/server.yaml
Normal file
@ -0,0 +1,77 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: server-config
|
||||
labels:
|
||||
app: server
|
||||
data:
|
||||
DATABASE_HOST: "db-service.woj.svc.cluster.local"
|
||||
DATABASE_USER: "woj"
|
||||
DATABASE_PASSWORD: "A_VeRy-S3cUr3^PaSsWoRd"
|
||||
DATABASE_NAME: "woj"
|
||||
|
||||
REDIS_ADDRESS: "cache-service.woj.svc.cluster.local"
|
||||
REDIS_PASSWORD: "YeT_An0tHeR_VeRy-S3cUr3^PaSsWoRd"
|
||||
|
||||
STORAGE_ENDPOINT: "storage-service.woj.svc.cluster.local:9000"
|
||||
STORAGE_ACCESS_KEY: "A_VeRy_CoMpLeX_AcCeSs_KeY"
|
||||
STORAGE_SECRET_KEY: "A_VeRy_CoMpLeX_ScReT_KeY"
|
||||
STORAGE_BUCKET: "woj"
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: server-deployment
|
||||
labels:
|
||||
app: server
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: server
|
||||
template:
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: server-pod
|
||||
labels:
|
||||
app: server
|
||||
spec:
|
||||
initContainers:
|
||||
- name: init-server
|
||||
image: git.0x7f.app/woj/woj-server:1.1.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- init
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: server-config
|
||||
containers:
|
||||
- name: server
|
||||
image: git.0x7f.app/woj/woj-server:1.1.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- server
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: server-config
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: server-service
|
||||
labels:
|
||||
app: server
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: server
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 8000
|
||||
targetPort: 8000
|
84
resource/deploy/storage.yaml
Normal file
84
resource/deploy/storage.yaml
Normal file
@ -0,0 +1,84 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: storage-config
|
||||
labels:
|
||||
app: storage
|
||||
data:
|
||||
MINIO_ROOT_USER: "A_VeRy_CoMpLeX_AcCeSs_KeY"
|
||||
MINIO_ROOT_PASSWORD: "A_VeRy_CoMpLeX_ScReT_KeY"
|
||||
MINIO_VOLUMES: "/data"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: storage-pvc
|
||||
labels:
|
||||
app: storage
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: local-path
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: storage-deployment
|
||||
labels:
|
||||
app: storage
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: storage
|
||||
template:
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: storage-pod
|
||||
labels:
|
||||
app: storage
|
||||
spec:
|
||||
containers:
|
||||
- name: storage
|
||||
image: quay.io/minio/minio:latest
|
||||
imagePullPolicy: Always
|
||||
command:
|
||||
- /bin/bash
|
||||
- -c
|
||||
args:
|
||||
- mkdir -p /data/woj && minio server /data --console-address ":9001"
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
- containerPort: 9001
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: storage-config
|
||||
volumeMounts:
|
||||
- name: storage-vol
|
||||
mountPath: /data
|
||||
volumes:
|
||||
- name: storage-vol
|
||||
persistentVolumeClaim:
|
||||
claimName: storage-pvc
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
namespace: woj
|
||||
name: storage-service
|
||||
labels:
|
||||
app: storage
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: storage
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 9000
|
||||
targetPort: 9000
|
3
resource/runner/.gitignore
vendored
3
resource/runner/.gitignore
vendored
@ -1,7 +1,4 @@
|
||||
# docker image mark
|
||||
.mark.*
|
||||
# tmp dockerfile
|
||||
ubuntu-full.Dockerfile
|
||||
ubuntu-run.Dockerfile
|
||||
# other tmp files
|
||||
*.zip
|
||||
|
@ -10,5 +10,8 @@ function log_warn() { echo -e "${COLOR_YELLOW}$*${COLOR_NONE}" 1>&2; }
|
||||
function log_error() { echo -e "${COLOR_RED}$*${COLOR_NONE}" 1>&2; }
|
||||
|
||||
# Docker or Podman
|
||||
DOCKER="docker"
|
||||
if [ "$USE_PODMAN" ]; then DOCKER="podman"; fi
|
||||
DOCKER="podman"
|
||||
if [ "$USE_DOCKER" ]; then
|
||||
log_error "docker is deprecated"
|
||||
log_info "Use podman instead"
|
||||
fi
|
||||
|
@ -1,59 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
. common.sh
|
||||
|
||||
cd "$(dirname "$0")"/../ || exit 1
|
||||
|
||||
# Check Mark
|
||||
if [ -f ./.mark.container ]; then
|
||||
log_warn "Docker containers already prepared"
|
||||
log_warn "If you want to re-prepare the containers, please remove the file $(pwd)/.mark.container"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Preparing container..."
|
||||
log_info "Using $DOCKER - $($DOCKER --version)"
|
||||
|
||||
# Full
|
||||
log_info "Building Full Image"
|
||||
cat <<EOF >ubuntu-full.Dockerfile
|
||||
FROM docker.io/library/ubuntu:22.04
|
||||
WORKDIR /woj/
|
||||
|
||||
# Install dependencies
|
||||
RUN apt-get update && apt-get upgrade -y && apt-get install -y gcc g++ clang make cmake autoconf m4 libtool gperf git parallel python3 && apt-get clean && rm -rf /var/lib/apt/lists
|
||||
|
||||
# Copy source code
|
||||
RUN mkdir -p /woj/framework && mkdir -p /woj/problem
|
||||
COPY framework /woj/framework
|
||||
|
||||
# Build
|
||||
RUN cd /woj/framework/template && ./setup.sh
|
||||
RUN cd /woj/framework/scripts && ./setup.sh
|
||||
|
||||
# Environment
|
||||
ENV WOJ_LAUNCHER=/woj/framework/scripts/woj_launcher
|
||||
ENV WOJ_SANDBOX=/woj/framework/scripts/libwoj_sandbox.so
|
||||
ENV TEMPLATE=/woj/framework/template
|
||||
ENV TESTLIB=/woj/framework/template/testlib
|
||||
ENV PREFIX=/woj/problem
|
||||
EOF
|
||||
$DOCKER build -t woj/ubuntu-full -f ubuntu-full.Dockerfile . || exit 1
|
||||
rm ubuntu-full.Dockerfile
|
||||
|
||||
# Tiny
|
||||
log_info "Building Tiny Image"
|
||||
cat <<EOF >ubuntu-run.Dockerfile
|
||||
FROM woj/ubuntu-full:latest AS builder
|
||||
FROM docker.io/library/ubuntu:22.04
|
||||
WORKDIR /woj/problem
|
||||
RUN mkdir -p /woj/framework/scripts
|
||||
COPY --from=builder /woj/framework/scripts/libwoj_sandbox.so /woj/framework/scripts/
|
||||
COPY --from=builder /woj/framework/scripts/woj_launcher /woj/framework/scripts/
|
||||
EOF
|
||||
$DOCKER build -t woj/ubuntu-run -f ubuntu-run.Dockerfile . || exit 1
|
||||
rm ubuntu-run.Dockerfile
|
||||
|
||||
touch ./.mark.container
|
||||
|
||||
log_info "Done"
|
52
resource/runner/scripts/prepare_images.sh
Executable file
52
resource/runner/scripts/prepare_images.sh
Executable file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
. common.sh
|
||||
|
||||
cd "$(dirname "$0")"/../ || exit 1
|
||||
|
||||
# Check Mark
|
||||
if [ -f ./.mark.image ]; then
|
||||
log_warn "Docker images already prepared"
|
||||
log_warn "If you want to re-prepare the images, please remove the file $(pwd)/.mark.image"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Preparing image..."
|
||||
log_info "Checking $DOCKER - $($DOCKER --version)"
|
||||
|
||||
# Full
|
||||
if [ -f ./tmp/ubuntu-full.tar.gz ]; then
|
||||
log_info "Importing Full Image"
|
||||
gzip -d -c ./tmp/ubuntu-full.tar.gz | $DOCKER load || (log_error "Import Full Image failed" && exit 1)
|
||||
else
|
||||
log_info "Pulling Full Image"
|
||||
if ! $DOCKER pull git.0x7f.app/woj/ubuntu-full:latest; then
|
||||
log_warn "Pull failed, building from scratch"
|
||||
log_info "Building Full Image"
|
||||
$DOCKER build -t git.0x7f.app/woj/ubuntu-full:latest -f scripts/ubuntu-full.Dockerfile . || (log_error "Build Full Image failed" && exit 1)
|
||||
fi
|
||||
fi
|
||||
|
||||
# Tiny
|
||||
if [ -f ./tmp/ubuntu-tiny.tar.gz ]; then
|
||||
log_info "Importing Tiny Image"
|
||||
gzip -d -c ./tmp/ubuntu-tiny.tar.gz | $DOCKER load || (log_error "Import Tiny Image failed" && exit 1)
|
||||
else
|
||||
log_info "Pulling Tiny Image"
|
||||
if ! $DOCKER pull git.0x7f.app/woj/ubuntu-run:latest; then
|
||||
log_warn "Pull failed, building from scratch"
|
||||
log_info "Building Tiny Image"
|
||||
$DOCKER build -t git.0x7f.app/woj/ubuntu-run:latest -f scripts/ubuntu-run.Dockerfile . || (log_error "Build Tiny Image failed" && exit 1)
|
||||
fi
|
||||
fi
|
||||
|
||||
# Mark
|
||||
if [ "$1" == "save" ]; then
|
||||
log_info "Saving Images"
|
||||
$DOCKER save git.0x7f.app/woj/ubuntu-full:latest | gzip -9 >./tmp/ubuntu-full.tar.gz
|
||||
$DOCKER save git.0x7f.app/woj/ubuntu-run:latest | gzip -9 >./tmp/ubuntu-tiny.tar.gz
|
||||
else
|
||||
touch ./.mark.image
|
||||
fi
|
||||
|
||||
log_info "Done"
|
@ -9,67 +9,67 @@
|
||||
# $3: language
|
||||
# exports: Info_Script, Info_Cmp, Info_Num, Info_Limit_Time, Info_Limit_Memory, Info_Limit_NProc
|
||||
function get_problem_info() {
|
||||
local err
|
||||
local err
|
||||
|
||||
if [ ! -f "$1/problem/$2/config.json" ]; then
|
||||
log_error "problem $2 not found"
|
||||
return 1
|
||||
fi
|
||||
if [ ! -f "$1/problem/$2/config.json" ]; then
|
||||
log_error "problem $2 not found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
parse_language_info "$1" "$2" "$3"
|
||||
err=$?
|
||||
if [ "$err" -ne 0 ]; then
|
||||
return "$err"
|
||||
fi
|
||||
parse_language_info "$1" "$2" "$3"
|
||||
err=$?
|
||||
if [ "$err" -ne 0 ]; then
|
||||
return "$err"
|
||||
fi
|
||||
|
||||
parse_limits "$1" "$2"
|
||||
err=$?
|
||||
if [ "$err" -ne 0 ]; then
|
||||
return "$err"
|
||||
fi
|
||||
parse_limits "$1" "$2"
|
||||
err=$?
|
||||
if [ "$err" -ne 0 ]; then
|
||||
return "$err"
|
||||
fi
|
||||
}
|
||||
|
||||
function parse_language_info() {
|
||||
export Info_Script
|
||||
export Info_Cmp
|
||||
export Info_Script
|
||||
export Info_Cmp
|
||||
|
||||
local lang_config
|
||||
local lang_type
|
||||
local lang_script
|
||||
local lang_config
|
||||
local lang_type
|
||||
local lang_script
|
||||
|
||||
lang_config=$(jq ".Languages[] | select(.Lang == \"$3\")" "$1/problem/$2/config.json")
|
||||
if [ -z "$lang_config" ]; then
|
||||
log_error "language $3 is not supported"
|
||||
return 1
|
||||
fi
|
||||
lang_config=$(jq ".Languages[] | select(.Lang == \"$3\")" "$1/problem/$2/config.json")
|
||||
if [ -z "$lang_config" ]; then
|
||||
log_error "language $3 is not supported"
|
||||
return 1
|
||||
fi
|
||||
|
||||
Info_Cmp=$(echo "$lang_config" | jq -r ".Cmp")
|
||||
Info_Cmp=$(echo "$lang_config" | jq -r ".Cmp")
|
||||
|
||||
lang_type=$(echo "$lang_config" | jq -r ".Type")
|
||||
lang_script=$(echo "$lang_config" | jq -r ".Script")
|
||||
lang_type=$(echo "$lang_config" | jq -r ".Type")
|
||||
lang_script=$(echo "$lang_config" | jq -r ".Script")
|
||||
|
||||
if [ "$lang_type" == "custom" ]; then
|
||||
Info_Script="/woj/problem/judge/$lang_script"
|
||||
elif [ "$lang_type" == "default" ]; then
|
||||
Info_Script="/woj/framework/template/default/$3.Makefile"
|
||||
else
|
||||
log_warn "Config file might be corrupted!"
|
||||
log_error "Unknown language type: $lang_type"
|
||||
return 1
|
||||
fi
|
||||
if [ "$lang_type" == "custom" ]; then
|
||||
Info_Script="/woj/problem/judge/$lang_script"
|
||||
elif [ "$lang_type" == "default" ]; then
|
||||
Info_Script="/woj/framework/template/default/$3.Makefile"
|
||||
else
|
||||
log_warn "Config file might be corrupted!"
|
||||
log_error "Unknown language type: $lang_type"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function parse_limits() {
|
||||
export Info_Limit_Time
|
||||
export Info_Limit_Memory
|
||||
export Info_Limit_NProc
|
||||
export Info_Num
|
||||
export Info_Limit_Time
|
||||
export Info_Limit_Memory
|
||||
export Info_Limit_NProc
|
||||
export Info_Num
|
||||
|
||||
local cfg
|
||||
cfg="$1/problem/$2/config.json"
|
||||
local cfg
|
||||
cfg="$1/problem/$2/config.json"
|
||||
|
||||
Info_Limit_Time=$(jq ".Runtime.TimeLimit" "$cfg")
|
||||
Info_Limit_Memory=$(jq ".Runtime.MemoryLimit" "$cfg")
|
||||
Info_Limit_NProc=$(jq ".Runtime.NProcLimit" "$cfg")
|
||||
Info_Num=$(jq ".Tasks | length" "$1/problem/$2/config.json")
|
||||
Info_Limit_Time=$(jq ".Runtime.TimeLimit" "$cfg")
|
||||
Info_Limit_Memory=$(jq ".Runtime.MemoryLimit" "$cfg")
|
||||
Info_Limit_NProc=$(jq ".Runtime.NProcLimit" "$cfg")
|
||||
Info_Num=$(jq ".Tasks | length" "$1/problem/$2/config.json")
|
||||
}
|
||||
|
@ -6,8 +6,8 @@ WORKSPACE=$(cd "$(dirname "$0")"/.. && pwd)
|
||||
. "$WORKSPACE"/scripts/problem.sh
|
||||
|
||||
if [ "$1" == "" ] || [ ! -d "$WORKSPACE/problem/$1" ] || [ "$2" == "" ] || [ ! -d "$WORKSPACE/user/$2" ] || [ -z "$3" ]; then
|
||||
log_warn "Usage: $0 <problem> <user_dir> <language> <timeout>"
|
||||
exit 1
|
||||
log_warn "Usage: $0 <problem> <user_dir> <language> <timeout>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
get_problem_info "$WORKSPACE" "$1" "$3"
|
||||
@ -20,11 +20,11 @@ rm -f "$EXE_FILE" && touch "$EXE_FILE"
|
||||
|
||||
export TIMEOUT=${4:-60}
|
||||
docker_run \
|
||||
-v "$WORKSPACE"/problem/"$1"/judge:/woj/problem/judge:ro \
|
||||
-v "$SRC_FILE":/woj/problem/user/"$2"."$3":ro \
|
||||
-v "$EXE_FILE":/woj/problem/user/"$2".out \
|
||||
-e USER_PROG="$2" \
|
||||
-e LANG="$3" \
|
||||
woj/ubuntu-full \
|
||||
sh -c \
|
||||
"cd /woj/problem/user && make -f $Info_Script compile"
|
||||
-v "$WORKSPACE"/problem/"$1"/judge:/woj/problem/judge:ro \
|
||||
-v "$SRC_FILE":/woj/problem/user/"$2"."$3":ro \
|
||||
-v "$EXE_FILE":/woj/problem/user/"$2".out \
|
||||
-e USER_PROG="$2" \
|
||||
-e LANG="$3" \
|
||||
git.0x7f.app/woj/ubuntu-full \
|
||||
sh -c \
|
||||
"cd /woj/problem/user && make -f $Info_Script compile"
|
||||
|
@ -6,35 +6,35 @@ WORKSPACE=$(cd "$(dirname "$0")"/.. && pwd)
|
||||
. "$WORKSPACE"/scripts/problem.sh
|
||||
|
||||
if [ "$1" == "" ] || [ ! -d "$WORKSPACE/problem/$1" ] || [ "$2" == "" ] || [ ! -d "$WORKSPACE/user/$2" ] || [ -z "$3" ]; then
|
||||
log_warn "Usage: $0 <problem> <user_dir> <language> <timeout>"
|
||||
exit 1
|
||||
log_warn "Usage: $0 <problem> <user_dir> <language> <timeout>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
get_problem_info "$WORKSPACE" "$1" "$3"
|
||||
|
||||
export TIMEOUT=${4:-60}
|
||||
for test_num in $(seq "$Info_Num"); do
|
||||
std_file="$WORKSPACE/problem/$1/data/output/$test_num.output"
|
||||
ans_file="$WORKSPACE/user/$2/$test_num.out.usr"
|
||||
jdg_file="$WORKSPACE/user/$2/$test_num.judge"
|
||||
std_file="$WORKSPACE/problem/$1/data/output/$test_num.output"
|
||||
ans_file="$WORKSPACE/user/$2/$test_num.out.usr"
|
||||
jdg_file="$WORKSPACE/user/$2/$test_num.judge"
|
||||
|
||||
if [ ! -f "$std_file" ] || [ ! -f "$ans_file" ]; then
|
||||
log_error "Missing test case $test_num"
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "$std_file" ] || [ ! -f "$ans_file" ]; then
|
||||
log_error "Missing test case $test_num"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Judging test case $test_num"
|
||||
log_info "Judging test case $test_num"
|
||||
|
||||
touch "$jdg_file"
|
||||
touch "$jdg_file"
|
||||
|
||||
docker_run \
|
||||
-v "$WORKSPACE"/problem/"$1"/judge:/woj/problem/judge:ro \
|
||||
-v "$WORKSPACE"/problem/"$1"/data:/woj/problem/data:ro \
|
||||
-v "$ans_file":/woj/problem/user/"$test_num".out.usr \
|
||||
-v "$jdg_file":/woj/problem/user/"$test_num".judge \
|
||||
-e TEST_NUM="$test_num" \
|
||||
-e CMP="$Info_Cmp" \
|
||||
woj/ubuntu-full \
|
||||
sh -c \
|
||||
"cd /woj/problem/user && make -f $Info_Script judge"
|
||||
docker_run \
|
||||
-v "$WORKSPACE"/problem/"$1"/judge:/woj/problem/judge:ro \
|
||||
-v "$WORKSPACE"/problem/"$1"/data:/woj/problem/data:ro \
|
||||
-v "$ans_file":/woj/problem/user/"$test_num".out.usr \
|
||||
-v "$jdg_file":/woj/problem/user/"$test_num".judge \
|
||||
-e TEST_NUM="$test_num" \
|
||||
-e CMP="$Info_Cmp" \
|
||||
git.0x7f.app/woj/ubuntu-full \
|
||||
sh -c \
|
||||
"cd /woj/problem/user && make -f $Info_Script judge"
|
||||
done
|
||||
|
@ -5,28 +5,28 @@ WORKSPACE=$(cd "$(dirname "$0")"/.. && pwd)
|
||||
. "$WORKSPACE"/scripts/common.sh
|
||||
|
||||
if [ "$1" == "" ] || [ ! -d "$WORKSPACE/problem/$1" ]; then
|
||||
log_warn "Usage: $0 <problem> <timeout>"
|
||||
exit 1
|
||||
log_warn "Usage: $0 <problem> <timeout>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "$WORKSPACE/problem/$1/.mark.prebuild" ]; then
|
||||
log_warn "Problem $1 already prebuilt"
|
||||
log_warn "If you want to re-prebuild the problem, please remove the file $WORKSPACE/problem/$1/.mark.prebuild"
|
||||
exit 0
|
||||
log_warn "Problem $1 already prebuilt"
|
||||
log_warn "If you want to re-prebuild the problem, please remove the file $WORKSPACE/problem/$1/.mark.prebuild"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -f "$WORKSPACE/problem/$1/judge/prebuild.Makefile" ]; then
|
||||
log_warn "Problem $1 does not have prebuild scripts"
|
||||
log_warn "$WORKSPACE/problem/$1/.mark.prebuild"
|
||||
exit 0
|
||||
log_warn "Problem $1 does not have prebuild scripts"
|
||||
log_warn "$WORKSPACE/problem/$1/.mark.prebuild"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
export TIMEOUT=${2:-300}
|
||||
docker_run \
|
||||
-v "$WORKSPACE/problem/$1/data":/woj/problem/data \
|
||||
-v "$WORKSPACE/problem/$1/judge":/woj/problem/judge \
|
||||
-e PREFIX=/woj/problem \
|
||||
woj/ubuntu-full \
|
||||
sh -c "cd /woj/problem/judge && make -f prebuild.Makefile prebuild && touch .mark.prebuild"
|
||||
-v "$WORKSPACE/problem/$1/data":/woj/problem/data \
|
||||
-v "$WORKSPACE/problem/$1/judge":/woj/problem/judge \
|
||||
-e PREFIX=/woj/problem \
|
||||
git.0x7f.app/woj/ubuntu-full \
|
||||
sh -c "cd /woj/problem/judge && make -f prebuild.Makefile prebuild && touch .mark.prebuild"
|
||||
|
||||
mv "$WORKSPACE/problem/$1/judge/.mark.prebuild" "$WORKSPACE/problem/$1/.mark.prebuild" || exit 1
|
||||
|
@ -6,20 +6,20 @@ WORKSPACE=$(cd "$(dirname "$0")"/.. && pwd)
|
||||
. "$WORKSPACE"/scripts/problem.sh
|
||||
|
||||
if [ "$1" == "" ] || [ ! -d "$WORKSPACE/problem/$1" ] || [ "$2" == "" ] || [ ! -d "$WORKSPACE/user/$2" ] || [ -z "$3" ]; then
|
||||
log_warn "Usage: $0 <problem> <user_dir> <language>"
|
||||
exit 1
|
||||
log_warn "Usage: $0 <problem> <user_dir> <language>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$WORKSPACE/problem/$1/.mark.prebuild" ]; then
|
||||
log_warn "Problem $1 has not been prebuilt"
|
||||
log_warn "Please run 'problem_prebuild.sh $1' first"
|
||||
exit 1
|
||||
log_warn "Problem $1 has not been prebuilt"
|
||||
log_warn "Please run 'problem_prebuild.sh $1' first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$WORKSPACE/user/$2/$2.out" ]; then
|
||||
log_warn "User $2 has not been compiled"
|
||||
log_warn "Please run 'problem_compile.sh ...' first"
|
||||
exit 1
|
||||
log_warn "User $2 has not been compiled"
|
||||
log_warn "Please run 'problem_compile.sh ...' first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
parse_limits "$WORKSPACE" "$1"
|
||||
@ -35,37 +35,37 @@ TIMEOUT=$(((LIMIT_TIME + 1000) / 1000 + 4))
|
||||
log_info "Timeout: $TIMEOUT"
|
||||
|
||||
for test_num in $(seq "$Info_Num"); do
|
||||
test_case="$WORKSPACE/problem/$1/data/input/$test_num.input"
|
||||
exe_file="$WORKSPACE/user/$2/$2.out"
|
||||
ans_file="$WORKSPACE/user/$2/$test_num.out.usr"
|
||||
ifo_file="$WORKSPACE/user/$2/$test_num.info"
|
||||
test_case="$WORKSPACE/problem/$1/data/input/$test_num.input"
|
||||
exe_file="$WORKSPACE/user/$2/$2.out"
|
||||
ans_file="$WORKSPACE/user/$2/$test_num.out.usr"
|
||||
ifo_file="$WORKSPACE/user/$2/$test_num.info"
|
||||
|
||||
if [ ! -f "$test_case" ]; then
|
||||
log_error "Test case $test_num does not exist"
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "$test_case" ]; then
|
||||
log_error "Test case $test_num does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Running test case $test_num"
|
||||
rm -f "$ans_file" && touch "$ans_file"
|
||||
rm -f "$ifo_file" && touch "$ifo_file"
|
||||
docker_run \
|
||||
--cpus 1 \
|
||||
--network none \
|
||||
-v "$test_case":/woj/problem/data/input/"$test_num".input:ro \
|
||||
-v "$exe_file":/woj/user/"$2".out:ro \
|
||||
-v "$ans_file":/woj/user/"$test_num".out.usr \
|
||||
-v "$ifo_file":/woj/user/"$test_num".info \
|
||||
woj/ubuntu-run \
|
||||
sh -c \
|
||||
"cd /woj/user && /woj/framework/scripts/woj_launcher \
|
||||
--memory_limit=$Info_Limit_Memory \
|
||||
--nproc_limit=$Info_Limit_NProc \
|
||||
--time_limit=$Info_Limit_Time \
|
||||
--sandbox_path=/woj/framework/scripts/libwoj_sandbox.so \
|
||||
--sandbox_template=$3 \
|
||||
--sandbox_action=nothing \
|
||||
--file_input=/woj/problem/data/input/$test_num.input \
|
||||
--file_output=/woj/user/$test_num.out.usr \
|
||||
--file_info=/woj/user/$test_num.info \
|
||||
--program=/woj/user/$2.out"
|
||||
log_info "Running test case $test_num"
|
||||
rm -f "$ans_file" && touch "$ans_file"
|
||||
rm -f "$ifo_file" && touch "$ifo_file"
|
||||
docker_run \
|
||||
--cpus 1 \
|
||||
--network none \
|
||||
-v "$test_case":/woj/problem/data/input/"$test_num".input:ro \
|
||||
-v "$exe_file":/woj/user/"$2".out:ro \
|
||||
-v "$ans_file":/woj/user/"$test_num".out.usr \
|
||||
-v "$ifo_file":/woj/user/"$test_num".info \
|
||||
git.0x7f.app/woj/ubuntu-run \
|
||||
sh -c \
|
||||
"cd /woj/user && /woj/framework/scripts/woj_launcher \
|
||||
--memory_limit=$Info_Limit_Memory \
|
||||
--nproc_limit=$Info_Limit_NProc \
|
||||
--time_limit=$Info_Limit_Time \
|
||||
--sandbox_path=/woj/framework/scripts/libwoj_sandbox.so \
|
||||
--sandbox_template=$3 \
|
||||
--sandbox_action=nothing \
|
||||
--file_input=/woj/problem/data/input/$test_num.input \
|
||||
--file_output=/woj/user/$test_num.out.usr \
|
||||
--file_info=/woj/user/$test_num.info \
|
||||
--program=/woj/user/$2.out"
|
||||
done
|
||||
|
@ -3,17 +3,17 @@
|
||||
. common.sh
|
||||
|
||||
function docker_run() {
|
||||
local timeout=${TIMEOUT:-10}
|
||||
local log_file=${LOG_FILE:-"/dev/stderr"}
|
||||
local log_limit=${LOG_LIMIT:-4K}
|
||||
log_info "$DOCKER run with timeout $timeout"
|
||||
CONTAINER_NAME=$(uuidgen)
|
||||
(
|
||||
sleep "$timeout"
|
||||
$DOCKER kill "$CONTAINER_NAME"
|
||||
) &
|
||||
$DOCKER run --rm --name "$CONTAINER_NAME" "$@" 2>&1 | head -c "$log_limit" >"$log_file"
|
||||
pkill -P $$
|
||||
$DOCKER kill "$CONTAINER_NAME" >/dev/null 2>&1
|
||||
return 0
|
||||
local timeout=${TIMEOUT:-10}
|
||||
local log_file=${LOG_FILE:-"/dev/stderr"}
|
||||
local log_limit=${LOG_LIMIT:-4K}
|
||||
log_info "$DOCKER run with timeout $timeout"
|
||||
CONTAINER_NAME=$(uuidgen)
|
||||
(
|
||||
sleep "$timeout"
|
||||
$DOCKER kill "$CONTAINER_NAME"
|
||||
) &
|
||||
$DOCKER run --rm --name "$CONTAINER_NAME" "$@" 2>&1 | head -c "$log_limit" >"$log_file"
|
||||
pkill -P $$
|
||||
$DOCKER kill "$CONTAINER_NAME" >/dev/null 2>&1
|
||||
return 0
|
||||
}
|
||||
|
20
resource/runner/scripts/ubuntu-full.Dockerfile
Normal file
20
resource/runner/scripts/ubuntu-full.Dockerfile
Normal file
@ -0,0 +1,20 @@
|
||||
FROM docker.io/library/ubuntu:22.04
|
||||
WORKDIR /woj/
|
||||
|
||||
# Install dependencies
|
||||
RUN apt-get update && apt-get upgrade -y && apt-get install -y gcc g++ clang make cmake autoconf m4 libtool gperf git parallel python3 && apt-get clean && rm -rf /var/lib/apt/lists
|
||||
|
||||
# Copy source code
|
||||
RUN mkdir -p /woj/framework && mkdir -p /woj/problem
|
||||
COPY framework /woj/framework
|
||||
|
||||
# Build
|
||||
RUN cd /woj/framework/template && ./setup.sh
|
||||
RUN cd /woj/framework/scripts && ./setup.sh
|
||||
|
||||
# Environment
|
||||
ENV WOJ_LAUNCHER=/woj/framework/scripts/woj_launcher
|
||||
ENV WOJ_SANDBOX=/woj/framework/scripts/libwoj_sandbox.so
|
||||
ENV TEMPLATE=/woj/framework/template
|
||||
ENV TESTLIB=/woj/framework/template/testlib
|
||||
ENV PREFIX=/woj/problem
|
8
resource/runner/scripts/ubuntu-run.Dockerfile
Normal file
8
resource/runner/scripts/ubuntu-run.Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
FROM woj/ubuntu-full:latest AS builder
|
||||
FROM docker.io/library/ubuntu:22.04
|
||||
|
||||
WORKDIR /woj/problem
|
||||
RUN mkdir -p /woj/framework/scripts
|
||||
|
||||
COPY --from=builder /woj/framework/scripts/libwoj_sandbox.so /woj/framework/scripts/
|
||||
COPY --from=builder /woj/framework/scripts/woj_launcher /woj/framework/scripts/
|
Loading…
Reference in New Issue
Block a user