sqlc: prepare implement topics data logic

r/paopao-ce-pro
Michael Li 3 years ago
parent 7a9f62a20d
commit bfef2fe7f9
No known key found for this signature in database

@ -1,90 +0,0 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.16.0
// source: city.sql
package dbr
import (
"context"
)
const createCity = `-- name: CreateCity :one
INSERT INTO city (
name,
slug
) VALUES (
$1,
$2
) RETURNING slug, name
`
type CreateCityParams struct {
Name string
Slug string
}
// Create a new city. The slug must be unique.
// This is the second line of the comment
// This is the third line
func (q *Queries) CreateCity(ctx context.Context, arg CreateCityParams) (City, error) {
row := q.db.QueryRow(ctx, createCity, arg.Name, arg.Slug)
var i City
err := row.Scan(&i.Slug, &i.Name)
return i, err
}
const getCity = `-- name: GetCity :one
SELECT slug, name
FROM city
WHERE slug = $1
`
func (q *Queries) GetCity(ctx context.Context, slug string) (City, error) {
row := q.db.QueryRow(ctx, getCity, slug)
var i City
err := row.Scan(&i.Slug, &i.Name)
return i, err
}
const listCities = `-- name: ListCities :many
SELECT slug, name
FROM city
ORDER BY name
`
func (q *Queries) ListCities(ctx context.Context) ([]City, error) {
rows, err := q.db.Query(ctx, listCities)
if err != nil {
return nil, err
}
defer rows.Close()
var items []City
for rows.Next() {
var i City
if err := rows.Scan(&i.Slug, &i.Name); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const updateCityName = `-- name: UpdateCityName :exec
UPDATE city
SET name = $2
WHERE slug = $1
`
type UpdateCityNameParams struct {
Slug string
Name string
}
func (q *Queries) UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error {
_, err := q.db.Exec(ctx, updateCityName, arg.Slug, arg.Name)
return err
}

@ -4,72 +4,17 @@
package dbr package dbr
import ( import ()
"database/sql/driver"
"fmt" // 主题标签
type PTag struct {
"github.com/jackc/pgx/v5/pgtype" ID int64
) UserID int64
Tag string
// Venues can be either open or closed QuoteNum int64
type Status string CreatedOn int32
ModifiedOn int32
const ( DeletedOn int32
StatusOpen Status = "op!en" // 是否删除
StatusClosed Status = "clo@sed" IsDel bool
)
func (e *Status) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = Status(s)
case string:
*e = Status(s)
default:
return fmt.Errorf("unsupported scan type for Status: %T", src)
}
return nil
}
type NullStatus struct {
Status Status
Valid bool // Valid is true if Status is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullStatus) Scan(value interface{}) error {
if value == nil {
ns.Status, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.Status.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullStatus) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.Status), nil
}
type City struct {
Slug string
Name string
}
// Venues are places where muisc happens
type Venue struct {
ID int32
Status Status
Statuses pgtype.Array[Status]
// This value appears in public URLs
Slug string
Name string
City string
SpotifyPlaylist string
SongkickID pgtype.Text
Tags pgtype.Array[string]
CreatedAt pgtype.Timestamp
} }

@ -6,22 +6,21 @@ package dbr
import ( import (
"context" "context"
"github.com/jackc/pgx/v5/pgtype"
) )
type Querier interface { type Querier interface {
// Create a new city. The slug must be unique. DecrTagsById(ctx context.Context, arg *DecrTagsByIdParams) error
// This is the second line of the comment HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRow, error)
// This is the third line IncrTagsById(ctx context.Context, arg *IncrTagsByIdParams) error
CreateCity(ctx context.Context, arg CreateCityParams) (City, error) InsertTags(ctx context.Context, arg *InsertTagsParams) (*InsertTagsRow, error)
CreateVenue(ctx context.Context, arg CreateVenueParams) (int32, error) NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*NewestTagsRow, error)
DeleteVenue(ctx context.Context, slug string) error TagsByIdA(ctx context.Context, ids pgtype.Array[int64]) ([]int64, error)
GetCity(ctx context.Context, slug string) (City, error) TagsByIdB(ctx context.Context, ids pgtype.Array[int64]) ([]*TagsByIdBRow, error)
GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) TagsByKeywordA(ctx context.Context) ([]*TagsByKeywordARow, error)
ListCities(ctx context.Context) ([]City, error) TagsByKeywordB(ctx context.Context, tag string) ([]*TagsByKeywordBRow, error)
ListVenues(ctx context.Context, city string) ([]Venue, error) TagsByName(ctx context.Context, tags pgtype.Array[string]) ([]*TagsByNameRow, error)
UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error
UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) (int32, error)
VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error)
} }
var _ Querier = (*Queries)(nil) var _ Querier = (*Queries)(nil)

