chore: initial commit of ai site platform
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
87
platform/internal/license/mirror.go
Normal file
87
platform/internal/license/mirror.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package license
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ConsumedMirror 第二持久化(如 Postgres):leases 目录被删后仍能识别已用过的 id。
|
||||
type ConsumedMirror interface {
|
||||
Load(ctx context.Context) (activeID string, ids []string, err error)
|
||||
Save(ctx context.Context, activeID string, ids []string) error
|
||||
}
|
||||
|
||||
type pgMirror struct {
|
||||
db *sql.DB
|
||||
}
|
||||
|
||||
func NewPGMirror(db *sql.DB) ConsumedMirror {
|
||||
if db == nil {
|
||||
return nil
|
||||
}
|
||||
return &pgMirror{db: db}
|
||||
}
|
||||
|
||||
func (p *pgMirror) Load(ctx context.Context) (string, []string, error) {
|
||||
rows, err := p.db.QueryContext(ctx, `
|
||||
SELECT lease_id, active FROM platform_meta.license_consumed`)
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var active string
|
||||
var ids []string
|
||||
for rows.Next() {
|
||||
var id string
|
||||
var isActive bool
|
||||
if err := rows.Scan(&id, &isActive); err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
ids = append(ids, id)
|
||||
if isActive {
|
||||
active = id
|
||||
}
|
||||
}
|
||||
return active, ids, rows.Err()
|
||||
}
|
||||
|
||||
func (p *pgMirror) Save(ctx context.Context, activeID string, ids []string) error {
|
||||
tx, err := p.db.BeginTx(ctx, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() { _ = tx.Rollback() }()
|
||||
if _, err := tx.ExecContext(ctx, `DELETE FROM platform_meta.license_consumed`); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, id := range ids {
|
||||
id = trimID(id)
|
||||
if id == "" {
|
||||
continue
|
||||
}
|
||||
_, err := tx.ExecContext(ctx, `
|
||||
INSERT INTO platform_meta.license_consumed(lease_id, active, updated_at)
|
||||
VALUES ($1, $2, now())
|
||||
ON CONFLICT (lease_id) DO UPDATE SET active=EXCLUDED.active, updated_at=now()`,
|
||||
id, id == activeID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("license_consumed upsert: %w", err)
|
||||
}
|
||||
}
|
||||
if activeID != "" {
|
||||
_, err := tx.ExecContext(ctx, `
|
||||
INSERT INTO platform_meta.license_consumed(lease_id, active, updated_at)
|
||||
VALUES ($1, true, now())
|
||||
ON CONFLICT (lease_id) DO UPDATE SET active=true, updated_at=now()`, activeID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
func trimID(s string) string {
|
||||
return strings.TrimSpace(s)
|
||||
}
|
||||
Reference in New Issue
Block a user