Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 14 additions & 9 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ require (
github.com/jackc/pgconn v1.13.0
github.com/joho/godotenv v1.4.0
github.com/karlseguin/ccache/v2 v2.0.8
github.com/markbates/goth v1.79.0
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.6.1
github.com/spf13/viper v1.14.0
github.com/xanzy/go-gitlab v0.77.0
go.uber.org/atomic v1.10.0
go.uber.org/zap v1.24.0
golang.org/x/exp v0.0.0-20221227203929-1b447090c38c
golang.org/x/oauth2 v0.3.0
golang.org/x/oauth2 v0.17.0
golang.org/x/sync v0.1.0
gopkg.in/natefinch/lumberjack.v2 v2.0.0
gopkg.in/yaml.v2 v2.4.0
Expand All @@ -33,19 +34,23 @@ require (
)

require (
code.gitea.io/sdk/gitea v0.18.0 // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-fed/httpsig v1.1.0 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/goccy/go-json v0.10.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/gorilla/context v1.1.1 // indirect
github.com/gorilla/securecookie v1.1.1 // indirect
github.com/gorilla/sessions v1.2.1 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.1 // indirect
github.com/hashicorp/go-version v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
Expand Down Expand Up @@ -75,13 +80,13 @@ require (
go.opentelemetry.io/otel v1.11.2 // indirect
go.opentelemetry.io/otel/trace v1.11.2 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/crypto v0.4.0 // indirect
golang.org/x/net v0.4.0 // indirect
golang.org/x/sys v0.3.0 // indirect
golang.org/x/text v0.5.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/protobuf v1.32.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
61 changes: 42 additions & 19 deletions go.sum

Large diffs are not rendered by default.

38 changes: 34 additions & 4 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@ import (
"github.com/pkg/errors"
)

const (
GitlabMode = "GitLab"
GiteaMode = "Gitea"
)

type GitLabConfig struct {
BaseURL string
Group struct {
Name string
ID int
}
DefaultReadme string
TaskUrlPrefix string

Application struct {
ClientID string
Expand All @@ -27,6 +30,32 @@ type GitLabConfig struct {
CIConfigPath string
}

type GiteaConfig struct {
BaseURL string
Organization struct {
Name string
ID int
}

Application struct {
ClientID string
Secret string
}
Api struct {
Token string
}
CIConfig string
CIConfigPath string
}

type PlatformConfig struct {
GitLab GitLabConfig
Gitea GiteaConfig
Mode string
TaskUrlPrefix string
DefaultReadme string
}

type EndpointsConfig struct {
HostName string
Home string
Expand Down Expand Up @@ -101,8 +130,9 @@ type TelegramBotConfig struct {
}

type Config struct {
Log log.Config
GitLab GitLabConfig
Log log.Config

Platform PlatformConfig
Endpoints EndpointsConfig
Server ServerConfig
DataBase DataBaseConfig
Expand Down
122 changes: 111 additions & 11 deletions internal/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,24 @@ func (db *DataBase) FindUserByGitlabID(id int) (*models.User, error) {
return &user, nil
}

func (db *DataBase) FindUserByGiteaLogin(login string) (*models.User, error) {
var user models.User
err := db.First(&user, "gitea_login = ?", login).Error
if err != nil {
return nil, err
}
return &user, nil
}

func (db *DataBase) FindUserByGiteaID(id int64) (*models.User, error) {
var user models.User
err := db.First(&user, "gitea_id = ?", id).Error
if err != nil {
return nil, err
}
return &user, nil
}

func (db *DataBase) FindUserByTelegramID(id int64) (*models.User, error) {
var user models.User
err := db.First(&user, "telegram_id = ?", id).Error
Expand All @@ -116,7 +134,7 @@ func (db *DataBase) FindUserByTelegramID(id int64) (*models.User, error) {
return &user, nil
}

func (db *DataBase) ListUsersWithoutRepos() ([]*models.User, error) {
func (db *DataBase) ListGitlabUsersWithoutRepos() ([]*models.User, error) {
var users []*models.User
err := db.Find(&users, "repository IS NULL AND gitlab_id IS NOT NULL AND gitlab_login IS NOT NULL").Error
if err != nil {
Expand All @@ -125,6 +143,15 @@ func (db *DataBase) ListUsersWithoutRepos() ([]*models.User, error) {
return users, nil
}

func (db *DataBase) ListGiteaUsersWithoutRepos() ([]*models.User, error) {
var users []*models.User
err := db.Find(&users, "repository IS NULL AND gitea_id IS NOT NULL AND gitea_login IS NOT NULL").Error
if err != nil {
return nil, err
}
return users, nil
}

func (db *DataBase) ListGroupUsers(groupName string) ([]*models.User, error) {
var users []*models.User
err := db.Find(&users, "repository IS NOT NULL AND group_name = ?", groupName).Order("created_at").Error
Expand Down Expand Up @@ -155,6 +182,27 @@ func (db *DataBase) SetUserGitlabAccount(uid uint, user *models.GitlabUser) erro
return nil
}

func (db *DataBase) SetUserGiteaAccount(uid uint, user *models.GiteaUser) error {
res := db.Model(&models.User{}).
Where("id = ? AND (gitea_id IS NULL OR gitea_login IS NULL)", uid).
Updates(map[string]interface{}{
"gitea_id": user.GiteaID,
"gitea_login": user.GiteaLogin,
})

if res.Error != nil {
if isUnqiueViolation(res.Error) {
return &DuplicateKey{res.Error}
}
return res.Error
}

if res.RowsAffected < 1 {
return fmt.Errorf("unknown user %d", uid)
}
return nil
}

func (db *DataBase) SetUserRepository(user *models.User) error {
res := db.Model(user).Update("repository", user.Repository)
if res.Error != nil {
Expand Down Expand Up @@ -262,7 +310,7 @@ func (db *DataBase) CreateFlag(task string) (*models.Flag, error) {
return flag, nil
}

func (db *DataBase) SubmitFlag(id, gitlabLogin string) error {
func (db *DataBase) SubmitFlagGitlab(id, gitlabLogin string) error {
result := db.Model(&models.Flag{}).Where("id = ? AND gitlab_login IS NULL", id).Update("gitlab_login", gitlabLogin)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fmt.Errorf("unknown flag")
Expand All @@ -276,7 +324,21 @@ func (db *DataBase) SubmitFlag(id, gitlabLogin string) error {
return nil
}

func (db *DataBase) ListUserFlags(gitlabLogin string) (flags []models.Flag, err error) {
func (db *DataBase) SubmitFlagGitea(id, giteaLogin string) error {
result := db.Model(&models.Flag{}).Where("id = ? AND gitea_login IS NULL", id).Update("gitea_login", giteaLogin)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return fmt.Errorf("unknown flag")
}
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return fmt.Errorf("unknown flag")
}
return nil
}

func (db *DataBase) ListUserFlagsGitlab(gitlabLogin string) (flags []models.Flag, err error) {
flags = make([]models.Flag, 0)
err = db.Find(&flags, "gitlab_login = ?", gitlabLogin).Error
if err != nil {
Expand All @@ -285,16 +347,25 @@ func (db *DataBase) ListUserFlags(gitlabLogin string) (flags []models.Flag, err
return
}

func (db *DataBase) ListUserFlagsGitea(giteaLogin string) (flags []models.Flag, err error) {
flags = make([]models.Flag, 0)
err = db.Find(&flags, "gitea_login = ?", giteaLogin).Error
if err != nil {
flags = nil
}
return
}

func (db *DataBase) ListSubmittedFlags() (flags []models.Flag, err error) {
flags = make([]models.Flag, 0)
err = db.Find(&flags, "gitlab_login IS NOT NULL").Error
err = db.Find(&flags, "gitlab_login IS NOT NULL OR gitea_login IS NOT NULL").Error
if err != nil {
flags = nil
}
return
}

func (db *DataBase) ListUserOverrides(login string) (overrides []models.OverriddenScore, err error) {
func (db *DataBase) ListUserOverridesGitlab(login string) (overrides []models.OverriddenScore, err error) {
overrides = make([]models.OverriddenScore, 0)
err = db.Find(&overrides, "gitlab_login = ?", login).Error
if err != nil {
Expand All @@ -303,6 +374,15 @@ func (db *DataBase) ListUserOverrides(login string) (overrides []models.Overridd
return
}

func (db *DataBase) ListUserOverridesGitea(login string) (overrides []models.OverriddenScore, err error) {
overrides = make([]models.OverriddenScore, 0)
err = db.Find(&overrides, "gitea_login = ?", login).Error
if err != nil {
overrides = nil
}
return
}

func (db *DataBase) ListOverrides() (overrides []models.OverriddenScore, err error) {
overrides = make([]models.OverriddenScore, 0)
err = db.Find(&overrides).Error
Expand All @@ -312,22 +392,42 @@ func (db *DataBase) ListOverrides() (overrides []models.OverriddenScore, err err
return
}

func (db *DataBase) AddOverride(gitlabLogin, task string, score int, status models.PipelineStatus) error {
func (db *DataBase) AddOverrideGitlab(gitlabLogin, task string, score int, status models.PipelineStatus) error {
overridenScore := &models.OverriddenScore{
GitlabLogin: gitlabLogin,
Task: task,
Score: score,
Status: status,
Login: gitlabLogin,
Task: task,
Score: score,
Status: status,
}
return db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "gitlab_login"}, {Name: "task"}},
DoUpdates: clause.AssignmentColumns([]string{"score", "status"}),
}).Create(overridenScore).Error
}

func (db *DataBase) RemoveOverride(gitlabLogin, task string) error {
func (db *DataBase) AddOverrideGitea(giteaLogin, task string, score int, status models.PipelineStatus) error {
overridenScore := &models.OverriddenScore{
Login: giteaLogin,
Task: task,
Score: score,
Status: status,
}
return db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "gitea_login"}, {Name: "task"}},
DoUpdates: clause.AssignmentColumns([]string{"score", "status"}),
}).Create(overridenScore).Error
}

func (db *DataBase) RemoveOverrideGitlab(gitlabLogin, task string) error {
return db.
Where("gitlab_login = ? AND task = ?", gitlabLogin, task).
Delete(models.OverriddenScore{}).
Error
}

func (db *DataBase) RemoveOverrideGitea(giteaLogin, task string) error {
return db.
Where("gitea_login = ? AND task = ?", giteaLogin, task).
Delete(models.OverriddenScore{}).
Error
}
Loading