@ -1,26 +0,0 @@
-- name: ListCities :many
SELECT *
FROM city
ORDER BY name;
-- name: GetCity :one
SELECT *
FROM city
WHERE slug = $1;
-- name: CreateCity :one
-- Create a new city. The slug must be unique.
-- This is the second line of the comment
-- This is the third line
INSERT INTO city (
name,
slug
) VALUES (
$1,
$2
) RETURNING *;
-- name: UpdateCityName :exec
UPDATE city
SET name = $2
WHERE slug = $1;

@ -0,0 +1,58 @@
-- name: NewestTags :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del = false AND quote_num > 0
ORDER BY id DESC
OFFSET $1 LIMIT $2;
-- name: HotTags :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del = false AND quote_num > 0
ORDER BY quote_num DESC
OFFSET $1 LIMIT $2;
-- name: TagsByKeywordA :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del AND quote_num > 0
ORDER BY quote_num DESC
OFFSET 0 LIMIT 6;
-- name: TagsByKeywordB :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del = false AND tag LIKE $1
ORDER BY quote_num DESC
OFFSET 0 LIMIT 6;
-- name: InsertTags :one
INSERT INTO p_tag (user_id, tag, created_on, modified_on, quote_num)
VALUES ($1, $2, $3, $3, 1)
RETURNING id, user_id, tag, quote_num;
-- name: TagsByIdA :many
SELECT id
FROM p_tag
WHERE id = ANY(@ids::bigserial[]) AND is_del = false AND quote_num >= 0;
-- name: TagsByIdB :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE id = ANY(@ids::bigserial[]);
-- name: DecrTagsById :exec
UPDATE p_tag
SET quote_num = quote_num-1,
modified_on=$1
WHERE id = ANY(@ids::bigserial[]);
-- name: TagsByName :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE tag = ANY(@tags::varchar[]) AND is_del = false AND quote_num >= 0;
-- name: IncrTagsById :exec
UPDATE p_tag
SET quote_num = quote_num+1, modified_on = $1
WHERE id = ANY(@ids::bigserial[]);

@ -1,49 +0,0 @@
-- name: ListVenues :many
SELECT *
FROM venue
WHERE city = $1
ORDER BY name;
-- name: DeleteVenue :exec
DELETE FROM venue
WHERE slug = $1 AND slug = $1;
-- name: GetVenue :one
SELECT *
FROM venue
WHERE slug = $1 AND city = $2;
-- name: CreateVenue :one
INSERT INTO venue (
slug,
name,
city,
created_at,
spotify_playlist,
status,
statuses,
tags
) VALUES (
$1,
$2,
$3,
NOW(),
$4,
$5,
$6,
$7
) RETURNING id;
-- name: UpdateVenueName :one
UPDATE venue
SET name = $2
WHERE slug = $1
RETURNING id;
-- name: VenueCountByCity :many
SELECT
city,
count(*)
FROM venue
GROUP BY 1
ORDER BY 1;

@ -1,4 +0,0 @@
CREATE TABLE city (
slug text PRIMARY KEY,
name text NOT NULL
)

@ -0,0 +1,2 @@
DROP TABLE IF EXISTS p_tag;
DROP INDEX IF EXISTS p_tag_tag_idx, p_tag_user_idx, p_tag_quote_num_idx;

