package service import ( "orbits-server/internal/server/api/assets" "orbits-server/internal/server/database" "orbits-server/internal/shared/security" "time" "gorm.io/gorm" ) const ( accessKeyLen = 32 ) type KeyService struct { db *gorm.DB } func NewKeyService(db *gorm.DB) *KeyService { return &KeyService{ db: db, } } func (s *KeyService) ListValidKeyHashes() ([]string, error) { keyRecords, err := database.ListKeys(s.db) if err != nil { return nil, err } hashList := make([]string, 0, len(keyRecords)) for _, k := range keyRecords { hashList = append(hashList, k.KeyHash) } return hashList, nil } func (s *KeyService) Create(name string, expiresAt time.Time) (assets.KeyResponse, error) { keyContent := security.GenerateChars(accessKeyLen) hash, err := security.HashKey(keyContent) if err != nil { return assets.KeyResponse{}, err } keyRecord := database.BuildKeyRecord(hash, name, expiresAt) if err := database.CreateKey(s.db, &keyRecord); err != nil { return assets.KeyResponse{}, err } keyResponse := assets.KeyResponse{ ID: keyRecord.ID, MetaName: keyRecord.MetaName, KeyName: keyRecord.KeyName, KeyContent: keyContent, CreatedAt: keyRecord.CreatedAt, UpdatedAt: keyRecord.UpdatedAt, ExpiresAt: keyRecord.ExpiresAt, } return keyResponse, nil } func (s *KeyService) DeleteByName(name string) error { keyRecord, err := database.FindKeyByName(s.db, name) if err != nil { return err } if err := database.DeleteKeyByID(s.db, keyRecord.ID); err != nil { return err } return nil }