muyu-apiserver/model/prosharelinkmodel.go

75 lines
2.6 KiB
Go
Raw Normal View History

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
}