86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package persistence
|
|
|
|
import (
|
|
domainAPIKey "RenewCMS/internal/domain/apikey"
|
|
"RenewCMS/internal/infrastructure/persistence/mappers"
|
|
entity "RenewCMS/internal/infrastructure/persistence/models"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type APIKeyRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewAPIKeyRepository(db *gorm.DB) *APIKeyRepository {
|
|
return &APIKeyRepository{db}
|
|
}
|
|
|
|
func (a *APIKeyRepository) Create(key domainAPIKey.APIKey) (domainAPIKey.APIKey, error) {
|
|
model := mappers.APIKeyToModel(key)
|
|
model.ID = 0
|
|
if err := a.db.Create(&model).Error; err != nil {
|
|
return domainAPIKey.APIKey{}, err
|
|
}
|
|
return mappers.APIKeyToDomain(model), nil
|
|
}
|
|
|
|
func (a *APIKeyRepository) Get(id uint32) (domainAPIKey.APIKey, error) {
|
|
var model entity.APIKey
|
|
if err := a.db.First(&model, id).Error; err != nil {
|
|
return domainAPIKey.APIKey{}, mapNotFoundErr(err, domainAPIKey.ErrAPIKeyNotFound)
|
|
}
|
|
return mappers.APIKeyToDomain(model), nil
|
|
}
|
|
|
|
func (a *APIKeyRepository) GetByHashedKey(hashedKey string) (domainAPIKey.APIKey, error) {
|
|
var model entity.APIKey
|
|
if err := a.db.Where("hashed_key = ?", hashedKey).First(&model).Error; err != nil {
|
|
return domainAPIKey.APIKey{}, mapNotFoundErr(err, domainAPIKey.ErrAPIKeyNotFound)
|
|
}
|
|
return mappers.APIKeyToDomain(model), nil
|
|
}
|
|
|
|
func (a *APIKeyRepository) ListByUser(userId uint32) ([]domainAPIKey.APIKey, error) {
|
|
return a.list(a.db.Where("user_id = ?", userId))
|
|
}
|
|
|
|
func (a *APIKeyRepository) ListAll() ([]domainAPIKey.APIKey, error) {
|
|
return a.list(a.db)
|
|
}
|
|
|
|
func (a *APIKeyRepository) list(query *gorm.DB) ([]domainAPIKey.APIKey, error) {
|
|
var found []entity.APIKey
|
|
if err := query.Order("created_at DESC, id DESC").Find(&found).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
keys := make([]domainAPIKey.APIKey, 0, len(found))
|
|
for _, model := range found {
|
|
keys = append(keys, mappers.APIKeyToDomain(model))
|
|
}
|
|
return keys, nil
|
|
}
|
|
|
|
func (a *APIKeyRepository) Revoke(id uint32, at time.Time) error {
|
|
result := a.db.Model(&entity.APIKey{}).
|
|
Where("id = ? AND revoked_at IS NULL", id).
|
|
Update("revoked_at", at)
|
|
return result.Error
|
|
}
|
|
|
|
func (a *APIKeyRepository) RevokeAllByUser(userId uint32, at time.Time) error {
|
|
return a.db.Model(&entity.APIKey{}).
|
|
Where("user_id = ? AND revoked_at IS NULL", userId).
|
|
Update("revoked_at", at).Error
|
|
}
|
|
|
|
func (a *APIKeyRepository) TouchLastUsed(id uint32, at time.Time) error {
|
|
return a.db.Model(&entity.APIKey{}).
|
|
Where("id = ?", id).
|
|
Update("last_used_at", at).Error
|
|
}
|
|
|
|
var _ domainAPIKey.Repository = &APIKeyRepository{}
|