package model import ( "context" "database/sql" "fmt" "time" "github.com/zeromicro/go-zero/core/stores/sqlx" ) var _ ProShareLinkModel = (*customProShareLinkModel)(nil) type ( ProShareLinkModel interface { proShareLinkModel FindByShortCode(ctx context.Context, shortCode string) (*ProShareLink, error) FindByLinkId(ctx context.Context, linkId string) (*ProShareLink, error) FindActiveLinkByPlan(ctx context.Context, planId string) (*ProShareLink, error) UpdateClick(ctx context.Context, shortCode string) error UpdateStatus(ctx context.Context, shortCode string, status int64, rejectReason string) error } customProShareLinkModel struct { *defaultProShareLinkModel } ) func NewProShareLinkModel(conn sqlx.SqlConn) ProShareLinkModel { return &customProShareLinkModel{ defaultProShareLinkModel: newProShareLinkModel(conn), } } func (m *customProShareLinkModel) FindByShortCode(ctx context.Context, shortCode string) (*ProShareLink, error) { var resp ProShareLink query := fmt.Sprintf("SELECT %s FROM %s WHERE short_code = ? LIMIT 1", proShareLinkRows, m.table) if err := m.conn.QueryRowCtx(ctx, &resp, query, shortCode); err != nil { return nil, err } return &resp, nil } func (m *customProShareLinkModel) FindByLinkId(ctx context.Context, linkId string) (*ProShareLink, error) { var resp ProShareLink query := fmt.Sprintf("SELECT %s FROM %s WHERE link_id = ? LIMIT 1", proShareLinkRows, m.table) if err := m.conn.QueryRowCtx(ctx, &resp, query, linkId); err != nil { return nil, err } return &resp, nil } func (m *customProShareLinkModel) FindActiveLinkByPlan(ctx context.Context, planId string) (*ProShareLink, error) { var resp ProShareLink query := fmt.Sprintf("SELECT %s FROM %s WHERE plan_id = ? AND status IN (0, 1) AND expires_at > NOW() ORDER BY created_at DESC LIMIT 1", proShareLinkRows, m.table) if err := m.conn.QueryRowCtx(ctx, &resp, query, planId); err != nil { return nil, err } return &resp, nil } func (m *customProShareLinkModel) UpdateClick(ctx context.Context, shortCode string) error { query := fmt.Sprintf("UPDATE %s SET status = 1, click_count = click_count + 1, clicked_at = ? WHERE short_code = ? AND status = 0", m.table) _, err := m.conn.ExecCtx(ctx, query, sql.NullTime{Time: time.Now(), Valid: true}, shortCode) return err } func (m *customProShareLinkModel) UpdateStatus(ctx context.Context, shortCode string, status int64, rejectReason string) error { query := fmt.Sprintf("UPDATE %s SET status = ?, responded_at = ?, reject_reason = ? WHERE short_code = ?", m.table) _, err := m.conn.ExecCtx(ctx, query, status, sql.NullTime{Time: time.Now(), Valid: true}, rejectReason, shortCode) return err }