This commit is contained in:
2026-07-27 12:37:29 +08:00
parent dc9a98e893
commit 9429e4f6e0
20 changed files with 1066 additions and 61 deletions

View File

@@ -0,0 +1,210 @@
package certification
import (
"context"
"errors"
"strings"
"hyapi-server/internal/domains/certification/entities"
"hyapi-server/internal/domains/certification/repositories"
"hyapi-server/internal/shared/database"
"go.uber.org/zap"
"gorm.io/gorm"
)
const FadadaCorpAuthRecordsTable = "fadada_corp_auth_records"
type GormFadadaCorpAuthRecordRepository struct {
*database.CachedBaseRepositoryImpl
}
func NewGormFadadaCorpAuthRecordRepository(db *gorm.DB, logger *zap.Logger) *GormFadadaCorpAuthRecordRepository {
return &GormFadadaCorpAuthRecordRepository{
CachedBaseRepositoryImpl: database.NewCachedBaseRepositoryImpl(db, logger, FadadaCorpAuthRecordsTable),
}
}
func (r *GormFadadaCorpAuthRecordRepository) Create(ctx context.Context, record *entities.FadadaCorpAuthRecord) error {
return r.CreateEntity(ctx, record)
}
func (r *GormFadadaCorpAuthRecordRepository) Update(ctx context.Context, record *entities.FadadaCorpAuthRecord) error {
return r.UpdateEntity(ctx, record)
}
func (r *GormFadadaCorpAuthRecordRepository) FindByID(ctx context.Context, id string) (*entities.FadadaCorpAuthRecord, error) {
var record entities.FadadaCorpAuthRecord
if err := r.GetDB(ctx).Where("id = ?", id).First(&record).Error; err != nil {
return nil, err
}
return &record, nil
}
func (r *GormFadadaCorpAuthRecordRepository) FindLatestByUserID(ctx context.Context, userID string) (*entities.FadadaCorpAuthRecord, error) {
var record entities.FadadaCorpAuthRecord
err := r.GetDB(ctx).
Where("user_id = ?", userID).
Order("updated_at DESC").
First(&record).Error
if err != nil {
return nil, err
}
return &record, nil
}
func (r *GormFadadaCorpAuthRecordRepository) FindByCertificationID(ctx context.Context, certificationID string) (*entities.FadadaCorpAuthRecord, error) {
if strings.TrimSpace(certificationID) == "" {
return nil, gorm.ErrRecordNotFound
}
var record entities.FadadaCorpAuthRecord
err := r.GetDB(ctx).
Where("certification_id = ?", certificationID).
Order("updated_at DESC").
First(&record).Error
if err != nil {
return nil, err
}
return &record, nil
}
func (r *GormFadadaCorpAuthRecordRepository) FindByOpenCorpID(ctx context.Context, openCorpID string) (*entities.FadadaCorpAuthRecord, error) {
if strings.TrimSpace(openCorpID) == "" {
return nil, gorm.ErrRecordNotFound
}
var record entities.FadadaCorpAuthRecord
err := r.GetDB(ctx).
Where("open_corp_id = ?", openCorpID).
Order("updated_at DESC").
First(&record).Error
if err != nil {
return nil, err
}
return &record, nil
}
func (r *GormFadadaCorpAuthRecordRepository) FindByUnifiedSocialCode(ctx context.Context, uscc string) (*entities.FadadaCorpAuthRecord, error) {
if strings.TrimSpace(uscc) == "" {
return nil, gorm.ErrRecordNotFound
}
var record entities.FadadaCorpAuthRecord
err := r.GetDB(ctx).
Where("unified_social_code = ?", uscc).
Order("updated_at DESC").
First(&record).Error
if err != nil {
return nil, err
}
return &record, nil
}
func (r *GormFadadaCorpAuthRecordRepository) FindByClientCorpID(ctx context.Context, clientCorpID string) (*entities.FadadaCorpAuthRecord, error) {
if strings.TrimSpace(clientCorpID) == "" {
return nil, gorm.ErrRecordNotFound
}
var record entities.FadadaCorpAuthRecord
err := r.GetDB(ctx).
Where("client_corp_id = ?", clientCorpID).
Order("updated_at DESC").
First(&record).Error
if err != nil {
return nil, err
}
return &record, nil
}
func (r *GormFadadaCorpAuthRecordRepository) UpsertByBizKey(ctx context.Context, record *entities.FadadaCorpAuthRecord) error {
if record == nil {
return errors.New("法大大授权记录不能为空")
}
existing, err := r.findExisting(ctx, record)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
if existing == nil {
return r.Create(ctx, record)
}
mergeFadadaCorpAuthRecord(existing, record)
return r.Update(ctx, existing)
}
func (r *GormFadadaCorpAuthRecordRepository) findExisting(ctx context.Context, record *entities.FadadaCorpAuthRecord) (*entities.FadadaCorpAuthRecord, error) {
if record.CertificationID != "" {
if rec, err := r.FindByCertificationID(ctx, record.CertificationID); err == nil {
return rec, nil
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
}
if record.OpenCorpID != "" {
if rec, err := r.FindByOpenCorpID(ctx, record.OpenCorpID); err == nil {
return rec, nil
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
}
if record.UnifiedSocialCode != "" {
if rec, err := r.FindByUnifiedSocialCode(ctx, record.UnifiedSocialCode); err == nil {
return rec, nil
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
}
if record.ClientCorpID != "" {
if rec, err := r.FindByClientCorpID(ctx, record.ClientCorpID); err == nil {
return rec, nil
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
}
if record.UserID != "" {
if rec, err := r.FindLatestByUserID(ctx, record.UserID); err == nil {
return rec, nil
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
}
return nil, gorm.ErrRecordNotFound
}
func mergeFadadaCorpAuthRecord(dst, src *entities.FadadaCorpAuthRecord) {
if src.UserID != "" {
dst.UserID = src.UserID
}
if src.CertificationID != "" {
dst.CertificationID = src.CertificationID
}
if src.AppID != "" {
dst.AppID = src.AppID
}
if src.CompanyName != "" {
dst.CompanyName = src.CompanyName
}
if src.UnifiedSocialCode != "" {
dst.UnifiedSocialCode = src.UnifiedSocialCode
}
if src.ClientCorpID != "" {
dst.ClientCorpID = src.ClientCorpID
}
if src.OpenCorpID != "" {
dst.OpenCorpID = src.OpenCorpID
}
if src.BindingStatus != "" {
dst.BindingStatus = src.BindingStatus
}
if src.IdentStatus != "" {
dst.IdentStatus = src.IdentStatus
}
if src.AvailableStatus != "" {
dst.AvailableStatus = src.AvailableStatus
}
if src.AuthScopes != "" {
dst.AuthScopes = src.AuthScopes
}
if src.Source != "" {
dst.Source = src.Source
}
dst.UpdatedAt = src.UpdatedAt
}
var _ repositories.FadadaCorpAuthRecordRepository = (*GormFadadaCorpAuthRecordRepository)(nil)