forked from baron/baron-sso
94 lines
2.9 KiB
Go
94 lines
2.9 KiB
Go
package service
|
|
|
|
import (
|
|
"baron-sso-backend/internal/domain"
|
|
"context"
|
|
"errors"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type DeveloperService struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewDeveloperService(db *gorm.DB) *DeveloperService {
|
|
return &DeveloperService{db: db}
|
|
}
|
|
|
|
func (s *DeveloperService) RequestAccess(ctx context.Context, req domain.DeveloperRequest) error {
|
|
// Check if there is already a pending request
|
|
var existing domain.DeveloperRequest
|
|
err := s.db.WithContext(ctx).Where("user_id = ? AND tenant_id = ? AND status = ?", req.UserID, req.TenantID, domain.DeveloperRequestStatusPending).First(&existing).Error
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
if !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return err
|
|
}
|
|
|
|
return s.db.WithContext(ctx).Create(&req).Error
|
|
}
|
|
|
|
func (s *DeveloperService) CreateGrant(ctx context.Context, req domain.DeveloperRequest) error {
|
|
return s.db.WithContext(ctx).Create(&req).Error
|
|
}
|
|
|
|
func (s *DeveloperService) GetRequestStatus(ctx context.Context, userID, tenantID string) (*domain.DeveloperRequest, error) {
|
|
var req domain.DeveloperRequest
|
|
err := s.db.WithContext(ctx).Where("user_id = ? AND tenant_id = ?", userID, tenantID).Order("created_at DESC").First(&req).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &req, nil
|
|
}
|
|
|
|
func (s *DeveloperService) GetRequestByID(ctx context.Context, id uint) (*domain.DeveloperRequest, error) {
|
|
var req domain.DeveloperRequest
|
|
err := s.db.WithContext(ctx).First(&req, id).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &req, nil
|
|
}
|
|
|
|
func (s *DeveloperService) ListRequests(ctx context.Context, userID, status, tenantID string) ([]domain.DeveloperRequest, error) {
|
|
var requests []domain.DeveloperRequest
|
|
query := s.db.WithContext(ctx)
|
|
if userID != "" {
|
|
query = query.Where("user_id = ?", userID)
|
|
}
|
|
if status != "" {
|
|
query = query.Where("status = ?", status)
|
|
}
|
|
if tenantID != "" {
|
|
query = query.Where("tenant_id = ?", tenantID)
|
|
}
|
|
err := query.Order("created_at DESC").Find(&requests).Error
|
|
return requests, err
|
|
}
|
|
|
|
func (s *DeveloperService) ApproveRequest(ctx context.Context, id uint, adminNotes string) error {
|
|
return s.db.WithContext(ctx).Model(&domain.DeveloperRequest{}).Where("id = ?", id).Updates(map[string]any{
|
|
"status": domain.DeveloperRequestStatusApproved,
|
|
"admin_notes": adminNotes,
|
|
}).Error
|
|
}
|
|
|
|
func (s *DeveloperService) RejectRequest(ctx context.Context, id uint, adminNotes string) error {
|
|
return s.db.WithContext(ctx).Model(&domain.DeveloperRequest{}).Where("id = ?", id).Updates(map[string]any{
|
|
"status": domain.DeveloperRequestStatusRejected,
|
|
"admin_notes": adminNotes,
|
|
}).Error
|
|
}
|
|
|
|
func (s *DeveloperService) CancelApprovedRequest(ctx context.Context, id uint, adminNotes string) error {
|
|
return s.db.WithContext(ctx).Model(&domain.DeveloperRequest{}).Where("id = ?", id).Updates(map[string]any{
|
|
"status": domain.DeveloperRequestStatusCancelled,
|
|
"admin_notes": adminNotes,
|
|
}).Error
|
|
}
|