28 lines
1.3 KiB
Go
28 lines
1.3 KiB
Go
package creator
|
|
|
|
import "context"
|
|
|
|
func (s *Store) UpsertCompetitor(ctx context.Context, input CompetitorInput) (Competitor, error) {
|
|
input, err := normalizeCompetitorInput(input)
|
|
if err != nil {
|
|
return Competitor{}, err
|
|
}
|
|
id := newID("competitor")
|
|
var returnedID string
|
|
if err := s.db.QueryRowContext(ctx, `
|
|
INSERT INTO creator_competitor (id, platform, platform_account_key, unique_id, nickname, avatar_url, homepage_url, tags, next_sync_at)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, now())
|
|
ON CONFLICT (platform, platform_account_key) DO UPDATE SET
|
|
unique_id = CASE WHEN EXCLUDED.unique_id = '' THEN creator_competitor.unique_id ELSE EXCLUDED.unique_id END,
|
|
nickname = CASE WHEN EXCLUDED.nickname = '' THEN creator_competitor.nickname ELSE EXCLUDED.nickname END,
|
|
avatar_url = CASE WHEN EXCLUDED.avatar_url = '' THEN creator_competitor.avatar_url ELSE EXCLUDED.avatar_url END,
|
|
homepage_url = EXCLUDED.homepage_url,
|
|
tags = CASE WHEN cardinality(EXCLUDED.tags) = 0 THEN creator_competitor.tags ELSE EXCLUDED.tags END,
|
|
updated_at = now()
|
|
RETURNING id`, id, input.Platform, input.PlatformAccountKey, input.UniqueID, input.Nickname,
|
|
input.AvatarURL, input.HomepageURL, input.Tags).Scan(&returnedID); err != nil {
|
|
return Competitor{}, databaseError(err)
|
|
}
|
|
return s.GetCompetitor(ctx, returnedID)
|
|
}
|