@ -0,0 +1,17 @@
CREATE TABLE p_tag (
id bigserial PRIMARY KEY,
user_id bigserial NOT NULL DEFAULT 0,
tag varchar(255) NOT NULL,
quote_num bigint NOT NULL DEFAULT 0,
created_on int NOT NULL DEFAULT 0,
modified_on int NOT NULL DEFAULT 0,
deleted_on int NOT NULL DEFAULT 0,
is_del boolean NOT NULL DEFAULT false,
UNIQUE (tag)
);
COMMENT ON TABLE p_tag IS '主题标签';
COMMENT ON COLUMN p_tag.is_del IS '是否删除';
CREATE UNIQUE INDEX p_tag_tag_idx ON p_tag (tag);
CREATE INDEX p_tag_user_idx ON p_tag (user_id);
CREATE INDEX p_tag_quote_num_idx On p_tag (quote_num);

@ -1,18 +0,0 @@
CREATE TYPE status AS ENUM ('op!en', 'clo@sed');
COMMENT ON TYPE status IS 'Venues can be either open or closed';
CREATE TABLE venues (
id SERIAL primary key,
dropped text,
status status not null,
statuses status[],
slug text not null,
name varchar(255) not null,
city text not null references city(slug),
spotify_playlist varchar not null,
songkick_id text,
tags text[]
);
COMMENT ON TABLE venues IS 'Venues are places where muisc happens';
COMMENT ON COLUMN venues.slug IS 'This value appears in public URLs';

@ -1,3 +0,0 @@
ALTER TABLE venues RENAME TO venue;
ALTER TABLE venue ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT NOW();
ALTER TABLE venue DROP COLUMN dropped;

