package repository import ( "baron-sso-backend/internal/domain" "context" "gorm.io/gorm" "gorm.io/gorm/clause" ) type RPUserMetadataRepository interface { Get(ctx context.Context, clientID, userID string) (*domain.RPUserMetadata, error) Upsert(ctx context.Context, metadata *domain.RPUserMetadata) error } type rpUserMetadataRepository struct { db *gorm.DB } func NewRPUserMetadataRepository(db *gorm.DB) RPUserMetadataRepository { return &rpUserMetadataRepository{db: db} } func (r *rpUserMetadataRepository) Get(ctx context.Context, clientID, userID string) (*domain.RPUserMetadata, error) { var metadata domain.RPUserMetadata if err := r.db.WithContext(ctx).First(&metadata, "client_id = ? AND user_id = ?", clientID, userID).Error; err != nil { return nil, err } return &metadata, nil } func (r *rpUserMetadataRepository) Upsert(ctx context.Context, metadata *domain.RPUserMetadata) error { return r.db.WithContext(ctx).Clauses(clause.OnConflict{ Columns: []clause.Column{ {Name: "client_id"}, {Name: "user_id"}, }, DoUpdates: clause.AssignmentColumns([]string{"metadata", "updated_at"}), }).Create(metadata).Error }