refactor: reorganize models to pkg/model and add authentication module
- Move ORM models from internal/model to pkg/model organized by module (auth/k8s/registry) - Add authentication module with login, user management handlers - Update all import paths to use new model locations - Add frontend auth pages (Login, UserManagement) and authStore - Remove deprecated internal/model/model.go
This commit is contained in:
@@ -7,7 +7,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"gitea.loveuer.com/loveuer/cluster/internal/model"
|
||||
"gitea.loveuer.com/loveuer/cluster/pkg/model/registry"
|
||||
"gitea.loveuer.com/loveuer/cluster/pkg/resp"
|
||||
"gitea.loveuer.com/loveuer/cluster/pkg/store"
|
||||
"github.com/gofiber/fiber/v3"
|
||||
@@ -20,28 +20,28 @@ func isDigestFormat(s string) bool {
|
||||
if len(parts) != 2 {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
algo := parts[0]
|
||||
hash := parts[1]
|
||||
|
||||
|
||||
// Check algorithm
|
||||
if algo != "sha256" {
|
||||
// Could be extended to support other algorithms like sha512
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
// Check that hash is a valid hex string of expected length (64 for sha256)
|
||||
if len(hash) != 64 {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
// Verify it's all hex characters
|
||||
for _, r := range hash {
|
||||
if !((r >= '0' && r <= '9') || (r >= 'a' && r <= 'f')) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -75,9 +75,9 @@ func HandleManifest(c fiber.Ctx, db *gorm.DB, store store.Store) error {
|
||||
|
||||
// ???? manifests ???????
|
||||
repo := strings.Join(parts[:manifestsIndex], "/")
|
||||
|
||||
|
||||
// Strip registry_address prefix from repo if present
|
||||
var registryConfig model.RegistryConfig
|
||||
var registryConfig registry.RegistryConfig
|
||||
registryAddress := ""
|
||||
if err := db.Where("key = ?", "registry_address").First(®istryConfig).Error; err == nil {
|
||||
registryAddress = registryConfig.Value
|
||||
@@ -85,7 +85,7 @@ func HandleManifest(c fiber.Ctx, db *gorm.DB, store store.Store) error {
|
||||
if registryAddress != "" && strings.HasPrefix(repo, registryAddress+"/") {
|
||||
repo = strings.TrimPrefix(repo, registryAddress+"/")
|
||||
}
|
||||
|
||||
|
||||
// tag ? manifests ?????
|
||||
tag := parts[manifestsIndex+1]
|
||||
|
||||
@@ -140,10 +140,10 @@ func handleManifestPut(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
}
|
||||
|
||||
// ??????
|
||||
var repository model.Repository
|
||||
var repository registry.Repository
|
||||
if err := db.Where("name = ?", repo).First(&repository).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
repository = model.Repository{Name: repo}
|
||||
repository = registry.Repository{Name: repo}
|
||||
if err := db.Create(&repository).Error; err != nil {
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
@@ -158,11 +158,11 @@ func handleManifestPut(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
}
|
||||
|
||||
// ?? manifest ?????
|
||||
var manifest model.Manifest
|
||||
var manifest registry.Manifest
|
||||
if err := db.Where("digest = ?", digest).First(&manifest).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
// ???? manifest ??
|
||||
manifest = model.Manifest{
|
||||
manifest = registry.Manifest{
|
||||
Repository: repo,
|
||||
Tag: tag,
|
||||
Digest: digest,
|
||||
@@ -186,10 +186,10 @@ func handleManifestPut(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
}
|
||||
|
||||
// ????? tag ??
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND tag = ?", repo, tag).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
tagRecord = model.Tag{
|
||||
tagRecord = registry.Tag{
|
||||
Repository: repo,
|
||||
Tag: tag,
|
||||
Digest: digest,
|
||||
@@ -217,13 +217,13 @@ func handleManifestPut(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
|
||||
// handleManifestGet ?? manifest
|
||||
func handleManifestGet(c fiber.Ctx, db *gorm.DB, store store.Store, repo string, tag string) error {
|
||||
var manifest model.Manifest
|
||||
var manifest registry.Manifest
|
||||
|
||||
// ?? tag ??????????????????????
|
||||
if isDigestFormat(tag) {
|
||||
// ?? digest ???????????? repository
|
||||
digest := tag
|
||||
|
||||
|
||||
// ?? manifest ???
|
||||
if err := db.Where("digest = ?", digest).First(&manifest).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
@@ -231,9 +231,9 @@ func handleManifestGet(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
}
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
|
||||
|
||||
// ???? manifest ?????????? repository ??
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND digest = ?", repo, digest).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found in this repository")
|
||||
@@ -242,7 +242,7 @@ func handleManifestGet(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
}
|
||||
} else {
|
||||
// ?? tag ???? tag ?????????
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND tag = ?", repo, tag).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found")
|
||||
@@ -302,13 +302,13 @@ func handleManifestGet(c fiber.Ctx, db *gorm.DB, store store.Store, repo string,
|
||||
|
||||
// handleManifestHead ?? manifest ????
|
||||
func handleManifestHead(c fiber.Ctx, db *gorm.DB, store store.Store, repo string, tag string) error {
|
||||
var manifest model.Manifest
|
||||
var manifest registry.Manifest
|
||||
|
||||
// ?? tag ??????????????????????
|
||||
if isDigestFormat(tag) {
|
||||
// ?? digest ???????????? repository
|
||||
digest := tag
|
||||
|
||||
|
||||
// ?? manifest ???
|
||||
if err := db.Where("digest = ?", digest).First(&manifest).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
@@ -316,9 +316,9 @@ func handleManifestHead(c fiber.Ctx, db *gorm.DB, store store.Store, repo string
|
||||
}
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
|
||||
|
||||
// ???? manifest ?????????? repository ??
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND digest = ?", repo, digest).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found in this repository")
|
||||
@@ -327,7 +327,7 @@ func handleManifestHead(c fiber.Ctx, db *gorm.DB, store store.Store, repo string
|
||||
}
|
||||
} else {
|
||||
// ?? tag ???? tag ?????????
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND tag = ?", repo, tag).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found")
|
||||
@@ -358,32 +358,32 @@ func handleManifestDelete(c fiber.Ctx, db *gorm.DB, store store.Store, repo stri
|
||||
if isDigestFormat(tag) {
|
||||
// ?? digest ???????????? repository
|
||||
digest = tag
|
||||
|
||||
|
||||
// ???? manifest ?????????? repository ??
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND digest = ?", repo, digest).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found in this repository")
|
||||
}
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
|
||||
|
||||
// ???????? tag ??? manifest
|
||||
var count int64
|
||||
if err := db.Model(&model.Tag{}).Where("digest = ?", digest).Count(&count).Error; err != nil {
|
||||
if err := db.Model(®istry.Tag{}).Where("digest = ?", digest).Count(&count).Error; err != nil {
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
|
||||
// ??? tag ??????? manifest ??
|
||||
if count == 0 {
|
||||
var manifest model.Manifest
|
||||
var manifest registry.Manifest
|
||||
if err := db.Where("digest = ?", digest).First(&manifest).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found")
|
||||
}
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
|
||||
|
||||
if err := db.Delete(&manifest).Error; err != nil {
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
@@ -394,7 +394,7 @@ func handleManifestDelete(c fiber.Ctx, db *gorm.DB, store store.Store, repo stri
|
||||
}
|
||||
} else {
|
||||
// ?? tag ???? tag ?????????
|
||||
var tagRecord model.Tag
|
||||
var tagRecord registry.Tag
|
||||
if err := db.Where("repository = ? AND tag = ?", repo, tag).First(&tagRecord).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return resp.R404(c, "MANIFEST_NOT_FOUND", nil, "manifest not found")
|
||||
@@ -411,13 +411,13 @@ func handleManifestDelete(c fiber.Ctx, db *gorm.DB, store store.Store, repo stri
|
||||
|
||||
// ???????? tag ??? manifest
|
||||
var count int64
|
||||
if err := db.Model(&model.Tag{}).Where("digest = ?", digest).Count(&count).Error; err != nil {
|
||||
if err := db.Model(®istry.Tag{}).Where("digest = ?", digest).Count(&count).Error; err != nil {
|
||||
return resp.R500(c, "", nil, err)
|
||||
}
|
||||
|
||||
// ?????? tag ????? manifest ??
|
||||
if count == 0 {
|
||||
var manifest model.Manifest
|
||||
var manifest registry.Manifest
|
||||
if err := db.Where("digest = ?", digest).First(&manifest).Error; err == nil {
|
||||
if err := db.Delete(&manifest).Error; err != nil {
|
||||
return resp.R500(c, "", nil, err)
|
||||
|
||||
Reference in New Issue
Block a user