@ -0,0 +1,348 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.16.0
// source: topic.sql
package dbr
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const decrTagsById = `-- name: DecrTagsById :exec
UPDATE p_tag
SET quote_num = quote_num-1,
modified_on=$1
WHERE id = ANY($2::bigserial[])
`
type DecrTagsByIdParams struct {
ModifiedOn int32
Ids pgtype.Array[int64]
}
func (q *Queries) DecrTagsById(ctx context.Context, arg *DecrTagsByIdParams) error {
_, err := q.db.Exec(ctx, decrTagsById, arg.ModifiedOn, arg.Ids)
return err
}
const hotTags = `-- name: HotTags :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del = false AND quote_num > 0
ORDER BY quote_num DESC
OFFSET $1 LIMIT $2
`
type HotTagsParams struct {
Offset int32
Limit int32
}
type HotTagsRow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRow, error) {
rows, err := q.db.Query(ctx, hotTags, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}
defer rows.Close()
var items []*HotTagsRow
for rows.Next() {
var i HotTagsRow
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
); err != nil {
return nil, err
}
items = append(items, &i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const incrTagsById = `-- name: IncrTagsById :exec
UPDATE p_tag
SET quote_num = quote_num+1, modified_on = $1
WHERE id = ANY($2::bigserial[])
`
type IncrTagsByIdParams struct {
ModifiedOn int32
Ids pgtype.Array[int64]
}
func (q *Queries) IncrTagsById(ctx context.Context, arg *IncrTagsByIdParams) error {
_, err := q.db.Exec(ctx, incrTagsById, arg.ModifiedOn, arg.Ids)
return err
}
const insertTags = `-- name: InsertTags :one
INSERT INTO p_tag (user_id, tag, created_on, modified_on, quote_num)
VALUES ($1, $2, $3, $3, 1)
RETURNING id, user_id, tag, quote_num
`
type InsertTagsParams struct {
UserID int64
Tag string
CreatedOn int32
}
type InsertTagsRow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) InsertTags(ctx context.Context, arg *InsertTagsParams) (*InsertTagsRow, error) {
row := q.db.QueryRow(ctx, insertTags, arg.UserID, arg.Tag, arg.CreatedOn)
var i InsertTagsRow
err := row.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
)
return &i, err
}
const newestTags = `-- name: NewestTags :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del = false AND quote_num > 0
ORDER BY id DESC
OFFSET $1 LIMIT $2
`
type NewestTagsParams struct {
Offset int32
Limit int32
}
type NewestTagsRow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*NewestTagsRow, error) {
rows, err := q.db.Query(ctx, newestTags, arg.Offset, arg.Limit)
if err != nil {
return nil, err
}
defer rows.Close()
var items []*NewestTagsRow
for rows.Next() {
var i NewestTagsRow
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
); err != nil {
return nil, err
}
items = append(items, &i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const tagsByIdA = `-- name: TagsByIdA :many
SELECT id
FROM p_tag
WHERE id = ANY($1::bigserial[]) AND is_del = false AND quote_num >= 0
`
func (q *Queries) TagsByIdA(ctx context.Context, ids pgtype.Array[int64]) ([]int64, error) {
rows, err := q.db.Query(ctx, tagsByIdA, ids)
if err != nil {
return nil, err
}
defer rows.Close()
var items []int64
for rows.Next() {
var id int64
if err := rows.Scan(&id); err != nil {
return nil, err
}
items = append(items, id)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const tagsByIdB = `-- name: TagsByIdB :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE id = ANY($1::bigserial[])
`
type TagsByIdBRow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) TagsByIdB(ctx context.Context, ids pgtype.Array[int64]) ([]*TagsByIdBRow, error) {
rows, err := q.db.Query(ctx, tagsByIdB, ids)
if err != nil {
return nil, err
}
defer rows.Close()
var items []*TagsByIdBRow
for rows.Next() {
var i TagsByIdBRow
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
); err != nil {
return nil, err
}
items = append(items, &i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const tagsByKeywordA = `-- name: TagsByKeywordA :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del AND quote_num > 0
ORDER BY quote_num DESC
OFFSET 0 LIMIT 6
`
type TagsByKeywordARow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) TagsByKeywordA(ctx context.Context) ([]*TagsByKeywordARow, error) {
rows, err := q.db.Query(ctx, tagsByKeywordA)
if err != nil {
return nil, err
}
defer rows.Close()
var items []*TagsByKeywordARow
for rows.Next() {
var i TagsByKeywordARow
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
); err != nil {
return nil, err
}
items = append(items, &i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const tagsByKeywordB = `-- name: TagsByKeywordB :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE is_del = false AND tag LIKE $1
ORDER BY quote_num DESC
OFFSET 0 LIMIT 6
`
type TagsByKeywordBRow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) TagsByKeywordB(ctx context.Context, tag string) ([]*TagsByKeywordBRow, error) {
rows, err := q.db.Query(ctx, tagsByKeywordB, tag)
if err != nil {
return nil, err
}
defer rows.Close()
var items []*TagsByKeywordBRow
for rows.Next() {
var i TagsByKeywordBRow
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
); err != nil {
return nil, err
}
items = append(items, &i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const tagsByName = `-- name: TagsByName :many
SELECT id, user_id, tag, quote_num
FROM p_tag
WHERE tag = ANY($1::varchar[]) AND is_del = false AND quote_num >= 0
`
type TagsByNameRow struct {
ID int64
UserID int64
Tag string
QuoteNum int64
}
func (q *Queries) TagsByName(ctx context.Context, tags pgtype.Array[string]) ([]*TagsByNameRow, error) {
rows, err := q.db.Query(ctx, tagsByName, tags)
if err != nil {
return nil, err
}
defer rows.Close()
var items []*TagsByNameRow
for rows.Next() {
var i TagsByNameRow
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.Tag,
&i.QuoteNum,
); err != nil {
return nil, err
}
items = append(items, &i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}

@ -1,189 +0,0 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.16.0
// source: venue.sql
package dbr
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const createVenue = `-- name: CreateVenue :one
INSERT INTO venue (
slug,
name,
city,
created_at,
spotify_playlist,
status,
statuses,
tags
) VALUES (
$1,
$2,
$3,
NOW(),
$4,
$5,
$6,
$7
) RETURNING id
`
type CreateVenueParams struct {
Slug string
Name string
City string
SpotifyPlaylist string
Status Status
Statuses pgtype.Array[Status]
Tags pgtype.Array[string]
}
func (q *Queries) CreateVenue(ctx context.Context, arg CreateVenueParams) (int32, error) {
row := q.db.QueryRow(ctx, createVenue,
arg.Slug,
arg.Name,
arg.City,
arg.SpotifyPlaylist,
arg.Status,
arg.Statuses,
arg.Tags,
)
var id int32
err := row.Scan(&id)
return id, err
}
const deleteVenue = `-- name: DeleteVenue :exec
DELETE FROM venue
WHERE slug = $1 AND slug = $1
`
func (q *Queries) DeleteVenue(ctx context.Context, slug string) error {
_, err := q.db.Exec(ctx, deleteVenue, slug)
return err
}
const getVenue = `-- name: GetVenue :one
SELECT id, status, statuses, slug, name, city, spotify_playlist, songkick_id, tags, created_at
FROM venue
WHERE slug = $1 AND city = $2
`
type GetVenueParams struct {
Slug string
City string
}
func (q *Queries) GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) {
row := q.db.QueryRow(ctx, getVenue, arg.Slug, arg.City)
var i Venue
err := row.Scan(
&i.ID,
&i.Status,
&i.Statuses,
&i.Slug,
&i.Name,
&i.City,
&i.SpotifyPlaylist,
&i.SongkickID,
&i.Tags,
&i.CreatedAt,
)
return i, err
}
const listVenues = `-- name: ListVenues :many
SELECT id, status, statuses, slug, name, city, spotify_playlist, songkick_id, tags, created_at
FROM venue
WHERE city = $1
ORDER BY name
`
func (q *Queries) ListVenues(ctx context.Context, city string) ([]Venue, error) {
rows, err := q.db.Query(ctx, listVenues, city)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Venue
for rows.Next() {
var i Venue
if err := rows.Scan(
&i.ID,
&i.Status,
&i.Statuses,
&i.Slug,
&i.Name,
&i.City,
&i.SpotifyPlaylist,
&i.SongkickID,
&i.Tags,
&i.CreatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const updateVenueName = `-- name: UpdateVenueName :one
UPDATE venue
SET name = $2
WHERE slug = $1
RETURNING id
`
type UpdateVenueNameParams struct {
Slug string
Name string
}
func (q *Queries) UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) (int32, error) {
row := q.db.QueryRow(ctx, updateVenueName, arg.Slug, arg.Name)
var id int32
err := row.Scan(&id)
return id, err
}
const venueCountByCity = `-- name: VenueCountByCity :many
SELECT
city,
count(*)
FROM venue
GROUP BY 1
ORDER BY 1
`
type VenueCountByCityRow struct {
City string
Count int64
}
func (q *Queries) VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error) {
rows, err := q.db.Query(ctx, venueCountByCity)
if err != nil {
return nil, err
}
defer rows.Close()
var items []VenueCountByCityRow
for rows.Next() {
var i VenueCountByCityRow
if err := rows.Scan(&i.City, &i.Count); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}

@ -10,3 +10,5 @@ sql:
sql_package: 'pgx/v5' sql_package: 'pgx/v5'
emit_prepared_queries: true emit_prepared_queries: true
emit_interface: true emit_interface: true
emit_result_struct_pointers: true
emit_params_struct_pointers: true

@ -39,27 +39,27 @@ func (s *pgxServant) beingTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.
return tx, dbr.New(tx), nil return tx, dbr.New(tx), nil
} }
func (s *pgxServant) with(handle func(dbr.Querier) error) error { func (s *pgxServant) with(handle func(c context.Context, q dbr.Querier) error) error {
ctx := context.Background() ctx := context.Background()
tx, err := s.db.Begin(ctx) tx, err := s.db.Begin(ctx)
if err != nil { if err != nil {
return err return err
} }
defer tx.Rollback(ctx) defer tx.Rollback(ctx)
if err = handle(dbr.New(tx)); err != nil { if err = handle(ctx, dbr.New(tx)); err != nil {
return err return err
} }
return tx.Commit(ctx) return tx.Commit(ctx)
} }
func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(ctx context.Context, q dbr.Querier) error) error {
ctx := context.Background() ctx := context.Background()
tx, err := s.db.BeginTx(ctx, txOptions) tx, err := s.db.BeginTx(ctx, txOptions)
if err != nil { if err != nil {
return err return err
} }
defer tx.Rollback(ctx) defer tx.Rollback(ctx)
if err = handle(dbr.New(tx)); err != nil { if err = handle(ctx, dbr.New(tx)); err != nil {
return err return err
} }
return tx.Commit(ctx) return tx.Commit(ctx)

@ -5,8 +5,12 @@
package slonik package slonik
import ( import (
"context"
"strings"
"github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5"
"github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core"
dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/ce/postgres"
"github.com/rocboss/paopao-ce/pkg/debug" "github.com/rocboss/paopao-ce/pkg/debug"
) )
@ -20,26 +24,88 @@ type topicServant struct {
func (s *topicServant) UpsertTags(userId int64, tags []string) ([]*core.Tag, error) { func (s *topicServant) UpsertTags(userId int64, tags []string) ([]*core.Tag, error) {
// TODO // TODO
debug.NotImplemented() return nil, debug.ErrNotImplemented
return nil, nil
} }
func (s *topicServant) DecrTagsById(ids []int64) error { func (s *topicServant) DecrTagsById(ids []int64) error {
// TODO // return s.with(func(c context.Context, q dbr.Querier) error {
debug.NotImplemented() // tagIds, err := q.TagsByIdA(c, pgtype.Array[int64](ids))
return nil // if err != nil {
// return err
// }
// err := q.DecrTagsById(c, &dbr.DecrTagsByIdParams{ModifiedOn: time.Now().Unix(), Ids: tagIds})
// if err != nil {
// return err
// }
// return nil
// })
return debug.ErrNotImplemented
} }
func (s *topicServant) GetTags(category core.TagCategory, offset int, limit int) ([]*core.Tag, error) { func (s *topicServant) GetTags(category core.TagCategory, offset int, limit int) (res []*core.Tag, _ error) {
// TODO ctx := context.Background()
debug.NotImplemented() switch category {
return nil, nil case core.TagCategoryHot:
tags, err := s.q.HotTags(ctx, &dbr.HotTagsParams{Offset: int32(offset), Limit: int32(limit)})
if err != nil {
return nil, err
}
for _, tag := range tags {
res = append(res, &core.Tag{
ID: tag.ID,
UserID: tag.UserID,
Tag: tag.Tag,
QuoteNum: tag.QuoteNum,
})
}
case core.TagCategoryNew:
tags, err := s.q.NewestTags(ctx, &dbr.NewestTagsParams{Offset: int32(offset), Limit: int32(limit)})
if err != nil {
return nil, err
}
for _, tag := range tags {
res = append(res, &core.Tag{
ID: tag.ID,
UserID: tag.UserID,
Tag: tag.Tag,
QuoteNum: tag.QuoteNum,
})
}
}
return
} }
func (s *topicServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { func (s *topicServant) GetTagsByKeyword(keyword string) (res []*core.Tag, _ error) {
// TODO ctx := context.Background()
debug.NotImplemented() keyword = "%" + strings.Trim(keyword, " ") + "%"
return nil, nil if keyword == "%%" {
tags, err := s.q.TagsByKeywordA(ctx)
if err != nil {
return nil, err
}
for _, tag := range tags {
res = append(res, &core.Tag{
ID: tag.ID,
UserID: tag.UserID,
Tag: tag.Tag,
QuoteNum: tag.QuoteNum,
})
}
} else {
tags, err := s.q.TagsByKeywordB(ctx, keyword)
if err != nil {
return nil, err
}
for _, tag := range tags {
res = append(res, &core.Tag{
ID: tag.ID,
UserID: tag.UserID,
Tag: tag.Tag,
QuoteNum: tag.QuoteNum,
})
}
}
return
} }
func newTopicService(db *pgx.Conn) core.TopicService { func newTopicService(db *pgx.Conn) core.TopicService {

Loading…
Cancel
Save