sms-metering-location-link: per-tag SMS credits (allocated/used, admin top-up), short URLs + owner location page (map embed + finder details) — 13/13 scenarios
This commit is contained in:
@@ -11,11 +11,20 @@ import (
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
const addSmsUsed = `-- name: AddSmsUsed :exec
|
||||
UPDATE tags SET sms_used = sms_used + 1, updated_at = now() WHERE id = $1
|
||||
`
|
||||
|
||||
func (q *Queries) AddSmsUsed(ctx context.Context, id int64) error {
|
||||
_, err := q.db.Exec(ctx, addSmsUsed, id)
|
||||
return err
|
||||
}
|
||||
|
||||
const bindTag = `-- name: BindTag :one
|
||||
UPDATE tags
|
||||
SET owner_id = $1, updated_at = now()
|
||||
WHERE tag_code = $2 AND owner_id IS NULL AND status = 'unset'
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start
|
||||
`
|
||||
|
||||
type BindTagParams struct {
|
||||
@@ -42,6 +51,9 @@ func (q *Queries) BindTag(ctx context.Context, arg BindTagParams) (Tag, error) {
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
@@ -50,7 +62,7 @@ const clearTagOwner = `-- name: ClearTagOwner :one
|
||||
UPDATE tags
|
||||
SET owner_id=NULL, status='unset', item_type=NULL, description=NULL, photo_url=NULL, phone=NULL, address=NULL, notes=NULL, updated_at=now()
|
||||
WHERE id=$1
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start
|
||||
`
|
||||
|
||||
func (q *Queries) ClearTagOwner(ctx context.Context, id int64) (Tag, error) {
|
||||
@@ -72,6 +84,9 @@ func (q *Queries) ClearTagOwner(ctx context.Context, id int64) (Tag, error) {
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
@@ -252,8 +267,41 @@ func (q *Queries) GetRecentScanByFingerprint(ctx context.Context, arg GetRecentS
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getScanByID = `-- name: GetScanByID :one
|
||||
SELECT id, tag_id, scanned_at, lat, lng, location_shared, scanner_phone, alert_sent, fingerprint, ip FROM scans WHERE id = $1
|
||||
`
|
||||
|
||||
func (q *Queries) GetScanByID(ctx context.Context, id int64) (Scan, error) {
|
||||
row := q.db.QueryRow(ctx, getScanByID, id)
|
||||
var i Scan
|
||||
err := row.Scan(
|
||||
&i.ID,
|
||||
&i.TagID,
|
||||
&i.ScannedAt,
|
||||
&i.Lat,
|
||||
&i.Lng,
|
||||
&i.LocationShared,
|
||||
&i.ScannerPhone,
|
||||
&i.AlertSent,
|
||||
&i.Fingerprint,
|
||||
&i.Ip,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getShortCode = `-- name: GetShortCode :one
|
||||
SELECT code, scan_id, created_at FROM url_shortened WHERE code = $1
|
||||
`
|
||||
|
||||
func (q *Queries) GetShortCode(ctx context.Context, code string) (UrlShortened, error) {
|
||||
row := q.db.QueryRow(ctx, getShortCode, code)
|
||||
var i UrlShortened
|
||||
err := row.Scan(&i.Code, &i.ScanID, &i.CreatedAt)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getTagByCode = `-- name: GetTagByCode :one
|
||||
SELECT id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id FROM tags WHERE tag_code = $1
|
||||
SELECT id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start FROM tags WHERE tag_code = $1
|
||||
`
|
||||
|
||||
func (q *Queries) GetTagByCode(ctx context.Context, tagCode string) (Tag, error) {
|
||||
@@ -275,12 +323,15 @@ func (q *Queries) GetTagByCode(ctx context.Context, tagCode string) (Tag, error)
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getTagByID = `-- name: GetTagByID :one
|
||||
SELECT id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id FROM tags WHERE id = $1
|
||||
SELECT id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start FROM tags WHERE id = $1
|
||||
`
|
||||
|
||||
func (q *Queries) GetTagByID(ctx context.Context, id int64) (Tag, error) {
|
||||
@@ -302,6 +353,9 @@ func (q *Queries) GetTagByID(ctx context.Context, id int64) (Tag, error) {
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
@@ -388,9 +442,25 @@ func (q *Queries) InsertScan(ctx context.Context, arg InsertScanParams) (Scan, e
|
||||
return i, err
|
||||
}
|
||||
|
||||
const insertShortCode = `-- name: InsertShortCode :one
|
||||
INSERT INTO url_shortened (code, scan_id) VALUES ($1, $2) RETURNING code, scan_id, created_at
|
||||
`
|
||||
|
||||
type InsertShortCodeParams struct {
|
||||
Code string `json:"code"`
|
||||
ScanID int64 `json:"scan_id"`
|
||||
}
|
||||
|
||||
func (q *Queries) InsertShortCode(ctx context.Context, arg InsertShortCodeParams) (UrlShortened, error) {
|
||||
row := q.db.QueryRow(ctx, insertShortCode, arg.Code, arg.ScanID)
|
||||
var i UrlShortened
|
||||
err := row.Scan(&i.Code, &i.ScanID, &i.CreatedAt)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const insertTag = `-- name: InsertTag :one
|
||||
INSERT INTO tags (tag_code) VALUES ($1)
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start
|
||||
`
|
||||
|
||||
func (q *Queries) InsertTag(ctx context.Context, tagCode string) (Tag, error) {
|
||||
@@ -412,12 +482,15 @@ func (q *Queries) InsertTag(ctx context.Context, tagCode string) (Tag, error) {
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const listTagsByOwner = `-- name: ListTagsByOwner :many
|
||||
SELECT id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id FROM tags WHERE owner_id = $1 ORDER BY created_at DESC
|
||||
SELECT id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start FROM tags WHERE owner_id = $1 ORDER BY created_at DESC
|
||||
`
|
||||
|
||||
func (q *Queries) ListTagsByOwner(ctx context.Context, ownerID pgtype.Int8) ([]Tag, error) {
|
||||
@@ -445,6 +518,9 @@ func (q *Queries) ListTagsByOwner(ctx context.Context, ownerID pgtype.Int8) ([]T
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -503,7 +579,7 @@ const updateTagDetails = `-- name: UpdateTagDetails :one
|
||||
UPDATE tags
|
||||
SET item_type=$2, description=$3, photo_url=$4, phone=$5, address=$6, notes=$7, sms_enabled=$8, status='active', updated_at=now()
|
||||
WHERE id=$1
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id
|
||||
RETURNING id, tag_code, owner_id, status, item_type, description, photo_url, phone, address, notes, created_at, updated_at, sms_enabled, product_id, order_id, sms_allocated, sms_used, sms_period_start
|
||||
`
|
||||
|
||||
type UpdateTagDetailsParams struct {
|
||||
@@ -545,6 +621,9 @@ func (q *Queries) UpdateTagDetails(ctx context.Context, arg UpdateTagDetailsPara
|
||||
&i.SmsEnabled,
|
||||
&i.ProductID,
|
||||
&i.OrderID,
|
||||
&i.SmsAllocated,
|
||||
&i.SmsUsed,
|
||||
&i.SmsPeriodStart,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user