75 lines
2.6 KiB
Go
75 lines
2.6 KiB
Go
|
|
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
|
||
|
|
}
|