From d103f6bcb768343dea59b51c2adff7ba9285639b Mon Sep 17 00:00:00 2001 From: MrMelon54 Date: Mon, 4 Mar 2024 18:50:13 +0000 Subject: [PATCH] I did some updates --- .gitignore | 1 + cmd/gomvn/main.go | 8 +- .../migrations/20240304102707_init.up.sql | 27 +----- database/models.go | 29 +----- database/queries/user.sql | 23 ++++- database/types/artifact.go | 10 ++ database/user.sql.go | 88 ++++++++++++------ go.mod | 1 + go.sum | 2 + identifier.sqlite | Bin 32768 -> 32768 bytes paths/repo.go | 17 +++- routes/index.go.html | 3 +- routes/repoauth.go | 47 ++++++++++ routes/router.go | 65 ++++++++++++- sqlc.yaml | 3 - 15 files changed, 230 insertions(+), 94 deletions(-) create mode 100644 database/types/artifact.go create mode 100644 routes/repoauth.go diff --git a/.gitignore b/.gitignore index 9f11b75..8682019 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea/ +.data/ diff --git a/cmd/gomvn/main.go b/cmd/gomvn/main.go index 844276d..8cd7c45 100644 --- a/cmd/gomvn/main.go +++ b/cmd/gomvn/main.go @@ -52,12 +52,16 @@ func main() { db, err := gomvn.InitDB(filepath.Join(wd, "gomvn.sqlite3.db")) if err != nil { log.Fatal("[GoMVN] Error: invalid database: ", err) - return + } + repoBasePath := filepath.Join(wd, "repositories") + err = os.MkdirAll(repoBasePath, os.ModePerm) + if err != nil { + log.Fatal("[GoMVN] Error: failed to create repositories directory: ", err) } srv := &http.Server{ Addr: config.Listen, - Handler: routes.Router(db, config.Name, config.Repository), + Handler: routes.Router(db, config.Name, repoBasePath, config.Repository), ReadTimeout: time.Minute, ReadHeaderTimeout: time.Minute, WriteTimeout: time.Minute, diff --git a/database/migrations/20240304102707_init.up.sql b/database/migrations/20240304102707_init.up.sql index 141acc3..df146b3 100644 --- a/database/migrations/20240304102707_init.up.sql +++ b/database/migrations/20240304102707_init.up.sql @@ -1,28 +1,7 @@ -CREATE TABLE artifacts -( - mvn_group TEXT NOT NULL, - artifact TEXT NOT NULL, - version TEXT NOT NULL, - modified TEXT NOT NULL -); - -CREATE TABLE paths -( - user_id INTEGER UNIQUE, - path TEXT PRIMARY KEY, - deploy TINYINT, - created_at DATETIME, - updated_at DATETIME, - - FOREIGN KEY (user_id) REFERENCES users (id) -); - CREATE TABLE users ( id INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL, - admin TINYINT, - token_hash TEXT NOT NULL, - created_at DATETIME, - updated_at DATETIME + name TEXT NOT NULL, + admin BOOLEAN NOT NULL, + token_hash TEXT NOT NULL ); diff --git a/database/models.go b/database/models.go index eaee22c..3376fc8 100644 --- a/database/models.go +++ b/database/models.go @@ -4,30 +4,11 @@ package database -import ( - "database/sql" -) - -type Artifact struct { - MvnGroup string `json:"mvn_group"` - Artifact string `json:"artifact"` - Version string `json:"version"` - Modified string `json:"modified"` -} - -type Path struct { - UserID sql.NullInt64 `json:"user_id"` - Path string `json:"path"` - Deploy sql.NullInt64 `json:"deploy"` - CreatedAt sql.NullTime `json:"created_at"` - UpdatedAt sql.NullTime `json:"updated_at"` -} +import () type User struct { - ID int64 `json:"id"` - Name string `json:"name"` - Admin sql.NullInt64 `json:"admin"` - TokenHash string `json:"token_hash"` - CreatedAt sql.NullTime `json:"created_at"` - UpdatedAt sql.NullTime `json:"updated_at"` + ID int64 `json:"id"` + Name string `json:"name"` + Admin bool `json:"admin"` + TokenHash string `json:"token_hash"` } diff --git a/database/queries/user.sql b/database/queries/user.sql index 6ba7357..6fae66f 100644 --- a/database/queries/user.sql +++ b/database/queries/user.sql @@ -8,10 +8,27 @@ FROM users WHERE admin = 1 AND token_hash = ?; +-- name: IsValid :one +SELECT 1 +FROM users +WHERE token_hash = ?; + -- name: GetAllUsers :many -SELECT id, name, admin, created_at, updated_at +SELECT id, name FROM users; -- name: CreateUser :execlastid -INSERT INTO users (name, admin, token_hash, created_at, updated_at) -VALUES (?, ?, ?, ?, ?); +INSERT INTO users (name, admin, token_hash) +VALUES (?, ?, ?); + +-- name: RefreshUserToken :exec +UPDATE users +SET token_hash =? +WHERE id = ? + AND token_hash = ?; + +-- name: CheckUserDetails :one +SELECT 1 +FROM users +WHERE name = ? + AND token_hash = ?; diff --git a/database/types/artifact.go b/database/types/artifact.go new file mode 100644 index 0000000..5f037a1 --- /dev/null +++ b/database/types/artifact.go @@ -0,0 +1,10 @@ +package types + +import "time" + +type Artifact struct { + MvnGroup string `json:"mvn_group"` + Artifact string `json:"artifact"` + Version string `json:"version"` + Modified time.Time `json:"modified"` +} diff --git a/database/user.sql.go b/database/user.sql.go index aafbc60..cd69439 100644 --- a/database/user.sql.go +++ b/database/user.sql.go @@ -7,9 +7,27 @@ package database import ( "context" - "database/sql" ) +const checkUserDetails = `-- name: CheckUserDetails :one +SELECT 1 +FROM users +WHERE name = ? + AND token_hash = ? +` + +type CheckUserDetailsParams struct { + Name string `json:"name"` + TokenHash string `json:"token_hash"` +} + +func (q *Queries) CheckUserDetails(ctx context.Context, arg CheckUserDetailsParams) (int64, error) { + row := q.db.QueryRowContext(ctx, checkUserDetails, arg.Name, arg.TokenHash) + var column_1 int64 + err := row.Scan(&column_1) + return column_1, err +} + const countUsers = `-- name: CountUsers :one SELECT count(*) FROM users @@ -23,26 +41,18 @@ func (q *Queries) CountUsers(ctx context.Context) (int64, error) { } const createUser = `-- name: CreateUser :execlastid -INSERT INTO users (name, admin, token_hash, created_at, updated_at) -VALUES (?, ?, ?, ?, ?) +INSERT INTO users (name, admin, token_hash) +VALUES (?, ?, ?) ` type CreateUserParams struct { - Name string `json:"name"` - Admin sql.NullInt64 `json:"admin"` - TokenHash string `json:"token_hash"` - CreatedAt sql.NullTime `json:"created_at"` - UpdatedAt sql.NullTime `json:"updated_at"` + Name string `json:"name"` + Admin bool `json:"admin"` + TokenHash string `json:"token_hash"` } func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (int64, error) { - result, err := q.db.ExecContext(ctx, createUser, - arg.Name, - arg.Admin, - arg.TokenHash, - arg.CreatedAt, - arg.UpdatedAt, - ) + result, err := q.db.ExecContext(ctx, createUser, arg.Name, arg.Admin, arg.TokenHash) if err != nil { return 0, err } @@ -50,16 +60,13 @@ func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (int64, } const getAllUsers = `-- name: GetAllUsers :many -SELECT id, name, admin, created_at, updated_at +SELECT id, name FROM users ` type GetAllUsersRow struct { - ID int64 `json:"id"` - Name string `json:"name"` - Admin sql.NullInt64 `json:"admin"` - CreatedAt sql.NullTime `json:"created_at"` - UpdatedAt sql.NullTime `json:"updated_at"` + ID int64 `json:"id"` + Name string `json:"name"` } func (q *Queries) GetAllUsers(ctx context.Context) ([]GetAllUsersRow, error) { @@ -71,13 +78,7 @@ func (q *Queries) GetAllUsers(ctx context.Context) ([]GetAllUsersRow, error) { var items []GetAllUsersRow for rows.Next() { var i GetAllUsersRow - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Admin, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { + if err := rows.Scan(&i.ID, &i.Name); err != nil { return nil, err } items = append(items, i) @@ -104,3 +105,34 @@ func (q *Queries) IsAdmin(ctx context.Context, tokenHash string) (int64, error) err := row.Scan(&column_1) return column_1, err } + +const isValid = `-- name: IsValid :one +SELECT 1 +FROM users +WHERE token_hash = ? +` + +func (q *Queries) IsValid(ctx context.Context, tokenHash string) (int64, error) { + row := q.db.QueryRowContext(ctx, isValid, tokenHash) + var column_1 int64 + err := row.Scan(&column_1) + return column_1, err +} + +const refreshUserToken = `-- name: RefreshUserToken :exec +UPDATE users +SET token_hash =? +WHERE id = ? + AND token_hash = ? +` + +type RefreshUserTokenParams struct { + TokenHash string `json:"token_hash"` + ID int64 `json:"id"` + TokenHash_2 string `json:"token_hash_2"` +} + +func (q *Queries) RefreshUserToken(ctx context.Context, arg RefreshUserTokenParams) error { + _, err := q.db.ExecContext(ctx, refreshUserToken, arg.TokenHash, arg.ID, arg.TokenHash_2) + return err +} diff --git a/go.mod b/go.mod index 3632f80..d7c6781 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/MrMelon54/exit-reload v0.0.1 github.com/golang-migrate/migrate/v4 v4.17.0 github.com/julienschmidt/httprouter v1.3.0 + github.com/thanhpk/randstr v1.0.6 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 85f2b45..bceb037 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/thanhpk/randstr v1.0.6 h1:psAOktJFD4vV9NEVb3qkhRSMvYh4ORRaj1+w/hn4B+o= +github.com/thanhpk/randstr v1.0.6/go.mod h1:M/H2P1eNLZzlDwAzpkkkUvoyNNMbzRGhESZuEQk3r0U= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/identifier.sqlite b/identifier.sqlite index 4a5c8e47f230d1069341238a0ee546612509ecf0..954281cc44018e1160db57702b87e257a8593e52 100644 GIT binary patch delta 307 zcmZo@U}|V!njkGG%)r3F0mMu|%mT#16LpNGg&FkncJT7NXJF=;%fK_2pNao0KOf&? zp1C}8Hwy|V^Gu%06U4&*gGqSvXC78Ysm2UWc5!iW#%BGJ#H5_mg2a-HVlcrnS&1)6 zuTdN#-NcJ7?HuIl7~-lB;^^e#ssPr(r7<~_FF~r&g9B`0Q$AQrX>n>%F_>VU%*mU? zq@XZ4i&x6j$=~0{)zMGE&p$-LFVx3Jhf4tnO7gQ)^WrlSi!&5LTq8n2LNEnfnwp%G q75HT)|K{aU1^E`_a~NO-GT4Eb4TxER7$naO^zIY>MG6Ls3=9AnEl8LE delta 422 zcmZo@U}|V!njkI6%D}+D0mLxCI#I`1nw3E>ZwD{GCj&drTn7F?J`R34zRx`GdGGSf z-K;2}%rki|PY_FEHY@w)&pfP*lV9-jOS3m-FtLk^i!(Osmn0_Tq!uKWWE6u5=E;40 zl9RRhJSSh|Gju3XaB&QA4e|7K)#2h&00KAvAXiU!KLu~sNCl13;?$z}%oI(9AXhin zAXh(U*I)&ZSh0czP?SqklV$RGei?qSx$#C|idB;tBvua*GXzsCK;M8p)u_YBE-o+6 z*rX12RANy{W?Eu$Nim$k5CuPf zAP)8M(E&@s6f1xw-OyyqfR4`0&jWf8i`Lxyl+3iu)D$#HE=}Iej0ykc7a1rlQUD?W E03c*^S^xk5 diff --git a/paths/repo.go b/paths/repo.go index ed5f35d..e69b743 100644 --- a/paths/repo.go +++ b/paths/repo.go @@ -1,21 +1,30 @@ package paths import ( + "github.com/1f349/gomvn/database/types" "os" "path/filepath" "strings" ) -func GetRepositories(basePath string, repository []string) map[string][]*entity.Artifact { - result := map[string][]*database.Artifact{} +func GetRepositories(basePath string, repository []string) map[string][]*types.Artifact { + result := map[string][]*types.Artifact{} for _, repo := range repository { - result[repo] = []*database.Artifact{} + result[repo] = []*types.Artifact{} repoPath := filepath.Join(basePath, repo) _ = filepath.Walk(repoPath, func(path string, info os.FileInfo, err error) error { if strings.HasSuffix(path, ".pom") { path = strings.Replace(path, "\\", "/", -1) path = strings.Replace(path, repoPath+"/", "", 1) - artifact := entity.NewArtifact(path, info.ModTime()) + + parts := strings.Split(path, "/") + last := len(parts) - 1 + artifact := &types.Artifact{ + MvnGroup: strings.Join(parts[0:last-2], "."), + Artifact: parts[last-2], + Version: parts[last-1], + Modified: info.ModTime(), + } result[repo] = append(result[repo], artifact) } return nil diff --git a/routes/index.go.html b/routes/index.go.html index 496dbc6..ff4c7e8 100644 --- a/routes/index.go.html +++ b/routes/index.go.html @@ -1,4 +1,5 @@ - + + GoMVN - {{.Name}}