From 365841c535e6139f7713ab62ea7a91e226df242a Mon Sep 17 00:00:00 2001 From: Michael Li Date: Wed, 4 Jan 2023 03:42:46 +0800 Subject: [PATCH 01/23] sqlc: add stub sample sqlc code for slonik --- Makefile | 7 + go.mod | 5 +- go.sum | 10 +- internal/dao/slonik/ce/ce.go | 3 + internal/dao/slonik/ce/mysql/city.sql.go | 88 ++++++++ internal/dao/slonik/ce/mysql/db.go | 178 ++++++++++++++++ internal/dao/slonik/ce/mysql/models.go | 75 +++++++ internal/dao/slonik/ce/mysql/querier.go | 25 +++ internal/dao/slonik/ce/mysql/query/city.sql | 23 +++ internal/dao/slonik/ce/mysql/query/venue.sql | 48 +++++ .../dao/slonik/ce/mysql/schema/0001_city.sql | 4 + .../dao/slonik/ce/mysql/schema/0002_venue.sql | 12 ++ .../ce/mysql/schema/0003_add_column.sql | 3 + internal/dao/slonik/ce/mysql/venue.sql.go | 193 ++++++++++++++++++ internal/dao/slonik/ce/postgres/city.sql.go | 90 ++++++++ internal/dao/slonik/ce/postgres/db.go | 32 +++ internal/dao/slonik/ce/postgres/models.go | 75 +++++++ internal/dao/slonik/ce/postgres/querier.go | 27 +++ internal/dao/slonik/ce/postgres/query.sql | 56 +++++ .../dao/slonik/ce/postgres/query/city.sql | 26 +++ .../dao/slonik/ce/postgres/query/venue.sql | 49 +++++ internal/dao/slonik/ce/postgres/schema.sql | 21 ++ .../slonik/ce/postgres/schema/0001_city.sql | 4 + .../slonik/ce/postgres/schema/0002_venue.sql | 18 ++ .../ce/postgres/schema/0003_add_column.sql | 3 + internal/dao/slonik/ce/postgres/venue.sql.go | 189 +++++++++++++++++ internal/dao/slonik/ce/sqlc.yaml | 30 +++ internal/dao/slonik/ce/sqlite/city.sql.go | 88 ++++++++ internal/dao/slonik/ce/sqlite/db.go | 178 ++++++++++++++++ internal/dao/slonik/ce/sqlite/models.go | 28 +++ internal/dao/slonik/ce/sqlite/querier.go | 25 +++ internal/dao/slonik/ce/sqlite/query/city.sql | 23 +++ internal/dao/slonik/ce/sqlite/query/venue.sql | 48 +++++ .../dao/slonik/ce/sqlite/schema/0001_city.sql | 4 + .../slonik/ce/sqlite/schema/0002_venue.sql | 13 ++ .../ce/sqlite/schema/0003_add_column.sql | 3 + internal/dao/slonik/ce/sqlite/venue.sql.go | 193 ++++++++++++++++++ 37 files changed, 1891 insertions(+), 6 deletions(-) create mode 100644 internal/dao/slonik/ce/ce.go create mode 100644 internal/dao/slonik/ce/mysql/city.sql.go create mode 100644 internal/dao/slonik/ce/mysql/db.go create mode 100644 internal/dao/slonik/ce/mysql/models.go create mode 100644 internal/dao/slonik/ce/mysql/querier.go create mode 100644 internal/dao/slonik/ce/mysql/query/city.sql create mode 100644 internal/dao/slonik/ce/mysql/query/venue.sql create mode 100644 internal/dao/slonik/ce/mysql/schema/0001_city.sql create mode 100644 internal/dao/slonik/ce/mysql/schema/0002_venue.sql create mode 100644 internal/dao/slonik/ce/mysql/schema/0003_add_column.sql create mode 100644 internal/dao/slonik/ce/mysql/venue.sql.go create mode 100644 internal/dao/slonik/ce/postgres/city.sql.go create mode 100644 internal/dao/slonik/ce/postgres/db.go create mode 100644 internal/dao/slonik/ce/postgres/models.go create mode 100644 internal/dao/slonik/ce/postgres/querier.go create mode 100644 internal/dao/slonik/ce/postgres/query.sql create mode 100644 internal/dao/slonik/ce/postgres/query/city.sql create mode 100644 internal/dao/slonik/ce/postgres/query/venue.sql create mode 100644 internal/dao/slonik/ce/postgres/schema.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0001_city.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0002_venue.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0003_add_column.sql create mode 100644 internal/dao/slonik/ce/postgres/venue.sql.go create mode 100644 internal/dao/slonik/ce/sqlc.yaml create mode 100644 internal/dao/slonik/ce/sqlite/city.sql.go create mode 100644 internal/dao/slonik/ce/sqlite/db.go create mode 100644 internal/dao/slonik/ce/sqlite/models.go create mode 100644 internal/dao/slonik/ce/sqlite/querier.go create mode 100644 internal/dao/slonik/ce/sqlite/query/city.sql create mode 100644 internal/dao/slonik/ce/sqlite/query/venue.sql create mode 100644 internal/dao/slonik/ce/sqlite/schema/0001_city.sql create mode 100644 internal/dao/slonik/ce/sqlite/schema/0002_venue.sql create mode 100644 internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql create mode 100644 internal/dao/slonik/ce/sqlite/venue.sql.go diff --git a/Makefile b/Makefile index 3104045c..d77e1819 100644 --- a/Makefile +++ b/Makefile @@ -82,6 +82,12 @@ gen-grpc: @buf generate proto @go fmt ./auto/rpc/... +.PHONY: gen-sqlc +gen-sqlc: + @find internal/dao/slonik/ce/mysql internal/dao/slonik/ce/postgres internal/dao/slonik/ce/sqlite -name '*.go' -exec rm -f {} + + @go generate internal/dao/slonik/ce/ce.go + @go fmt ./internal/dao/slonik/ce/... + .PHONY: proto-mod proto-mod: @cd proto/ && buf mod update @@ -114,6 +120,7 @@ install-protobuf-plugins: @go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@v1.11.0 @go install google.golang.org/protobuf/cmd/protoc-gen-go@latest @go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest + @go install github.com/kyleconroy/sqlc/cmd/sqlc@latest help: @echo "make: make" diff --git a/go.mod b/go.mod index 61fe1d1e..f34147b2 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.4.2 github.com/golang-migrate/migrate/v4 v4.15.2 github.com/huaweicloud/huaweicloud-sdk-go-obs v3.21.12+incompatible + github.com/jackc/pgx/v5 v5.2.0 github.com/json-iterator/go v1.1.12 github.com/meilisearch/meilisearch-go v0.21.0 github.com/minio/minio-go/v7 v7.0.45 @@ -108,9 +109,9 @@ require ( github.com/ugorji/go/codec v1.2.7 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d // indirect - go.uber.org/atomic v1.9.0 // indirect + go.uber.org/atomic v1.10.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect diff --git a/go.sum b/go.sum index 3a27eb98..a9a9d0aa 100644 --- a/go.sum +++ b/go.sum @@ -888,6 +888,8 @@ github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1r github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y= github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= +github.com/jackc/pgx/v5 v5.2.0 h1:NdPpngX0Y6z6XDFKqmFQaE+bCtkqzvQIOt1wvBlAqs8= +github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -1479,8 +1481,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -1532,8 +1534,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= diff --git a/internal/dao/slonik/ce/ce.go b/internal/dao/slonik/ce/ce.go new file mode 100644 index 00000000..6e3cb6ca --- /dev/null +++ b/internal/dao/slonik/ce/ce.go @@ -0,0 +1,3 @@ +package ce + +//go:generate sqlc generate -x diff --git a/internal/dao/slonik/ce/mysql/city.sql.go b/internal/dao/slonik/ce/mysql/city.sql.go new file mode 100644 index 00000000..75ea6e41 --- /dev/null +++ b/internal/dao/slonik/ce/mysql/city.sql.go @@ -0,0 +1,88 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: city.sql + +package dbr + +import ( + "context" +) + +const createCity = `-- name: CreateCity :exec +INSERT INTO city ( + name, + slug +) VALUES ( + ?, + ? +) +` + +type CreateCityParams struct { + Name string + Slug string +} + +func (q *Queries) CreateCity(ctx context.Context, arg CreateCityParams) error { + _, err := q.exec(ctx, q.createCityStmt, createCity, arg.Name, arg.Slug) + return err +} + +const getCity = `-- name: GetCity :one +SELECT slug, name +FROM city +WHERE slug = ? +` + +func (q *Queries) GetCity(ctx context.Context, slug string) (City, error) { + row := q.queryRow(ctx, q.getCityStmt, 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.query(ctx, q.listCitiesStmt, 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.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateCityName = `-- name: UpdateCityName :exec +UPDATE city +SET name = ? +WHERE slug = ? +` + +type UpdateCityNameParams struct { + Name string + Slug string +} + +func (q *Queries) UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error { + _, err := q.exec(ctx, q.updateCityNameStmt, updateCityName, arg.Name, arg.Slug) + return err +} diff --git a/internal/dao/slonik/ce/mysql/db.go b/internal/dao/slonik/ce/mysql/db.go new file mode 100644 index 00000000..451eb52b --- /dev/null +++ b/internal/dao/slonik/ce/mysql/db.go @@ -0,0 +1,178 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "context" + "database/sql" + "fmt" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +func Prepare(ctx context.Context, db DBTX) (*Queries, error) { + q := Queries{db: db} + var err error + if q.createCityStmt, err = db.PrepareContext(ctx, createCity); err != nil { + return nil, fmt.Errorf("error preparing query CreateCity: %w", err) + } + if q.createVenueStmt, err = db.PrepareContext(ctx, createVenue); err != nil { + return nil, fmt.Errorf("error preparing query CreateVenue: %w", err) + } + if q.deleteVenueStmt, err = db.PrepareContext(ctx, deleteVenue); err != nil { + return nil, fmt.Errorf("error preparing query DeleteVenue: %w", err) + } + if q.getCityStmt, err = db.PrepareContext(ctx, getCity); err != nil { + return nil, fmt.Errorf("error preparing query GetCity: %w", err) + } + if q.getVenueStmt, err = db.PrepareContext(ctx, getVenue); err != nil { + return nil, fmt.Errorf("error preparing query GetVenue: %w", err) + } + if q.listCitiesStmt, err = db.PrepareContext(ctx, listCities); err != nil { + return nil, fmt.Errorf("error preparing query ListCities: %w", err) + } + if q.listVenuesStmt, err = db.PrepareContext(ctx, listVenues); err != nil { + return nil, fmt.Errorf("error preparing query ListVenues: %w", err) + } + if q.updateCityNameStmt, err = db.PrepareContext(ctx, updateCityName); err != nil { + return nil, fmt.Errorf("error preparing query UpdateCityName: %w", err) + } + if q.updateVenueNameStmt, err = db.PrepareContext(ctx, updateVenueName); err != nil { + return nil, fmt.Errorf("error preparing query UpdateVenueName: %w", err) + } + if q.venueCountByCityStmt, err = db.PrepareContext(ctx, venueCountByCity); err != nil { + return nil, fmt.Errorf("error preparing query VenueCountByCity: %w", err) + } + return &q, nil +} + +func (q *Queries) Close() error { + var err error + if q.createCityStmt != nil { + if cerr := q.createCityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createCityStmt: %w", cerr) + } + } + if q.createVenueStmt != nil { + if cerr := q.createVenueStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createVenueStmt: %w", cerr) + } + } + if q.deleteVenueStmt != nil { + if cerr := q.deleteVenueStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteVenueStmt: %w", cerr) + } + } + if q.getCityStmt != nil { + if cerr := q.getCityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getCityStmt: %w", cerr) + } + } + if q.getVenueStmt != nil { + if cerr := q.getVenueStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getVenueStmt: %w", cerr) + } + } + if q.listCitiesStmt != nil { + if cerr := q.listCitiesStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing listCitiesStmt: %w", cerr) + } + } + if q.listVenuesStmt != nil { + if cerr := q.listVenuesStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing listVenuesStmt: %w", cerr) + } + } + if q.updateCityNameStmt != nil { + if cerr := q.updateCityNameStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateCityNameStmt: %w", cerr) + } + } + if q.updateVenueNameStmt != nil { + if cerr := q.updateVenueNameStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateVenueNameStmt: %w", cerr) + } + } + if q.venueCountByCityStmt != nil { + if cerr := q.venueCountByCityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing venueCountByCityStmt: %w", cerr) + } + } + return err +} + +func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) + case stmt != nil: + return stmt.ExecContext(ctx, args...) + default: + return q.db.ExecContext(ctx, query, args...) + } +} + +func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) + case stmt != nil: + return stmt.QueryContext(ctx, args...) + default: + return q.db.QueryContext(ctx, query, args...) + } +} + +func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) + case stmt != nil: + return stmt.QueryRowContext(ctx, args...) + default: + return q.db.QueryRowContext(ctx, query, args...) + } +} + +type Queries struct { + db DBTX + tx *sql.Tx + createCityStmt *sql.Stmt + createVenueStmt *sql.Stmt + deleteVenueStmt *sql.Stmt + getCityStmt *sql.Stmt + getVenueStmt *sql.Stmt + listCitiesStmt *sql.Stmt + listVenuesStmt *sql.Stmt + updateCityNameStmt *sql.Stmt + updateVenueNameStmt *sql.Stmt + venueCountByCityStmt *sql.Stmt +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + tx: tx, + createCityStmt: q.createCityStmt, + createVenueStmt: q.createVenueStmt, + deleteVenueStmt: q.deleteVenueStmt, + getCityStmt: q.getCityStmt, + getVenueStmt: q.getVenueStmt, + listCitiesStmt: q.listCitiesStmt, + listVenuesStmt: q.listVenuesStmt, + updateCityNameStmt: q.updateCityNameStmt, + updateVenueNameStmt: q.updateVenueNameStmt, + venueCountByCityStmt: q.venueCountByCityStmt, + } +} diff --git a/internal/dao/slonik/ce/mysql/models.go b/internal/dao/slonik/ce/mysql/models.go new file mode 100644 index 00000000..d315b7ca --- /dev/null +++ b/internal/dao/slonik/ce/mysql/models.go @@ -0,0 +1,75 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "database/sql" + "database/sql/driver" + "fmt" + "time" +) + +type VenuesStatus string + +const ( + VenuesStatusOpen VenuesStatus = "open" + VenuesStatusClosed VenuesStatus = "closed" +) + +func (e *VenuesStatus) Scan(src interface{}) error { + switch s := src.(type) { + case []byte: + *e = VenuesStatus(s) + case string: + *e = VenuesStatus(s) + default: + return fmt.Errorf("unsupported scan type for VenuesStatus: %T", src) + } + return nil +} + +type NullVenuesStatus struct { + VenuesStatus VenuesStatus + Valid bool // Valid is true if VenuesStatus is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullVenuesStatus) Scan(value interface{}) error { + if value == nil { + ns.VenuesStatus, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.VenuesStatus.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullVenuesStatus) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return string(ns.VenuesStatus), nil +} + +type City struct { + Slug string + Name string +} + +// Venues are places where muisc happens +type Venue struct { + ID int64 + // Venues can be either open or closed + Status VenuesStatus + Statuses sql.NullString + // This value appears in public URLs + Slug string + Name string + City string + SpotifyPlaylist string + SongkickID sql.NullString + Tags sql.NullString + CreatedAt time.Time +} diff --git a/internal/dao/slonik/ce/mysql/querier.go b/internal/dao/slonik/ce/mysql/querier.go new file mode 100644 index 00000000..163269e6 --- /dev/null +++ b/internal/dao/slonik/ce/mysql/querier.go @@ -0,0 +1,25 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "context" + "database/sql" +) + +type Querier interface { + CreateCity(ctx context.Context, arg CreateCityParams) error + CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) + DeleteVenue(ctx context.Context, arg DeleteVenueParams) error + GetCity(ctx context.Context, slug string) (City, error) + GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) + ListCities(ctx context.Context) ([]City, error) + ListVenues(ctx context.Context, city string) ([]Venue, error) + UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error + UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error + VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/dao/slonik/ce/mysql/query/city.sql b/internal/dao/slonik/ce/mysql/query/city.sql new file mode 100644 index 00000000..c387e9d0 --- /dev/null +++ b/internal/dao/slonik/ce/mysql/query/city.sql @@ -0,0 +1,23 @@ +/* name: ListCities :many */ +SELECT * +FROM city +ORDER BY name; + +/* name: GetCity :one */ +SELECT * +FROM city +WHERE slug = ?; + +/* name: CreateCity :exec */ +INSERT INTO city ( + name, + slug +) VALUES ( + ?, + ? +); + +/* name: UpdateCityName :exec */ +UPDATE city +SET name = ? +WHERE slug = ?; diff --git a/internal/dao/slonik/ce/mysql/query/venue.sql b/internal/dao/slonik/ce/mysql/query/venue.sql new file mode 100644 index 00000000..a1dd7a16 --- /dev/null +++ b/internal/dao/slonik/ce/mysql/query/venue.sql @@ -0,0 +1,48 @@ +/* name: ListVenues :many */ +SELECT * +FROM venue +WHERE city = ? +ORDER BY name; + +/* name: DeleteVenue :exec */ +DELETE FROM venue +WHERE slug = ? AND slug = ?; + +/* name: GetVenue :one */ +SELECT * +FROM venue +WHERE slug = ? AND city = ?; + +/* name: CreateVenue :execresult */ +INSERT INTO venue ( + slug, + name, + city, + created_at, + spotify_playlist, + status, + statuses, + tags +) VALUES ( + ?, + ?, + ?, + NOW(), + ?, + ?, + ?, + ? +); + +/* name: UpdateVenueName :exec */ +UPDATE venue +SET name = ? +WHERE slug = ?; + +/* name: VenueCountByCity :many */ +SELECT + city, + count(*) +FROM venue +GROUP BY 1 +ORDER BY 1; diff --git a/internal/dao/slonik/ce/mysql/schema/0001_city.sql b/internal/dao/slonik/ce/mysql/schema/0001_city.sql new file mode 100644 index 00000000..6be35d16 --- /dev/null +++ b/internal/dao/slonik/ce/mysql/schema/0001_city.sql @@ -0,0 +1,4 @@ +CREATE TABLE city ( + slug varchar(255) PRIMARY KEY, + name text NOT NULL +) diff --git a/internal/dao/slonik/ce/mysql/schema/0002_venue.sql b/internal/dao/slonik/ce/mysql/schema/0002_venue.sql new file mode 100644 index 00000000..4fc842ce --- /dev/null +++ b/internal/dao/slonik/ce/mysql/schema/0002_venue.sql @@ -0,0 +1,12 @@ +CREATE TABLE venues ( + id SERIAL primary key, + dropped text, + status ENUM('open', 'closed') not null COMMENT 'Venues can be either open or closed', + statuses text, -- status[], + slug text not null COMMENT 'This value appears in public URLs', + name varchar(255) not null, + city text not null references city(slug), + spotify_playlist varchar(255) not null, + songkick_id text, + tags text -- text[] +) COMMENT='Venues are places where muisc happens'; diff --git a/internal/dao/slonik/ce/mysql/schema/0003_add_column.sql b/internal/dao/slonik/ce/mysql/schema/0003_add_column.sql new file mode 100644 index 00000000..9b334bcc --- /dev/null +++ b/internal/dao/slonik/ce/mysql/schema/0003_add_column.sql @@ -0,0 +1,3 @@ +ALTER TABLE venues RENAME TO venue; +ALTER TABLE venue ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT NOW(); +ALTER TABLE venue DROP COLUMN dropped; diff --git a/internal/dao/slonik/ce/mysql/venue.sql.go b/internal/dao/slonik/ce/mysql/venue.sql.go new file mode 100644 index 00000000..1bc2b0cb --- /dev/null +++ b/internal/dao/slonik/ce/mysql/venue.sql.go @@ -0,0 +1,193 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: venue.sql + +package dbr + +import ( + "context" + "database/sql" +) + +const createVenue = `-- name: CreateVenue :execresult +INSERT INTO venue ( + slug, + name, + city, + created_at, + spotify_playlist, + status, + statuses, + tags +) VALUES ( + ?, + ?, + ?, + NOW(), + ?, + ?, + ?, + ? +) +` + +type CreateVenueParams struct { + Slug string + Name string + City string + SpotifyPlaylist string + Status VenuesStatus + Statuses sql.NullString + Tags sql.NullString +} + +func (q *Queries) CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) { + return q.exec(ctx, q.createVenueStmt, createVenue, + arg.Slug, + arg.Name, + arg.City, + arg.SpotifyPlaylist, + arg.Status, + arg.Statuses, + arg.Tags, + ) +} + +const deleteVenue = `-- name: DeleteVenue :exec +DELETE FROM venue +WHERE slug = ? AND slug = ? +` + +type DeleteVenueParams struct { + Slug string + Slug_2 string +} + +func (q *Queries) DeleteVenue(ctx context.Context, arg DeleteVenueParams) error { + _, err := q.exec(ctx, q.deleteVenueStmt, deleteVenue, arg.Slug, arg.Slug_2) + 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 = ? AND city = ? +` + +type GetVenueParams struct { + Slug string + City string +} + +func (q *Queries) GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) { + row := q.queryRow(ctx, q.getVenueStmt, 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 = ? +ORDER BY name +` + +func (q *Queries) ListVenues(ctx context.Context, city string) ([]Venue, error) { + rows, err := q.query(ctx, q.listVenuesStmt, 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.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateVenueName = `-- name: UpdateVenueName :exec +UPDATE venue +SET name = ? +WHERE slug = ? +` + +type UpdateVenueNameParams struct { + Name string + Slug string +} + +func (q *Queries) UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error { + _, err := q.exec(ctx, q.updateVenueNameStmt, updateVenueName, arg.Name, arg.Slug) + return 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.query(ctx, q.venueCountByCityStmt, 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.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/dao/slonik/ce/postgres/city.sql.go b/internal/dao/slonik/ce/postgres/city.sql.go new file mode 100644 index 00000000..d16ffab9 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/city.sql.go @@ -0,0 +1,90 @@ +// 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 +} diff --git a/internal/dao/slonik/ce/postgres/db.go b/internal/dao/slonik/ce/postgres/db.go new file mode 100644 index 00000000..837fe9df --- /dev/null +++ b/internal/dao/slonik/ce/postgres/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/dao/slonik/ce/postgres/models.go b/internal/dao/slonik/ce/postgres/models.go new file mode 100644 index 00000000..2a099189 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/models.go @@ -0,0 +1,75 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "database/sql/driver" + "fmt" + + "github.com/jackc/pgx/v5/pgtype" +) + +// Venues can be either open or closed +type Status string + +const ( + StatusOpen Status = "op!en" + StatusClosed Status = "clo@sed" +) + +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 +} diff --git a/internal/dao/slonik/ce/postgres/querier.go b/internal/dao/slonik/ce/postgres/querier.go new file mode 100644 index 00000000..5d494697 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/querier.go @@ -0,0 +1,27 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "context" +) + +type Querier interface { + // Create a new city. The slug must be unique. + // This is the second line of the comment + // This is the third line + CreateCity(ctx context.Context, arg CreateCityParams) (City, error) + CreateVenue(ctx context.Context, arg CreateVenueParams) (int32, error) + DeleteVenue(ctx context.Context, slug string) error + GetCity(ctx context.Context, slug string) (City, error) + GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) + ListCities(ctx context.Context) ([]City, error) + ListVenues(ctx context.Context, city string) ([]Venue, 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) diff --git a/internal/dao/slonik/ce/postgres/query.sql b/internal/dao/slonik/ce/postgres/query.sql new file mode 100644 index 00000000..33a78434 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/query.sql @@ -0,0 +1,56 @@ +-- name: GetAuthor :one +SELECT * FROM authors +WHERE author_id = $1; + +-- name: DeleteBookExecResult :execresult +DELETE FROM books +WHERE book_id = $1; + +-- name: DeleteBook :batchexec +DELETE FROM books +WHERE book_id = $1; + +-- name: DeleteBookNamedFunc :batchexec +DELETE FROM books +WHERE book_id = sqlc.arg(book_id); + +-- name: DeleteBookNamedSign :batchexec +DELETE FROM books +WHERE book_id = @book_id; + +-- name: BooksByYear :batchmany +SELECT * FROM books +WHERE year = $1; + +-- name: CreateAuthor :one +INSERT INTO authors (name) VALUES ($1) +RETURNING *; + +-- name: CreateBook :batchone +INSERT INTO books ( + author_id, + isbn, + book_type, + title, + year, + available, + tags +) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6, + $7 +) +RETURNING *; + +-- name: UpdateBook :batchexec +UPDATE books +SET title = $1, tags = $2 +WHERE book_id = $3; + +-- name: GetBiography :batchone +SELECT biography FROM authors +WHERE author_id = $1; diff --git a/internal/dao/slonik/ce/postgres/query/city.sql b/internal/dao/slonik/ce/postgres/query/city.sql new file mode 100644 index 00000000..f34dc996 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/query/city.sql @@ -0,0 +1,26 @@ +-- 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; diff --git a/internal/dao/slonik/ce/postgres/query/venue.sql b/internal/dao/slonik/ce/postgres/query/venue.sql new file mode 100644 index 00000000..8c6bd026 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/query/venue.sql @@ -0,0 +1,49 @@ +-- 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; diff --git a/internal/dao/slonik/ce/postgres/schema.sql b/internal/dao/slonik/ce/postgres/schema.sql new file mode 100644 index 00000000..b79f773f --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema.sql @@ -0,0 +1,21 @@ +CREATE TABLE authors ( + author_id SERIAL PRIMARY KEY, + name text NOT NULL DEFAULT '', + biography JSONB +); + +CREATE TYPE book_type AS ENUM ( + 'FICTION', + 'NONFICTION' +); + +CREATE TABLE books ( + book_id SERIAL PRIMARY KEY, + author_id integer NOT NULL REFERENCES authors(author_id), + isbn text NOT NULL DEFAULT '' UNIQUE, + book_type book_type NOT NULL DEFAULT 'FICTION', + title text NOT NULL DEFAULT '', + year integer NOT NULL DEFAULT 2000, + available timestamp with time zone NOT NULL DEFAULT 'NOW()', + tags varchar[] NOT NULL DEFAULT '{}' +); diff --git a/internal/dao/slonik/ce/postgres/schema/0001_city.sql b/internal/dao/slonik/ce/postgres/schema/0001_city.sql new file mode 100644 index 00000000..af38f16b --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0001_city.sql @@ -0,0 +1,4 @@ +CREATE TABLE city ( + slug text PRIMARY KEY, + name text NOT NULL +) diff --git a/internal/dao/slonik/ce/postgres/schema/0002_venue.sql b/internal/dao/slonik/ce/postgres/schema/0002_venue.sql new file mode 100644 index 00000000..940de7a5 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0002_venue.sql @@ -0,0 +1,18 @@ +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'; + diff --git a/internal/dao/slonik/ce/postgres/schema/0003_add_column.sql b/internal/dao/slonik/ce/postgres/schema/0003_add_column.sql new file mode 100644 index 00000000..9b334bcc --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0003_add_column.sql @@ -0,0 +1,3 @@ +ALTER TABLE venues RENAME TO venue; +ALTER TABLE venue ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT NOW(); +ALTER TABLE venue DROP COLUMN dropped; diff --git a/internal/dao/slonik/ce/postgres/venue.sql.go b/internal/dao/slonik/ce/postgres/venue.sql.go new file mode 100644 index 00000000..384701a2 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/venue.sql.go @@ -0,0 +1,189 @@ +// 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 +} diff --git a/internal/dao/slonik/ce/sqlc.yaml b/internal/dao/slonik/ce/sqlc.yaml new file mode 100644 index 00000000..dd0d6bfa --- /dev/null +++ b/internal/dao/slonik/ce/sqlc.yaml @@ -0,0 +1,30 @@ +version: '2' +sql: + - schema: postgres/schema + queries: postgres/query + engine: postgresql + gen: + go: + package: dbr + out: postgres + sql_package: 'pgx/v5' + emit_prepared_queries: true + emit_interface: true + - schema: mysql/schema + queries: mysql/query + engine: mysql + gen: + go: + package: dbr + out: mysql + emit_prepared_queries: true + emit_interface: true + - schema: sqlite/schema + queries: sqlite/query + engine: sqlite + gen: + go: + package: dbr + out: sqlite + emit_prepared_queries: true + emit_interface: true diff --git a/internal/dao/slonik/ce/sqlite/city.sql.go b/internal/dao/slonik/ce/sqlite/city.sql.go new file mode 100644 index 00000000..75ea6e41 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/city.sql.go @@ -0,0 +1,88 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: city.sql + +package dbr + +import ( + "context" +) + +const createCity = `-- name: CreateCity :exec +INSERT INTO city ( + name, + slug +) VALUES ( + ?, + ? +) +` + +type CreateCityParams struct { + Name string + Slug string +} + +func (q *Queries) CreateCity(ctx context.Context, arg CreateCityParams) error { + _, err := q.exec(ctx, q.createCityStmt, createCity, arg.Name, arg.Slug) + return err +} + +const getCity = `-- name: GetCity :one +SELECT slug, name +FROM city +WHERE slug = ? +` + +func (q *Queries) GetCity(ctx context.Context, slug string) (City, error) { + row := q.queryRow(ctx, q.getCityStmt, 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.query(ctx, q.listCitiesStmt, 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.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateCityName = `-- name: UpdateCityName :exec +UPDATE city +SET name = ? +WHERE slug = ? +` + +type UpdateCityNameParams struct { + Name string + Slug string +} + +func (q *Queries) UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error { + _, err := q.exec(ctx, q.updateCityNameStmt, updateCityName, arg.Name, arg.Slug) + return err +} diff --git a/internal/dao/slonik/ce/sqlite/db.go b/internal/dao/slonik/ce/sqlite/db.go new file mode 100644 index 00000000..451eb52b --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/db.go @@ -0,0 +1,178 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "context" + "database/sql" + "fmt" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +func Prepare(ctx context.Context, db DBTX) (*Queries, error) { + q := Queries{db: db} + var err error + if q.createCityStmt, err = db.PrepareContext(ctx, createCity); err != nil { + return nil, fmt.Errorf("error preparing query CreateCity: %w", err) + } + if q.createVenueStmt, err = db.PrepareContext(ctx, createVenue); err != nil { + return nil, fmt.Errorf("error preparing query CreateVenue: %w", err) + } + if q.deleteVenueStmt, err = db.PrepareContext(ctx, deleteVenue); err != nil { + return nil, fmt.Errorf("error preparing query DeleteVenue: %w", err) + } + if q.getCityStmt, err = db.PrepareContext(ctx, getCity); err != nil { + return nil, fmt.Errorf("error preparing query GetCity: %w", err) + } + if q.getVenueStmt, err = db.PrepareContext(ctx, getVenue); err != nil { + return nil, fmt.Errorf("error preparing query GetVenue: %w", err) + } + if q.listCitiesStmt, err = db.PrepareContext(ctx, listCities); err != nil { + return nil, fmt.Errorf("error preparing query ListCities: %w", err) + } + if q.listVenuesStmt, err = db.PrepareContext(ctx, listVenues); err != nil { + return nil, fmt.Errorf("error preparing query ListVenues: %w", err) + } + if q.updateCityNameStmt, err = db.PrepareContext(ctx, updateCityName); err != nil { + return nil, fmt.Errorf("error preparing query UpdateCityName: %w", err) + } + if q.updateVenueNameStmt, err = db.PrepareContext(ctx, updateVenueName); err != nil { + return nil, fmt.Errorf("error preparing query UpdateVenueName: %w", err) + } + if q.venueCountByCityStmt, err = db.PrepareContext(ctx, venueCountByCity); err != nil { + return nil, fmt.Errorf("error preparing query VenueCountByCity: %w", err) + } + return &q, nil +} + +func (q *Queries) Close() error { + var err error + if q.createCityStmt != nil { + if cerr := q.createCityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createCityStmt: %w", cerr) + } + } + if q.createVenueStmt != nil { + if cerr := q.createVenueStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing createVenueStmt: %w", cerr) + } + } + if q.deleteVenueStmt != nil { + if cerr := q.deleteVenueStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteVenueStmt: %w", cerr) + } + } + if q.getCityStmt != nil { + if cerr := q.getCityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getCityStmt: %w", cerr) + } + } + if q.getVenueStmt != nil { + if cerr := q.getVenueStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getVenueStmt: %w", cerr) + } + } + if q.listCitiesStmt != nil { + if cerr := q.listCitiesStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing listCitiesStmt: %w", cerr) + } + } + if q.listVenuesStmt != nil { + if cerr := q.listVenuesStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing listVenuesStmt: %w", cerr) + } + } + if q.updateCityNameStmt != nil { + if cerr := q.updateCityNameStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateCityNameStmt: %w", cerr) + } + } + if q.updateVenueNameStmt != nil { + if cerr := q.updateVenueNameStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing updateVenueNameStmt: %w", cerr) + } + } + if q.venueCountByCityStmt != nil { + if cerr := q.venueCountByCityStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing venueCountByCityStmt: %w", cerr) + } + } + return err +} + +func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) + case stmt != nil: + return stmt.ExecContext(ctx, args...) + default: + return q.db.ExecContext(ctx, query, args...) + } +} + +func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) + case stmt != nil: + return stmt.QueryContext(ctx, args...) + default: + return q.db.QueryContext(ctx, query, args...) + } +} + +func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) + case stmt != nil: + return stmt.QueryRowContext(ctx, args...) + default: + return q.db.QueryRowContext(ctx, query, args...) + } +} + +type Queries struct { + db DBTX + tx *sql.Tx + createCityStmt *sql.Stmt + createVenueStmt *sql.Stmt + deleteVenueStmt *sql.Stmt + getCityStmt *sql.Stmt + getVenueStmt *sql.Stmt + listCitiesStmt *sql.Stmt + listVenuesStmt *sql.Stmt + updateCityNameStmt *sql.Stmt + updateVenueNameStmt *sql.Stmt + venueCountByCityStmt *sql.Stmt +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + tx: tx, + createCityStmt: q.createCityStmt, + createVenueStmt: q.createVenueStmt, + deleteVenueStmt: q.deleteVenueStmt, + getCityStmt: q.getCityStmt, + getVenueStmt: q.getVenueStmt, + listCitiesStmt: q.listCitiesStmt, + listVenuesStmt: q.listVenuesStmt, + updateCityNameStmt: q.updateCityNameStmt, + updateVenueNameStmt: q.updateVenueNameStmt, + venueCountByCityStmt: q.venueCountByCityStmt, + } +} diff --git a/internal/dao/slonik/ce/sqlite/models.go b/internal/dao/slonik/ce/sqlite/models.go new file mode 100644 index 00000000..a178d14a --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/models.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "database/sql" + "time" +) + +type City struct { + Slug string + Name string +} + +type Venue struct { + ID int64 + Status string + Statuses sql.NullString + Slug string + Name string + City string + SpotifyPlaylist string + SongkickID sql.NullString + Tags sql.NullString + CreatedAt time.Time +} diff --git a/internal/dao/slonik/ce/sqlite/querier.go b/internal/dao/slonik/ce/sqlite/querier.go new file mode 100644 index 00000000..163269e6 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/querier.go @@ -0,0 +1,25 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package dbr + +import ( + "context" + "database/sql" +) + +type Querier interface { + CreateCity(ctx context.Context, arg CreateCityParams) error + CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) + DeleteVenue(ctx context.Context, arg DeleteVenueParams) error + GetCity(ctx context.Context, slug string) (City, error) + GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) + ListCities(ctx context.Context) ([]City, error) + ListVenues(ctx context.Context, city string) ([]Venue, error) + UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error + UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error + VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/dao/slonik/ce/sqlite/query/city.sql b/internal/dao/slonik/ce/sqlite/query/city.sql new file mode 100644 index 00000000..c387e9d0 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/query/city.sql @@ -0,0 +1,23 @@ +/* name: ListCities :many */ +SELECT * +FROM city +ORDER BY name; + +/* name: GetCity :one */ +SELECT * +FROM city +WHERE slug = ?; + +/* name: CreateCity :exec */ +INSERT INTO city ( + name, + slug +) VALUES ( + ?, + ? +); + +/* name: UpdateCityName :exec */ +UPDATE city +SET name = ? +WHERE slug = ?; diff --git a/internal/dao/slonik/ce/sqlite/query/venue.sql b/internal/dao/slonik/ce/sqlite/query/venue.sql new file mode 100644 index 00000000..b4f5fd40 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/query/venue.sql @@ -0,0 +1,48 @@ +/* name: ListVenues :many */ +SELECT * +FROM venue +WHERE city = ? +ORDER BY name; + +/* name: DeleteVenue :exec */ +DELETE FROM venue +WHERE slug = ? AND slug = ?; + +/* name: GetVenue :one */ +SELECT * +FROM venue +WHERE slug = ? AND city = ?; + +/* name: CreateVenue :execresult */ +INSERT INTO venue ( + slug, + name, + city, + created_at, + spotify_playlist, + status, + statuses, + tags +) VALUES ( + ?, + ?, + ?, + CURRENT_TIMESTAMP, + ?, + ?, + ?, + ? +); + +/* name: UpdateVenueName :exec */ +UPDATE venue +SET name = ? +WHERE slug = ?; + +/* name: VenueCountByCity :many */ +SELECT + city, + count(*) +FROM venue +GROUP BY 1 +ORDER BY 1; diff --git a/internal/dao/slonik/ce/sqlite/schema/0001_city.sql b/internal/dao/slonik/ce/sqlite/schema/0001_city.sql new file mode 100644 index 00000000..6be35d16 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/schema/0001_city.sql @@ -0,0 +1,4 @@ +CREATE TABLE city ( + slug varchar(255) PRIMARY KEY, + name text NOT NULL +) diff --git a/internal/dao/slonik/ce/sqlite/schema/0002_venue.sql b/internal/dao/slonik/ce/sqlite/schema/0002_venue.sql new file mode 100644 index 00000000..e57166e4 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/schema/0002_venue.sql @@ -0,0 +1,13 @@ +CREATE TABLE venues ( + id integer primary key AUTOINCREMENT, + dropped text, + status text not null, + statuses text, -- status[] + slug text not null, + name varchar(255) not null, + city text not null references city(slug), + spotify_playlist varchar(255) not null, + songkick_id text, + tags text, -- tags[] + CHECK (status = 'open' OR status = 'closed') +); diff --git a/internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql b/internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql new file mode 100644 index 00000000..7d7a6443 --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql @@ -0,0 +1,3 @@ +ALTER TABLE venues RENAME TO venue; +ALTER TABLE venue ADD COLUMN created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; +ALTER TABLE venue DROP COLUMN dropped; diff --git a/internal/dao/slonik/ce/sqlite/venue.sql.go b/internal/dao/slonik/ce/sqlite/venue.sql.go new file mode 100644 index 00000000..273a4caa --- /dev/null +++ b/internal/dao/slonik/ce/sqlite/venue.sql.go @@ -0,0 +1,193 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: venue.sql + +package dbr + +import ( + "context" + "database/sql" +) + +const createVenue = `-- name: CreateVenue :execresult +INSERT INTO venue ( + slug, + name, + city, + created_at, + spotify_playlist, + status, + statuses, + tags +) VALUES ( + ?, + ?, + ?, + CURRENT_TIMESTAMP, + ?, + ?, + ?, + ? +) +` + +type CreateVenueParams struct { + Slug string + Name string + City string + SpotifyPlaylist string + Status string + Statuses sql.NullString + Tags sql.NullString +} + +func (q *Queries) CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) { + return q.exec(ctx, q.createVenueStmt, createVenue, + arg.Slug, + arg.Name, + arg.City, + arg.SpotifyPlaylist, + arg.Status, + arg.Statuses, + arg.Tags, + ) +} + +const deleteVenue = `-- name: DeleteVenue :exec +DELETE FROM venue +WHERE slug = ? AND slug = ? +` + +type DeleteVenueParams struct { + Slug string + Slug_2 string +} + +func (q *Queries) DeleteVenue(ctx context.Context, arg DeleteVenueParams) error { + _, err := q.exec(ctx, q.deleteVenueStmt, deleteVenue, arg.Slug, arg.Slug_2) + 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 = ? AND city = ? +` + +type GetVenueParams struct { + Slug string + City string +} + +func (q *Queries) GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) { + row := q.queryRow(ctx, q.getVenueStmt, 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 = ? +ORDER BY name +` + +func (q *Queries) ListVenues(ctx context.Context, city string) ([]Venue, error) { + rows, err := q.query(ctx, q.listVenuesStmt, 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.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateVenueName = `-- name: UpdateVenueName :exec +UPDATE venue +SET name = ? +WHERE slug = ? +` + +type UpdateVenueNameParams struct { + Name string + Slug string +} + +func (q *Queries) UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error { + _, err := q.exec(ctx, q.updateVenueNameStmt, updateVenueName, arg.Name, arg.Slug) + return 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.query(ctx, q.venueCountByCityStmt, 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.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} From 95947ae614d7a4f7de2688b07e4e13a950e7eb9c Mon Sep 17 00:00:00 2001 From: Michael Li Date: Thu, 5 Jan 2023 16:07:18 +0800 Subject: [PATCH 02/23] update Makefile --- Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile b/Makefile index d77e1819..4f02957d 100644 --- a/Makefile +++ b/Makefile @@ -113,6 +113,10 @@ test: pre-commit: fmt @go mod tidy + +.PHONY: install-plugins +install-plugins: install-protobuf-plugins install-sqlc-plugins + .PHONY: install-protobuf-plugins install-protobuf-plugins: @go install github.com/bufbuild/buf/cmd/buf@v1.11.0 @@ -120,6 +124,9 @@ install-protobuf-plugins: @go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@v1.11.0 @go install google.golang.org/protobuf/cmd/protoc-gen-go@latest @go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest + +.PHONY: install-sqlc-plugins +install-sqlc-plugins: @go install github.com/kyleconroy/sqlc/cmd/sqlc@latest help: From 41f3cedc8d9eeb8e317f92f90f4efa0c1226a3df Mon Sep 17 00:00:00 2001 From: Michael Li Date: Thu, 5 Jan 2023 17:20:16 +0800 Subject: [PATCH 03/23] sqlc: add all stub interface implement for core.DataService in sqlc feature --- Makefile | 2 +- README.md | 1 + features-status.md | 13 +- internal/conf/db_pgx.go | 29 +++ internal/dao/slonik/authority.go | 58 +++++ internal/dao/slonik/ce/ce.go | 4 + internal/dao/slonik/ce/mysql/city.sql.go | 88 ------- internal/dao/slonik/ce/mysql/db.go | 178 ------------- internal/dao/slonik/ce/mysql/models.go | 75 ------ internal/dao/slonik/ce/mysql/querier.go | 25 -- internal/dao/slonik/ce/mysql/query/city.sql | 23 -- internal/dao/slonik/ce/mysql/query/venue.sql | 48 ---- .../dao/slonik/ce/mysql/schema/0001_city.sql | 4 - .../dao/slonik/ce/mysql/schema/0002_venue.sql | 12 - .../ce/mysql/schema/0003_add_column.sql | 3 - internal/dao/slonik/ce/mysql/venue.sql.go | 193 -------------- internal/dao/slonik/ce/sqlc.yaml | 18 -- internal/dao/slonik/ce/sqlite/city.sql.go | 88 ------- internal/dao/slonik/ce/sqlite/db.go | 178 ------------- internal/dao/slonik/ce/sqlite/models.go | 28 -- internal/dao/slonik/ce/sqlite/querier.go | 25 -- internal/dao/slonik/ce/sqlite/query/city.sql | 23 -- internal/dao/slonik/ce/sqlite/query/venue.sql | 48 ---- .../dao/slonik/ce/sqlite/schema/0001_city.sql | 4 - .../slonik/ce/sqlite/schema/0002_venue.sql | 13 - .../ce/sqlite/schema/0003_add_column.sql | 3 - internal/dao/slonik/ce/sqlite/venue.sql.go | 193 -------------- internal/dao/slonik/comments.go | 107 ++++++++ internal/dao/slonik/contacts.go | 64 +++++ internal/dao/slonik/index.go | 55 ++++ internal/dao/slonik/messages.go | 64 +++++ internal/dao/slonik/pgx.go | 24 ++ internal/dao/slonik/security.go | 49 ++++ internal/dao/slonik/slonik.go | 79 +++++- internal/dao/slonik/topics.go | 52 ++++ internal/dao/slonik/tweets.go | 243 ++++++++++++++++++ internal/dao/slonik/user.go | 76 ++++++ internal/dao/slonik/wallet.go | 63 +++++ 38 files changed, 970 insertions(+), 1283 deletions(-) create mode 100644 internal/conf/db_pgx.go create mode 100644 internal/dao/slonik/authority.go delete mode 100644 internal/dao/slonik/ce/mysql/city.sql.go delete mode 100644 internal/dao/slonik/ce/mysql/db.go delete mode 100644 internal/dao/slonik/ce/mysql/models.go delete mode 100644 internal/dao/slonik/ce/mysql/querier.go delete mode 100644 internal/dao/slonik/ce/mysql/query/city.sql delete mode 100644 internal/dao/slonik/ce/mysql/query/venue.sql delete mode 100644 internal/dao/slonik/ce/mysql/schema/0001_city.sql delete mode 100644 internal/dao/slonik/ce/mysql/schema/0002_venue.sql delete mode 100644 internal/dao/slonik/ce/mysql/schema/0003_add_column.sql delete mode 100644 internal/dao/slonik/ce/mysql/venue.sql.go delete mode 100644 internal/dao/slonik/ce/sqlite/city.sql.go delete mode 100644 internal/dao/slonik/ce/sqlite/db.go delete mode 100644 internal/dao/slonik/ce/sqlite/models.go delete mode 100644 internal/dao/slonik/ce/sqlite/querier.go delete mode 100644 internal/dao/slonik/ce/sqlite/query/city.sql delete mode 100644 internal/dao/slonik/ce/sqlite/query/venue.sql delete mode 100644 internal/dao/slonik/ce/sqlite/schema/0001_city.sql delete mode 100644 internal/dao/slonik/ce/sqlite/schema/0002_venue.sql delete mode 100644 internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql delete mode 100644 internal/dao/slonik/ce/sqlite/venue.sql.go create mode 100644 internal/dao/slonik/comments.go create mode 100644 internal/dao/slonik/contacts.go create mode 100644 internal/dao/slonik/index.go create mode 100644 internal/dao/slonik/messages.go create mode 100644 internal/dao/slonik/pgx.go create mode 100644 internal/dao/slonik/security.go create mode 100644 internal/dao/slonik/topics.go create mode 100644 internal/dao/slonik/tweets.go create mode 100644 internal/dao/slonik/user.go create mode 100644 internal/dao/slonik/wallet.go diff --git a/Makefile b/Makefile index 4f02957d..1808306c 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ gen-grpc: .PHONY: gen-sqlc gen-sqlc: - @find internal/dao/slonik/ce/mysql internal/dao/slonik/ce/postgres internal/dao/slonik/ce/sqlite -name '*.go' -exec rm -f {} + + @find internal/dao/slonik/ce/postgres -name '*.go' -exec rm -f {} + @go generate internal/dao/slonik/ce/ce.go @go fmt ./internal/dao/slonik/ce/... diff --git a/README.md b/README.md index d86d454d..ac2f88c0 100644 --- a/README.md +++ b/README.md @@ -333,6 +333,7 @@ release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,r |`Deprecated:Web` | 子服务 | 稳定 | 开启旧的Web服务| |`Gorm` | 数据库 | 稳定(默认) | 使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Gorm` + `MySQL`组合| |`Sqlx`| 数据库 | WIP | 使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM| +|`Sqlc`| 数据库 | WIP | 使用[sqlc](https://github.com/kyleconroy/sqlc)自动生成ORM代码| |`MySQL`| 数据库 | 稳定(默认) | 使用MySQL作为数据库| |`Postgres`| 数据库 | 稳定 | 使用PostgreSQL作为数据库| |`Sqlite3`| 数据库 | 稳定 | 使用Sqlite3作为数据库| diff --git a/features-status.md b/features-status.md index 8937a2bc..a24f2286 100644 --- a/features-status.md +++ b/features-status.md @@ -47,13 +47,18 @@ * [x] 服务初始化逻辑 #### 数据库: -* `Gorm` + `MySQL`/`Sqlite3`/`PostgreSQL` -使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Grom` + `MySQL`组合(目前状态:稳定,默认,推荐使用); +* `Gorm` + `MySQL`/`Sqlite3`/`PostgreSQL` +使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Grom` + `MySQL`组合(目前状态:稳定,默认,推荐使用) * [ ] 提按文档 * [x] 接口定义 * [x] 业务逻辑实现 -* `Sqlx` + `MySQL`/`PostgreSQL` -使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM(目前状态:WIP); +* `Sqlx` + `MySQL`/`Sqlite3`/`PostgreSQL` +使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM(目前状态:WIP) + * [ ] 提按文档 + * [ ] 接口定义 + * [ ] 业务逻辑实现 +* `Sqlc` + `PostgreSQL` +使用[sqlc](https://github.com/kyleconroy/sqlc)自动生成ORM代码(目前状态:WIP) * [ ] 提按文档 * [ ] 接口定义 * [ ] 业务逻辑实现 diff --git a/internal/conf/db_pgx.go b/internal/conf/db_pgx.go new file mode 100644 index 00000000..23e5984d --- /dev/null +++ b/internal/conf/db_pgx.go @@ -0,0 +1,29 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package conf + +import ( + "context" + "sync" + + "github.com/jackc/pgx/v5" + "github.com/sirupsen/logrus" +) + +var ( + _pgxDB *pgx.Conn + _oncePgx sync.Once +) + +func MustPgxDB() *pgx.Conn { + _oncePgx.Do(func() { + conn, err := pgx.Connect(context.Background(), PostgresSetting.Dsn()) + if err != nil { + logrus.Fatalf("pgx.Connect occurs error: %s", err) + } + _pgxDB = conn + }) + return _pgxDB +} diff --git a/internal/dao/slonik/authority.go b/internal/dao/slonik/authority.go new file mode 100644 index 00000000..b407f7a9 --- /dev/null +++ b/internal/dao/slonik/authority.go @@ -0,0 +1,58 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.AuthorizationManageService = (*authorizationManageServant)(nil) +) + +type authorizationManageServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *authorizationManageServant) IsAllow(user *core.User, action *core.Action) bool { + // TODO + debug.NotImplemented() + return false +} + +func (s *authorizationManageServant) MyFriendSet(userId int64) core.FriendSet { + // TODO + debug.NotImplemented() + return nil +} + +func (s *authorizationManageServant) BeFriendFilter(userId int64) core.FriendFilter { + // TODO + debug.NotImplemented() + return nil +} + +func (s *authorizationManageServant) BeFriendIds(userId int64) ([]int64, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *authorizationManageServant) isFriend(userId int64, friendId int64) bool { + // TODO + debug.NotImplemented() + return false +} + +func newAuthorizationManageService(db *pgx.Conn) core.AuthorizationManageService { + return &authorizationManageServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/ce/ce.go b/internal/dao/slonik/ce/ce.go index 6e3cb6ca..8e6b4e71 100644 --- a/internal/dao/slonik/ce/ce.go +++ b/internal/dao/slonik/ce/ce.go @@ -1,3 +1,7 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package ce //go:generate sqlc generate -x diff --git a/internal/dao/slonik/ce/mysql/city.sql.go b/internal/dao/slonik/ce/mysql/city.sql.go deleted file mode 100644 index 75ea6e41..00000000 --- a/internal/dao/slonik/ce/mysql/city.sql.go +++ /dev/null @@ -1,88 +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 :exec -INSERT INTO city ( - name, - slug -) VALUES ( - ?, - ? -) -` - -type CreateCityParams struct { - Name string - Slug string -} - -func (q *Queries) CreateCity(ctx context.Context, arg CreateCityParams) error { - _, err := q.exec(ctx, q.createCityStmt, createCity, arg.Name, arg.Slug) - return err -} - -const getCity = `-- name: GetCity :one -SELECT slug, name -FROM city -WHERE slug = ? -` - -func (q *Queries) GetCity(ctx context.Context, slug string) (City, error) { - row := q.queryRow(ctx, q.getCityStmt, 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.query(ctx, q.listCitiesStmt, 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.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateCityName = `-- name: UpdateCityName :exec -UPDATE city -SET name = ? -WHERE slug = ? -` - -type UpdateCityNameParams struct { - Name string - Slug string -} - -func (q *Queries) UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error { - _, err := q.exec(ctx, q.updateCityNameStmt, updateCityName, arg.Name, arg.Slug) - return err -} diff --git a/internal/dao/slonik/ce/mysql/db.go b/internal/dao/slonik/ce/mysql/db.go deleted file mode 100644 index 451eb52b..00000000 --- a/internal/dao/slonik/ce/mysql/db.go +++ /dev/null @@ -1,178 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 - -package dbr - -import ( - "context" - "database/sql" - "fmt" -) - -type DBTX interface { - ExecContext(context.Context, string, ...interface{}) (sql.Result, error) - PrepareContext(context.Context, string) (*sql.Stmt, error) - QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) - QueryRowContext(context.Context, string, ...interface{}) *sql.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -func Prepare(ctx context.Context, db DBTX) (*Queries, error) { - q := Queries{db: db} - var err error - if q.createCityStmt, err = db.PrepareContext(ctx, createCity); err != nil { - return nil, fmt.Errorf("error preparing query CreateCity: %w", err) - } - if q.createVenueStmt, err = db.PrepareContext(ctx, createVenue); err != nil { - return nil, fmt.Errorf("error preparing query CreateVenue: %w", err) - } - if q.deleteVenueStmt, err = db.PrepareContext(ctx, deleteVenue); err != nil { - return nil, fmt.Errorf("error preparing query DeleteVenue: %w", err) - } - if q.getCityStmt, err = db.PrepareContext(ctx, getCity); err != nil { - return nil, fmt.Errorf("error preparing query GetCity: %w", err) - } - if q.getVenueStmt, err = db.PrepareContext(ctx, getVenue); err != nil { - return nil, fmt.Errorf("error preparing query GetVenue: %w", err) - } - if q.listCitiesStmt, err = db.PrepareContext(ctx, listCities); err != nil { - return nil, fmt.Errorf("error preparing query ListCities: %w", err) - } - if q.listVenuesStmt, err = db.PrepareContext(ctx, listVenues); err != nil { - return nil, fmt.Errorf("error preparing query ListVenues: %w", err) - } - if q.updateCityNameStmt, err = db.PrepareContext(ctx, updateCityName); err != nil { - return nil, fmt.Errorf("error preparing query UpdateCityName: %w", err) - } - if q.updateVenueNameStmt, err = db.PrepareContext(ctx, updateVenueName); err != nil { - return nil, fmt.Errorf("error preparing query UpdateVenueName: %w", err) - } - if q.venueCountByCityStmt, err = db.PrepareContext(ctx, venueCountByCity); err != nil { - return nil, fmt.Errorf("error preparing query VenueCountByCity: %w", err) - } - return &q, nil -} - -func (q *Queries) Close() error { - var err error - if q.createCityStmt != nil { - if cerr := q.createCityStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing createCityStmt: %w", cerr) - } - } - if q.createVenueStmt != nil { - if cerr := q.createVenueStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing createVenueStmt: %w", cerr) - } - } - if q.deleteVenueStmt != nil { - if cerr := q.deleteVenueStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing deleteVenueStmt: %w", cerr) - } - } - if q.getCityStmt != nil { - if cerr := q.getCityStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getCityStmt: %w", cerr) - } - } - if q.getVenueStmt != nil { - if cerr := q.getVenueStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getVenueStmt: %w", cerr) - } - } - if q.listCitiesStmt != nil { - if cerr := q.listCitiesStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing listCitiesStmt: %w", cerr) - } - } - if q.listVenuesStmt != nil { - if cerr := q.listVenuesStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing listVenuesStmt: %w", cerr) - } - } - if q.updateCityNameStmt != nil { - if cerr := q.updateCityNameStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing updateCityNameStmt: %w", cerr) - } - } - if q.updateVenueNameStmt != nil { - if cerr := q.updateVenueNameStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing updateVenueNameStmt: %w", cerr) - } - } - if q.venueCountByCityStmt != nil { - if cerr := q.venueCountByCityStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing venueCountByCityStmt: %w", cerr) - } - } - return err -} - -func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) - case stmt != nil: - return stmt.ExecContext(ctx, args...) - default: - return q.db.ExecContext(ctx, query, args...) - } -} - -func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) - case stmt != nil: - return stmt.QueryContext(ctx, args...) - default: - return q.db.QueryContext(ctx, query, args...) - } -} - -func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) - case stmt != nil: - return stmt.QueryRowContext(ctx, args...) - default: - return q.db.QueryRowContext(ctx, query, args...) - } -} - -type Queries struct { - db DBTX - tx *sql.Tx - createCityStmt *sql.Stmt - createVenueStmt *sql.Stmt - deleteVenueStmt *sql.Stmt - getCityStmt *sql.Stmt - getVenueStmt *sql.Stmt - listCitiesStmt *sql.Stmt - listVenuesStmt *sql.Stmt - updateCityNameStmt *sql.Stmt - updateVenueNameStmt *sql.Stmt - venueCountByCityStmt *sql.Stmt -} - -func (q *Queries) WithTx(tx *sql.Tx) *Queries { - return &Queries{ - db: tx, - tx: tx, - createCityStmt: q.createCityStmt, - createVenueStmt: q.createVenueStmt, - deleteVenueStmt: q.deleteVenueStmt, - getCityStmt: q.getCityStmt, - getVenueStmt: q.getVenueStmt, - listCitiesStmt: q.listCitiesStmt, - listVenuesStmt: q.listVenuesStmt, - updateCityNameStmt: q.updateCityNameStmt, - updateVenueNameStmt: q.updateVenueNameStmt, - venueCountByCityStmt: q.venueCountByCityStmt, - } -} diff --git a/internal/dao/slonik/ce/mysql/models.go b/internal/dao/slonik/ce/mysql/models.go deleted file mode 100644 index d315b7ca..00000000 --- a/internal/dao/slonik/ce/mysql/models.go +++ /dev/null @@ -1,75 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 - -package dbr - -import ( - "database/sql" - "database/sql/driver" - "fmt" - "time" -) - -type VenuesStatus string - -const ( - VenuesStatusOpen VenuesStatus = "open" - VenuesStatusClosed VenuesStatus = "closed" -) - -func (e *VenuesStatus) Scan(src interface{}) error { - switch s := src.(type) { - case []byte: - *e = VenuesStatus(s) - case string: - *e = VenuesStatus(s) - default: - return fmt.Errorf("unsupported scan type for VenuesStatus: %T", src) - } - return nil -} - -type NullVenuesStatus struct { - VenuesStatus VenuesStatus - Valid bool // Valid is true if VenuesStatus is not NULL -} - -// Scan implements the Scanner interface. -func (ns *NullVenuesStatus) Scan(value interface{}) error { - if value == nil { - ns.VenuesStatus, ns.Valid = "", false - return nil - } - ns.Valid = true - return ns.VenuesStatus.Scan(value) -} - -// Value implements the driver Valuer interface. -func (ns NullVenuesStatus) Value() (driver.Value, error) { - if !ns.Valid { - return nil, nil - } - return string(ns.VenuesStatus), nil -} - -type City struct { - Slug string - Name string -} - -// Venues are places where muisc happens -type Venue struct { - ID int64 - // Venues can be either open or closed - Status VenuesStatus - Statuses sql.NullString - // This value appears in public URLs - Slug string - Name string - City string - SpotifyPlaylist string - SongkickID sql.NullString - Tags sql.NullString - CreatedAt time.Time -} diff --git a/internal/dao/slonik/ce/mysql/querier.go b/internal/dao/slonik/ce/mysql/querier.go deleted file mode 100644 index 163269e6..00000000 --- a/internal/dao/slonik/ce/mysql/querier.go +++ /dev/null @@ -1,25 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 - -package dbr - -import ( - "context" - "database/sql" -) - -type Querier interface { - CreateCity(ctx context.Context, arg CreateCityParams) error - CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) - DeleteVenue(ctx context.Context, arg DeleteVenueParams) error - GetCity(ctx context.Context, slug string) (City, error) - GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) - ListCities(ctx context.Context) ([]City, error) - ListVenues(ctx context.Context, city string) ([]Venue, error) - UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error - UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error - VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error) -} - -var _ Querier = (*Queries)(nil) diff --git a/internal/dao/slonik/ce/mysql/query/city.sql b/internal/dao/slonik/ce/mysql/query/city.sql deleted file mode 100644 index c387e9d0..00000000 --- a/internal/dao/slonik/ce/mysql/query/city.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* name: ListCities :many */ -SELECT * -FROM city -ORDER BY name; - -/* name: GetCity :one */ -SELECT * -FROM city -WHERE slug = ?; - -/* name: CreateCity :exec */ -INSERT INTO city ( - name, - slug -) VALUES ( - ?, - ? -); - -/* name: UpdateCityName :exec */ -UPDATE city -SET name = ? -WHERE slug = ?; diff --git a/internal/dao/slonik/ce/mysql/query/venue.sql b/internal/dao/slonik/ce/mysql/query/venue.sql deleted file mode 100644 index a1dd7a16..00000000 --- a/internal/dao/slonik/ce/mysql/query/venue.sql +++ /dev/null @@ -1,48 +0,0 @@ -/* name: ListVenues :many */ -SELECT * -FROM venue -WHERE city = ? -ORDER BY name; - -/* name: DeleteVenue :exec */ -DELETE FROM venue -WHERE slug = ? AND slug = ?; - -/* name: GetVenue :one */ -SELECT * -FROM venue -WHERE slug = ? AND city = ?; - -/* name: CreateVenue :execresult */ -INSERT INTO venue ( - slug, - name, - city, - created_at, - spotify_playlist, - status, - statuses, - tags -) VALUES ( - ?, - ?, - ?, - NOW(), - ?, - ?, - ?, - ? -); - -/* name: UpdateVenueName :exec */ -UPDATE venue -SET name = ? -WHERE slug = ?; - -/* name: VenueCountByCity :many */ -SELECT - city, - count(*) -FROM venue -GROUP BY 1 -ORDER BY 1; diff --git a/internal/dao/slonik/ce/mysql/schema/0001_city.sql b/internal/dao/slonik/ce/mysql/schema/0001_city.sql deleted file mode 100644 index 6be35d16..00000000 --- a/internal/dao/slonik/ce/mysql/schema/0001_city.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE city ( - slug varchar(255) PRIMARY KEY, - name text NOT NULL -) diff --git a/internal/dao/slonik/ce/mysql/schema/0002_venue.sql b/internal/dao/slonik/ce/mysql/schema/0002_venue.sql deleted file mode 100644 index 4fc842ce..00000000 --- a/internal/dao/slonik/ce/mysql/schema/0002_venue.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE TABLE venues ( - id SERIAL primary key, - dropped text, - status ENUM('open', 'closed') not null COMMENT 'Venues can be either open or closed', - statuses text, -- status[], - slug text not null COMMENT 'This value appears in public URLs', - name varchar(255) not null, - city text not null references city(slug), - spotify_playlist varchar(255) not null, - songkick_id text, - tags text -- text[] -) COMMENT='Venues are places where muisc happens'; diff --git a/internal/dao/slonik/ce/mysql/schema/0003_add_column.sql b/internal/dao/slonik/ce/mysql/schema/0003_add_column.sql deleted file mode 100644 index 9b334bcc..00000000 --- a/internal/dao/slonik/ce/mysql/schema/0003_add_column.sql +++ /dev/null @@ -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; diff --git a/internal/dao/slonik/ce/mysql/venue.sql.go b/internal/dao/slonik/ce/mysql/venue.sql.go deleted file mode 100644 index 1bc2b0cb..00000000 --- a/internal/dao/slonik/ce/mysql/venue.sql.go +++ /dev/null @@ -1,193 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 -// source: venue.sql - -package dbr - -import ( - "context" - "database/sql" -) - -const createVenue = `-- name: CreateVenue :execresult -INSERT INTO venue ( - slug, - name, - city, - created_at, - spotify_playlist, - status, - statuses, - tags -) VALUES ( - ?, - ?, - ?, - NOW(), - ?, - ?, - ?, - ? -) -` - -type CreateVenueParams struct { - Slug string - Name string - City string - SpotifyPlaylist string - Status VenuesStatus - Statuses sql.NullString - Tags sql.NullString -} - -func (q *Queries) CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) { - return q.exec(ctx, q.createVenueStmt, createVenue, - arg.Slug, - arg.Name, - arg.City, - arg.SpotifyPlaylist, - arg.Status, - arg.Statuses, - arg.Tags, - ) -} - -const deleteVenue = `-- name: DeleteVenue :exec -DELETE FROM venue -WHERE slug = ? AND slug = ? -` - -type DeleteVenueParams struct { - Slug string - Slug_2 string -} - -func (q *Queries) DeleteVenue(ctx context.Context, arg DeleteVenueParams) error { - _, err := q.exec(ctx, q.deleteVenueStmt, deleteVenue, arg.Slug, arg.Slug_2) - 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 = ? AND city = ? -` - -type GetVenueParams struct { - Slug string - City string -} - -func (q *Queries) GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) { - row := q.queryRow(ctx, q.getVenueStmt, 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 = ? -ORDER BY name -` - -func (q *Queries) ListVenues(ctx context.Context, city string) ([]Venue, error) { - rows, err := q.query(ctx, q.listVenuesStmt, 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.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateVenueName = `-- name: UpdateVenueName :exec -UPDATE venue -SET name = ? -WHERE slug = ? -` - -type UpdateVenueNameParams struct { - Name string - Slug string -} - -func (q *Queries) UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error { - _, err := q.exec(ctx, q.updateVenueNameStmt, updateVenueName, arg.Name, arg.Slug) - return 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.query(ctx, q.venueCountByCityStmt, 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.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/dao/slonik/ce/sqlc.yaml b/internal/dao/slonik/ce/sqlc.yaml index dd0d6bfa..230f8cb4 100644 --- a/internal/dao/slonik/ce/sqlc.yaml +++ b/internal/dao/slonik/ce/sqlc.yaml @@ -10,21 +10,3 @@ sql: sql_package: 'pgx/v5' emit_prepared_queries: true emit_interface: true - - schema: mysql/schema - queries: mysql/query - engine: mysql - gen: - go: - package: dbr - out: mysql - emit_prepared_queries: true - emit_interface: true - - schema: sqlite/schema - queries: sqlite/query - engine: sqlite - gen: - go: - package: dbr - out: sqlite - emit_prepared_queries: true - emit_interface: true diff --git a/internal/dao/slonik/ce/sqlite/city.sql.go b/internal/dao/slonik/ce/sqlite/city.sql.go deleted file mode 100644 index 75ea6e41..00000000 --- a/internal/dao/slonik/ce/sqlite/city.sql.go +++ /dev/null @@ -1,88 +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 :exec -INSERT INTO city ( - name, - slug -) VALUES ( - ?, - ? -) -` - -type CreateCityParams struct { - Name string - Slug string -} - -func (q *Queries) CreateCity(ctx context.Context, arg CreateCityParams) error { - _, err := q.exec(ctx, q.createCityStmt, createCity, arg.Name, arg.Slug) - return err -} - -const getCity = `-- name: GetCity :one -SELECT slug, name -FROM city -WHERE slug = ? -` - -func (q *Queries) GetCity(ctx context.Context, slug string) (City, error) { - row := q.queryRow(ctx, q.getCityStmt, 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.query(ctx, q.listCitiesStmt, 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.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateCityName = `-- name: UpdateCityName :exec -UPDATE city -SET name = ? -WHERE slug = ? -` - -type UpdateCityNameParams struct { - Name string - Slug string -} - -func (q *Queries) UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error { - _, err := q.exec(ctx, q.updateCityNameStmt, updateCityName, arg.Name, arg.Slug) - return err -} diff --git a/internal/dao/slonik/ce/sqlite/db.go b/internal/dao/slonik/ce/sqlite/db.go deleted file mode 100644 index 451eb52b..00000000 --- a/internal/dao/slonik/ce/sqlite/db.go +++ /dev/null @@ -1,178 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 - -package dbr - -import ( - "context" - "database/sql" - "fmt" -) - -type DBTX interface { - ExecContext(context.Context, string, ...interface{}) (sql.Result, error) - PrepareContext(context.Context, string) (*sql.Stmt, error) - QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) - QueryRowContext(context.Context, string, ...interface{}) *sql.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -func Prepare(ctx context.Context, db DBTX) (*Queries, error) { - q := Queries{db: db} - var err error - if q.createCityStmt, err = db.PrepareContext(ctx, createCity); err != nil { - return nil, fmt.Errorf("error preparing query CreateCity: %w", err) - } - if q.createVenueStmt, err = db.PrepareContext(ctx, createVenue); err != nil { - return nil, fmt.Errorf("error preparing query CreateVenue: %w", err) - } - if q.deleteVenueStmt, err = db.PrepareContext(ctx, deleteVenue); err != nil { - return nil, fmt.Errorf("error preparing query DeleteVenue: %w", err) - } - if q.getCityStmt, err = db.PrepareContext(ctx, getCity); err != nil { - return nil, fmt.Errorf("error preparing query GetCity: %w", err) - } - if q.getVenueStmt, err = db.PrepareContext(ctx, getVenue); err != nil { - return nil, fmt.Errorf("error preparing query GetVenue: %w", err) - } - if q.listCitiesStmt, err = db.PrepareContext(ctx, listCities); err != nil { - return nil, fmt.Errorf("error preparing query ListCities: %w", err) - } - if q.listVenuesStmt, err = db.PrepareContext(ctx, listVenues); err != nil { - return nil, fmt.Errorf("error preparing query ListVenues: %w", err) - } - if q.updateCityNameStmt, err = db.PrepareContext(ctx, updateCityName); err != nil { - return nil, fmt.Errorf("error preparing query UpdateCityName: %w", err) - } - if q.updateVenueNameStmt, err = db.PrepareContext(ctx, updateVenueName); err != nil { - return nil, fmt.Errorf("error preparing query UpdateVenueName: %w", err) - } - if q.venueCountByCityStmt, err = db.PrepareContext(ctx, venueCountByCity); err != nil { - return nil, fmt.Errorf("error preparing query VenueCountByCity: %w", err) - } - return &q, nil -} - -func (q *Queries) Close() error { - var err error - if q.createCityStmt != nil { - if cerr := q.createCityStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing createCityStmt: %w", cerr) - } - } - if q.createVenueStmt != nil { - if cerr := q.createVenueStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing createVenueStmt: %w", cerr) - } - } - if q.deleteVenueStmt != nil { - if cerr := q.deleteVenueStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing deleteVenueStmt: %w", cerr) - } - } - if q.getCityStmt != nil { - if cerr := q.getCityStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getCityStmt: %w", cerr) - } - } - if q.getVenueStmt != nil { - if cerr := q.getVenueStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getVenueStmt: %w", cerr) - } - } - if q.listCitiesStmt != nil { - if cerr := q.listCitiesStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing listCitiesStmt: %w", cerr) - } - } - if q.listVenuesStmt != nil { - if cerr := q.listVenuesStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing listVenuesStmt: %w", cerr) - } - } - if q.updateCityNameStmt != nil { - if cerr := q.updateCityNameStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing updateCityNameStmt: %w", cerr) - } - } - if q.updateVenueNameStmt != nil { - if cerr := q.updateVenueNameStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing updateVenueNameStmt: %w", cerr) - } - } - if q.venueCountByCityStmt != nil { - if cerr := q.venueCountByCityStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing venueCountByCityStmt: %w", cerr) - } - } - return err -} - -func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) - case stmt != nil: - return stmt.ExecContext(ctx, args...) - default: - return q.db.ExecContext(ctx, query, args...) - } -} - -func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) - case stmt != nil: - return stmt.QueryContext(ctx, args...) - default: - return q.db.QueryContext(ctx, query, args...) - } -} - -func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) - case stmt != nil: - return stmt.QueryRowContext(ctx, args...) - default: - return q.db.QueryRowContext(ctx, query, args...) - } -} - -type Queries struct { - db DBTX - tx *sql.Tx - createCityStmt *sql.Stmt - createVenueStmt *sql.Stmt - deleteVenueStmt *sql.Stmt - getCityStmt *sql.Stmt - getVenueStmt *sql.Stmt - listCitiesStmt *sql.Stmt - listVenuesStmt *sql.Stmt - updateCityNameStmt *sql.Stmt - updateVenueNameStmt *sql.Stmt - venueCountByCityStmt *sql.Stmt -} - -func (q *Queries) WithTx(tx *sql.Tx) *Queries { - return &Queries{ - db: tx, - tx: tx, - createCityStmt: q.createCityStmt, - createVenueStmt: q.createVenueStmt, - deleteVenueStmt: q.deleteVenueStmt, - getCityStmt: q.getCityStmt, - getVenueStmt: q.getVenueStmt, - listCitiesStmt: q.listCitiesStmt, - listVenuesStmt: q.listVenuesStmt, - updateCityNameStmt: q.updateCityNameStmt, - updateVenueNameStmt: q.updateVenueNameStmt, - venueCountByCityStmt: q.venueCountByCityStmt, - } -} diff --git a/internal/dao/slonik/ce/sqlite/models.go b/internal/dao/slonik/ce/sqlite/models.go deleted file mode 100644 index a178d14a..00000000 --- a/internal/dao/slonik/ce/sqlite/models.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 - -package dbr - -import ( - "database/sql" - "time" -) - -type City struct { - Slug string - Name string -} - -type Venue struct { - ID int64 - Status string - Statuses sql.NullString - Slug string - Name string - City string - SpotifyPlaylist string - SongkickID sql.NullString - Tags sql.NullString - CreatedAt time.Time -} diff --git a/internal/dao/slonik/ce/sqlite/querier.go b/internal/dao/slonik/ce/sqlite/querier.go deleted file mode 100644 index 163269e6..00000000 --- a/internal/dao/slonik/ce/sqlite/querier.go +++ /dev/null @@ -1,25 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 - -package dbr - -import ( - "context" - "database/sql" -) - -type Querier interface { - CreateCity(ctx context.Context, arg CreateCityParams) error - CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) - DeleteVenue(ctx context.Context, arg DeleteVenueParams) error - GetCity(ctx context.Context, slug string) (City, error) - GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) - ListCities(ctx context.Context) ([]City, error) - ListVenues(ctx context.Context, city string) ([]Venue, error) - UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error - UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error - VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error) -} - -var _ Querier = (*Queries)(nil) diff --git a/internal/dao/slonik/ce/sqlite/query/city.sql b/internal/dao/slonik/ce/sqlite/query/city.sql deleted file mode 100644 index c387e9d0..00000000 --- a/internal/dao/slonik/ce/sqlite/query/city.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* name: ListCities :many */ -SELECT * -FROM city -ORDER BY name; - -/* name: GetCity :one */ -SELECT * -FROM city -WHERE slug = ?; - -/* name: CreateCity :exec */ -INSERT INTO city ( - name, - slug -) VALUES ( - ?, - ? -); - -/* name: UpdateCityName :exec */ -UPDATE city -SET name = ? -WHERE slug = ?; diff --git a/internal/dao/slonik/ce/sqlite/query/venue.sql b/internal/dao/slonik/ce/sqlite/query/venue.sql deleted file mode 100644 index b4f5fd40..00000000 --- a/internal/dao/slonik/ce/sqlite/query/venue.sql +++ /dev/null @@ -1,48 +0,0 @@ -/* name: ListVenues :many */ -SELECT * -FROM venue -WHERE city = ? -ORDER BY name; - -/* name: DeleteVenue :exec */ -DELETE FROM venue -WHERE slug = ? AND slug = ?; - -/* name: GetVenue :one */ -SELECT * -FROM venue -WHERE slug = ? AND city = ?; - -/* name: CreateVenue :execresult */ -INSERT INTO venue ( - slug, - name, - city, - created_at, - spotify_playlist, - status, - statuses, - tags -) VALUES ( - ?, - ?, - ?, - CURRENT_TIMESTAMP, - ?, - ?, - ?, - ? -); - -/* name: UpdateVenueName :exec */ -UPDATE venue -SET name = ? -WHERE slug = ?; - -/* name: VenueCountByCity :many */ -SELECT - city, - count(*) -FROM venue -GROUP BY 1 -ORDER BY 1; diff --git a/internal/dao/slonik/ce/sqlite/schema/0001_city.sql b/internal/dao/slonik/ce/sqlite/schema/0001_city.sql deleted file mode 100644 index 6be35d16..00000000 --- a/internal/dao/slonik/ce/sqlite/schema/0001_city.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE city ( - slug varchar(255) PRIMARY KEY, - name text NOT NULL -) diff --git a/internal/dao/slonik/ce/sqlite/schema/0002_venue.sql b/internal/dao/slonik/ce/sqlite/schema/0002_venue.sql deleted file mode 100644 index e57166e4..00000000 --- a/internal/dao/slonik/ce/sqlite/schema/0002_venue.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE venues ( - id integer primary key AUTOINCREMENT, - dropped text, - status text not null, - statuses text, -- status[] - slug text not null, - name varchar(255) not null, - city text not null references city(slug), - spotify_playlist varchar(255) not null, - songkick_id text, - tags text, -- tags[] - CHECK (status = 'open' OR status = 'closed') -); diff --git a/internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql b/internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql deleted file mode 100644 index 7d7a6443..00000000 --- a/internal/dao/slonik/ce/sqlite/schema/0003_add_column.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE venues RENAME TO venue; -ALTER TABLE venue ADD COLUMN created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; -ALTER TABLE venue DROP COLUMN dropped; diff --git a/internal/dao/slonik/ce/sqlite/venue.sql.go b/internal/dao/slonik/ce/sqlite/venue.sql.go deleted file mode 100644 index 273a4caa..00000000 --- a/internal/dao/slonik/ce/sqlite/venue.sql.go +++ /dev/null @@ -1,193 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.16.0 -// source: venue.sql - -package dbr - -import ( - "context" - "database/sql" -) - -const createVenue = `-- name: CreateVenue :execresult -INSERT INTO venue ( - slug, - name, - city, - created_at, - spotify_playlist, - status, - statuses, - tags -) VALUES ( - ?, - ?, - ?, - CURRENT_TIMESTAMP, - ?, - ?, - ?, - ? -) -` - -type CreateVenueParams struct { - Slug string - Name string - City string - SpotifyPlaylist string - Status string - Statuses sql.NullString - Tags sql.NullString -} - -func (q *Queries) CreateVenue(ctx context.Context, arg CreateVenueParams) (sql.Result, error) { - return q.exec(ctx, q.createVenueStmt, createVenue, - arg.Slug, - arg.Name, - arg.City, - arg.SpotifyPlaylist, - arg.Status, - arg.Statuses, - arg.Tags, - ) -} - -const deleteVenue = `-- name: DeleteVenue :exec -DELETE FROM venue -WHERE slug = ? AND slug = ? -` - -type DeleteVenueParams struct { - Slug string - Slug_2 string -} - -func (q *Queries) DeleteVenue(ctx context.Context, arg DeleteVenueParams) error { - _, err := q.exec(ctx, q.deleteVenueStmt, deleteVenue, arg.Slug, arg.Slug_2) - 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 = ? AND city = ? -` - -type GetVenueParams struct { - Slug string - City string -} - -func (q *Queries) GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) { - row := q.queryRow(ctx, q.getVenueStmt, 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 = ? -ORDER BY name -` - -func (q *Queries) ListVenues(ctx context.Context, city string) ([]Venue, error) { - rows, err := q.query(ctx, q.listVenuesStmt, 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.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateVenueName = `-- name: UpdateVenueName :exec -UPDATE venue -SET name = ? -WHERE slug = ? -` - -type UpdateVenueNameParams struct { - Name string - Slug string -} - -func (q *Queries) UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) error { - _, err := q.exec(ctx, q.updateVenueNameStmt, updateVenueName, arg.Name, arg.Slug) - return 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.query(ctx, q.venueCountByCityStmt, 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.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/dao/slonik/comments.go b/internal/dao/slonik/comments.go new file mode 100644 index 00000000..c690dc3b --- /dev/null +++ b/internal/dao/slonik/comments.go @@ -0,0 +1,107 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.CommentService = (*commentServant)(nil) + _ core.CommentManageService = (*commentManageServant)(nil) +) + +type commentServant struct { + db *pgx.Conn + q dbr.Querier +} + +type commentManageServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *commentServant) GetComments(conditions *core.ConditionsT, offset, limit int) ([]*core.Comment, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentServant) GetCommentByID(id int64) (*core.Comment, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentServant) GetCommentReplyByID(id int64) (*core.CommentReply, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentServant) GetCommentCount(conditions *core.ConditionsT) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *commentServant) GetCommentContentsByIDs(ids []int64) ([]*core.CommentContent, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentServant) GetCommentRepliesByID(ids []int64) ([]*core.CommentReplyFormated, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentManageServant) DeleteComment(comment *core.Comment) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *commentManageServant) CreateComment(comment *core.Comment) (*core.Comment, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentManageServant) CreateCommentReply(reply *core.CommentReply) (*core.CommentReply, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *commentManageServant) DeleteCommentReply(reply *core.CommentReply) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *commentManageServant) CreateCommentContent(content *core.CommentContent) (*core.CommentContent, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func newCommentService(db *pgx.Conn) core.CommentService { + return &commentServant{ + db: db, + q: dbr.New(db), + } +} + +func newCommentManageService(db *pgx.Conn) core.CommentManageService { + return &commentManageServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/contacts.go b/internal/dao/slonik/contacts.go new file mode 100644 index 00000000..e725989b --- /dev/null +++ b/internal/dao/slonik/contacts.go @@ -0,0 +1,64 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.ContactManageService = (*contactManageServant)(nil) +) + +type contactManageServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *contactManageServant) RequestingFriend(userId int64, friendId int64, greetings string) (err error) { + // TODO + debug.NotImplemented() + return nil +} + +func (s *contactManageServant) AddFriend(userId int64, friendId int64) (err error) { + // TODO + debug.NotImplemented() + return nil +} + +func (s *contactManageServant) RejectFriend(userId int64, friendId int64) (err error) { + // TODO + debug.NotImplemented() + return nil +} + +func (s *contactManageServant) DeleteFriend(userId int64, friendId int64) (err error) { + // TODO + debug.NotImplemented() + return nil +} + +func (s *contactManageServant) GetContacts(userId int64, offset int, limit int) (*core.ContactList, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *contactManageServant) IsFriend(userId int64, friendId int64) bool { + // TODO + debug.NotImplemented() + return false +} + +func newContactManageService(db *pgx.Conn) core.ContactManageService { + return &contactManageServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/index.go b/internal/dao/slonik/index.go new file mode 100644 index 00000000..3a90fb64 --- /dev/null +++ b/internal/dao/slonik/index.go @@ -0,0 +1,55 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.IndexPostsService = (*indexPostsServant)(nil) + _ core.IndexPostsService = (*simpleIndexPostsServant)(nil) +) + +type indexPostsServant struct { + db *pgx.Conn + q dbr.Querier +} + +type simpleIndexPostsServant struct { + db *pgx.Conn + q dbr.Querier +} + +// IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; +func (s *indexPostsServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +// simpleCacheIndexGetPosts simpleCacheIndex 专属获取广场推文列表函数 +func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func newIndexPostsService(db *pgx.Conn) core.IndexPostsService { + return &indexPostsServant{ + db: db, + q: dbr.New(db), + } +} + +func newSimpleIndexPostsService(db *pgx.Conn) core.IndexPostsService { + return &simpleIndexPostsServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/messages.go b/internal/dao/slonik/messages.go new file mode 100644 index 00000000..635f8eac --- /dev/null +++ b/internal/dao/slonik/messages.go @@ -0,0 +1,64 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.MessageService = (*messageServant)(nil) +) + +type messageServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *messageServant) CreateMessage(msg *core.Message) (*core.Message, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *messageServant) GetUnreadCount(userID int64) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *messageServant) GetMessageByID(id int64) (*core.Message, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *messageServant) ReadMessage(message *core.Message) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *messageServant) GetMessages(conditions *core.ConditionsT, offset, limit int) ([]*core.MessageFormated, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *messageServant) GetMessageCount(conditions *core.ConditionsT) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func newMessageService(db *pgx.Conn) core.MessageService { + return &messageServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go new file mode 100644 index 00000000..a41251a1 --- /dev/null +++ b/internal/dao/slonik/pgx.go @@ -0,0 +1,24 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "sync" + + "github.com/jackc/pgx/v5" + "github.com/rocboss/paopao-ce/internal/conf" +) + +var ( + _pgxDB *pgx.Conn + _oncePgx sync.Once +) + +func pgxDB() *pgx.Conn { + _oncePgx.Do(func() { + _pgxDB = conf.MustPgxDB() + }) + return _pgxDB +} diff --git a/internal/dao/slonik/security.go b/internal/dao/slonik/security.go new file mode 100644 index 00000000..e87a670a --- /dev/null +++ b/internal/dao/slonik/security.go @@ -0,0 +1,49 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.SecurityService = (*securityServant)(nil) +) + +type securityServant struct { + db *pgx.Conn + q dbr.Querier +} + +// GetLatestPhoneCaptcha 获取最新短信验证码 +func (s *securityServant) GetLatestPhoneCaptcha(phone string) (*core.Captcha, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +// UsePhoneCaptcha 更新短信验证码 +func (s *securityServant) UsePhoneCaptcha(captcha *core.Captcha) error { + // TODO + debug.NotImplemented() + return nil +} + +// SendPhoneCaptcha 发送短信验证码 +func (s *securityServant) SendPhoneCaptcha(phone string) error { + // TODO + debug.NotImplemented() + return nil +} + +func newSecurityService(db *pgx.Conn, phoneVerify core.PhoneVerifyService) core.SecurityService { + return &securityServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/slonik.go b/internal/dao/slonik/slonik.go index bb8f82ad..ac2f20d1 100644 --- a/internal/dao/slonik/slonik.go +++ b/internal/dao/slonik/slonik.go @@ -1,23 +1,86 @@ -// Copyright 2022 ROC. All rights reserved. +// Copyright 2023 ROC. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. -// Core service implement base sqlx+postgresql. All sub-service -// will declare here and provide initial function. - package slonik import ( + "github.com/Masterminds/semver/v3" + "github.com/alimy/cfg" "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/dao/cache" + "github.com/rocboss/paopao-ce/internal/dao/security" "github.com/sirupsen/logrus" ) +var ( + _ core.DataService = (*dataServant)(nil) + _ core.VersionInfo = (*dataServant)(nil) +) + +type dataServant struct { + core.IndexPostsService + core.WalletService + core.MessageService + core.TopicService + core.TweetService + core.TweetManageService + core.TweetHelpService + core.CommentService + core.CommentManageService + core.UserManageService + core.ContactManageService + core.SecurityService + core.AttachmentCheckService +} + func NewDataService() (core.DataService, core.VersionInfo) { - logrus.Fatal("not support now") - return nil, nil + // initialize CacheIndex if needed + var ( + c core.CacheIndexService + v core.VersionInfo + ) + db := pgxDB() + pvs := security.NewPhoneVerifyService() + + i := newIndexPostsService(db) + if cfg.If("SimpleCacheIndex") { + i = newSimpleIndexPostsService(db) + c, v = cache.NewSimpleCacheIndexService(i) + } else if cfg.If("BigCacheIndex") { + a := newAuthorizationManageService(db) + c, v = cache.NewBigCacheIndexService(i, a) + } else { + c, v = cache.NewNoneCacheIndexService(i) + } + logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version()) + + ds := &dataServant{ + IndexPostsService: c, + WalletService: newWalletService(db), + MessageService: newMessageService(db), + TopicService: newTopicService(db), + TweetService: newTweetService(db), + TweetManageService: newTweetManageService(db, c), + TweetHelpService: newTweetHelpService(db), + CommentService: newCommentService(db), + CommentManageService: newCommentManageService(db), + UserManageService: newUserManageService(db), + ContactManageService: newContactManageService(db), + SecurityService: newSecurityService(db, pvs), + AttachmentCheckService: security.NewAttachmentCheckService(), + } + return ds, ds } func NewAuthorizationManageService() core.AuthorizationManageService { - logrus.Fatal("not support now") - return nil + return newAuthorizationManageService(pgxDB()) +} + +func (s *dataServant) Name() string { + return "sqlc/pgx" +} + +func (s *dataServant) Version() *semver.Version { + return semver.MustParse("v0.1.0") } diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go new file mode 100644 index 00000000..76e9201a --- /dev/null +++ b/internal/dao/slonik/topics.go @@ -0,0 +1,52 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.TopicService = (*topicServant)(nil) +) + +type topicServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *topicServant) CreateTag(tag *core.Tag) (*core.Tag, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *topicServant) DeleteTag(tag *core.Tag) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *topicServant) GetTags(conditions *core.ConditionsT, offset, limit int) ([]*core.Tag, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *topicServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func newTopicService(db *pgx.Conn) core.TopicService { + return &topicServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/tweets.go b/internal/dao/slonik/tweets.go new file mode 100644 index 00000000..7528ec7f --- /dev/null +++ b/internal/dao/slonik/tweets.go @@ -0,0 +1,243 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" + "gorm.io/gorm" +) + +var ( + _ core.TweetService = (*tweetServant)(nil) + _ core.TweetManageService = (*tweetManageServant)(nil) + _ core.TweetHelpService = (*tweetHelpServant)(nil) +) + +type tweetServant struct { + db *pgx.Conn + q dbr.Querier +} + +type tweetManageServant struct { + db *pgx.Conn + q dbr.Querier +} + +type tweetHelpServant struct { + db *pgx.Conn + q dbr.Querier +} + +// MergePosts post数据整合 +func (s *tweetHelpServant) MergePosts(posts []*core.Post) ([]*core.PostFormated, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +// RevampPosts post数据整形修复 +func (s *tweetHelpServant) RevampPosts(posts []*core.PostFormated) ([]*core.PostFormated, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetHelpServant) getPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetHelpServant) getUsersByIDs(ids []int64) ([]*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) CreatePostCollection(postID, userID int64) (*core.PostCollection, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) DeletePostCollection(p *core.PostCollection) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *tweetManageServant) CreatePostContent(content *core.PostContent) (*core.PostContent, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) CreateAttachment(attachment *core.Attachment) (*core.Attachment, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) CreatePost(post *core.Post) (*core.Post, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) DeletePost(post *core.Post) ([]string, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) deleteCommentByPostId(db *gorm.DB, postId int64) ([]string, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) LockPost(post *core.Post) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *tweetManageServant) StickPost(post *core.Post) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *tweetManageServant) VisiblePost(post *core.Post, visibility core.PostVisibleT) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *tweetManageServant) UpdatePost(post *core.Post) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *tweetManageServant) CreatePostStar(postID, userID int64) (*core.PostStar, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetManageServant) DeletePostStar(p *core.PostStar) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *tweetServant) GetPostByID(id int64) (*core.Post, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetPosts(conditions *core.ConditionsT, offset, limit int) ([]*core.Post, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetPostCount(conditions *core.ConditionsT) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *tweetServant) GetUserPostStar(postID, userID int64) (*core.PostStar, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetUserPostStars(userID int64, offset, limit int) ([]*core.PostStar, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetUserPostStarCount(userID int64) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *tweetServant) GetUserPostCollection(postID, userID int64) (*core.PostCollection, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetUserPostCollections(userID int64, offset, limit int) ([]*core.PostCollection, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetUserPostCollectionCount(userID int64) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *tweetServant) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetUserWalletBillCount(userID int64) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *tweetServant) GetPostAttatchmentBill(postID, userID int64) (*core.PostAttachmentBill, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *tweetServant) GetPostContentByID(id int64) (*core.PostContent, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func newTweetService(db *pgx.Conn) core.TweetService { + return &tweetServant{ + db: db, + q: dbr.New(db), + } +} + +func newTweetManageService(db *pgx.Conn, cacheIndex core.CacheIndexService) core.TweetManageService { + return &tweetManageServant{ + db: db, + q: dbr.New(db), + } +} + +func newTweetHelpService(db *pgx.Conn) core.TweetHelpService { + return &tweetHelpServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/user.go b/internal/dao/slonik/user.go new file mode 100644 index 00000000..71f9806f --- /dev/null +++ b/internal/dao/slonik/user.go @@ -0,0 +1,76 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.UserManageService = (*userManageServant)(nil) +) + +type userManageServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *userManageServant) GetUserByID(id int64) (*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) GetUserByUsername(username string) (*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) GetUserByPhone(phone string) (*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) GetUsersByIDs(ids []int64) ([]*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) GetUsersByKeyword(keyword string) ([]*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) CreateUser(user *core.User) (*core.User, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *userManageServant) UpdateUser(user *core.User) error { + // TODO + debug.NotImplemented() + return nil +} + +func newUserManageService(db *pgx.Conn) core.UserManageService { + return &userManageServant{ + db: db, + q: dbr.New(db), + } +} diff --git a/internal/dao/slonik/wallet.go b/internal/dao/slonik/wallet.go new file mode 100644 index 00000000..4c7da5df --- /dev/null +++ b/internal/dao/slonik/wallet.go @@ -0,0 +1,63 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package slonik + +import ( + "github.com/jackc/pgx/v5" + "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" +) + +var ( + _ core.WalletService = (*walletServant)(nil) +) + +type walletServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *walletServant) GetRechargeByID(id int64) (*core.WalletRecharge, error) { + // TODO + debug.NotImplemented() + return nil, nil +} +func (s *walletServant) CreateRecharge(userId, amount int64) (*core.WalletRecharge, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *walletServant) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { + // TODO + debug.NotImplemented() + return nil, nil +} + +func (s *walletServant) GetUserWalletBillCount(userID int64) (int64, error) { + // TODO + debug.NotImplemented() + return 0, nil +} + +func (s *walletServant) HandleRechargeSuccess(recharge *core.WalletRecharge, tradeNo string) error { + // TODO + debug.NotImplemented() + return nil +} + +func (s *walletServant) HandlePostAttachmentBought(post *core.Post, user *core.User) error { + // TODO + debug.NotImplemented() + return nil +} + +func newWalletService(db *pgx.Conn) core.WalletService { + return &walletServant{ + db: db, + q: dbr.New(db), + } +} From d666b73e83b4150fa781fbedd9bb63291cffaac0 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 7 Jan 2023 18:52:24 +0800 Subject: [PATCH 04/23] sqlc: optimize pgx base servant logic --- internal/dao/slonik/authority.go | 7 ++--- internal/dao/slonik/comments.go | 13 +++----- internal/dao/slonik/contacts.go | 7 ++--- internal/dao/slonik/index.go | 13 +++----- internal/dao/slonik/messages.go | 7 ++--- internal/dao/slonik/pgx.go | 54 ++++++++++++++++++++++++++++++++ internal/dao/slonik/security.go | 7 ++--- internal/dao/slonik/topics.go | 7 ++--- internal/dao/slonik/tweets.go | 19 ++++------- internal/dao/slonik/user.go | 7 ++--- internal/dao/slonik/wallet.go | 7 ++--- 11 files changed, 82 insertions(+), 66 deletions(-) diff --git a/internal/dao/slonik/authority.go b/internal/dao/slonik/authority.go index b407f7a9..cb08e465 100644 --- a/internal/dao/slonik/authority.go +++ b/internal/dao/slonik/authority.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type authorizationManageServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *authorizationManageServant) IsAllow(user *core.User, action *core.Action) bool { @@ -52,7 +50,6 @@ func (s *authorizationManageServant) isFriend(userId int64, friendId int64) bool func newAuthorizationManageService(db *pgx.Conn) core.AuthorizationManageService { return &authorizationManageServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/comments.go b/internal/dao/slonik/comments.go index c690dc3b..d4c0ece8 100644 --- a/internal/dao/slonik/comments.go +++ b/internal/dao/slonik/comments.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -17,13 +16,11 @@ var ( ) type commentServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } type commentManageServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *commentServant) GetComments(conditions *core.ConditionsT, offset, limit int) ([]*core.Comment, error) { @@ -94,14 +91,12 @@ func (s *commentManageServant) CreateCommentContent(content *core.CommentContent func newCommentService(db *pgx.Conn) core.CommentService { return &commentServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } func newCommentManageService(db *pgx.Conn) core.CommentManageService { return &commentManageServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/contacts.go b/internal/dao/slonik/contacts.go index e725989b..a03a9519 100644 --- a/internal/dao/slonik/contacts.go +++ b/internal/dao/slonik/contacts.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type contactManageServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *contactManageServant) RequestingFriend(userId int64, friendId int64, greetings string) (err error) { @@ -58,7 +56,6 @@ func (s *contactManageServant) IsFriend(userId int64, friendId int64) bool { func newContactManageService(db *pgx.Conn) core.ContactManageService { return &contactManageServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/index.go b/internal/dao/slonik/index.go index 3a90fb64..373a54c6 100644 --- a/internal/dao/slonik/index.go +++ b/internal/dao/slonik/index.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -17,13 +16,11 @@ var ( ) type indexPostsServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } type simpleIndexPostsServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; @@ -42,14 +39,12 @@ func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit func newIndexPostsService(db *pgx.Conn) core.IndexPostsService { return &indexPostsServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } func newSimpleIndexPostsService(db *pgx.Conn) core.IndexPostsService { return &simpleIndexPostsServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/messages.go b/internal/dao/slonik/messages.go index 635f8eac..51742aca 100644 --- a/internal/dao/slonik/messages.go +++ b/internal/dao/slonik/messages.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type messageServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *messageServant) CreateMessage(msg *core.Message) (*core.Message, error) { @@ -58,7 +56,6 @@ func (s *messageServant) GetMessageCount(conditions *core.ConditionsT) (int64, e func newMessageService(db *pgx.Conn) core.MessageService { return &messageServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go index a41251a1..d14c5f07 100644 --- a/internal/dao/slonik/pgx.go +++ b/internal/dao/slonik/pgx.go @@ -5,10 +5,12 @@ package slonik import ( + "context" "sync" "github.com/jackc/pgx/v5" "github.com/rocboss/paopao-ce/internal/conf" + dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/ce/postgres" ) var ( @@ -16,6 +18,58 @@ var ( _oncePgx sync.Once ) +type pgxServant struct { + db *pgx.Conn + q dbr.Querier +} + +func (s *pgxServant) begin(ctx context.Context) (pgx.Tx, dbr.Querier, error) { + tx, err := s.db.Begin(ctx) + if err != nil { + return nil, nil, err + } + return tx, dbr.New(tx), nil +} + +func (s *pgxServant) beingTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, dbr.Querier, error) { + tx, err := s.db.BeginTx(ctx, txOptions) + if err != nil { + return nil, nil, err + } + return tx, dbr.New(tx), nil +} + +func (s *pgxServant) with(handle func(dbr.Querier) error) error { + ctx := context.Background() + tx, err := s.db.Begin(ctx) + if err != nil { + return err + } + if err = handle(dbr.New(tx)); err == nil { + return tx.Commit(ctx) + } + return tx.Rollback(ctx) +} + +func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { + ctx := context.Background() + tx, err := s.db.BeginTx(ctx, txOptions) + if err != nil { + return err + } + if err = handle(dbr.New(tx)); err == nil { + return tx.Commit(ctx) + } + return tx.Rollback(ctx) +} + +func newPgxServant(db *pgx.Conn) *pgxServant { + return &pgxServant{ + db: db, + q: dbr.New(db), + } +} + func pgxDB() *pgx.Conn { _oncePgx.Do(func() { _pgxDB = conf.MustPgxDB() diff --git a/internal/dao/slonik/security.go b/internal/dao/slonik/security.go index e87a670a..00281421 100644 --- a/internal/dao/slonik/security.go +++ b/internal/dao/slonik/security.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type securityServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } // GetLatestPhoneCaptcha 获取最新短信验证码 @@ -43,7 +41,6 @@ func (s *securityServant) SendPhoneCaptcha(phone string) error { func newSecurityService(db *pgx.Conn, phoneVerify core.PhoneVerifyService) core.SecurityService { return &securityServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 76e9201a..63f4efa3 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type topicServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *topicServant) CreateTag(tag *core.Tag) (*core.Tag, error) { @@ -46,7 +44,6 @@ func (s *topicServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { func newTopicService(db *pgx.Conn) core.TopicService { return &topicServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/tweets.go b/internal/dao/slonik/tweets.go index 7528ec7f..f07ff198 100644 --- a/internal/dao/slonik/tweets.go +++ b/internal/dao/slonik/tweets.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" "gorm.io/gorm" ) @@ -19,18 +18,15 @@ var ( ) type tweetServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } type tweetManageServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } type tweetHelpServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } // MergePosts post数据整合 @@ -223,21 +219,18 @@ func (s *tweetServant) GetPostContentByID(id int64) (*core.PostContent, error) { func newTweetService(db *pgx.Conn) core.TweetService { return &tweetServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } func newTweetManageService(db *pgx.Conn, cacheIndex core.CacheIndexService) core.TweetManageService { return &tweetManageServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } func newTweetHelpService(db *pgx.Conn) core.TweetHelpService { return &tweetHelpServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/user.go b/internal/dao/slonik/user.go index 71f9806f..94035833 100644 --- a/internal/dao/slonik/user.go +++ b/internal/dao/slonik/user.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type userManageServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *userManageServant) GetUserByID(id int64) (*core.User, error) { @@ -70,7 +68,6 @@ func (s *userManageServant) UpdateUser(user *core.User) error { func newUserManageService(db *pgx.Conn) core.UserManageService { return &userManageServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/wallet.go b/internal/dao/slonik/wallet.go index 4c7da5df..1ef38375 100644 --- a/internal/dao/slonik/wallet.go +++ b/internal/dao/slonik/wallet.go @@ -7,7 +7,6 @@ package slonik import ( "github.com/jackc/pgx/v5" "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" ) @@ -16,8 +15,7 @@ var ( ) type walletServant struct { - db *pgx.Conn - q dbr.Querier + *pgxServant } func (s *walletServant) GetRechargeByID(id int64) (*core.WalletRecharge, error) { @@ -57,7 +55,6 @@ func (s *walletServant) HandlePostAttachmentBought(post *core.Post, user *core.U func newWalletService(db *pgx.Conn) core.WalletService { return &walletServant{ - db: db, - q: dbr.New(db), + pgxServant: newPgxServant(db), } } From 38ffa181e18d4cebbd7c387ffc506848a5def269 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 7 Jan 2023 19:06:17 +0800 Subject: [PATCH 05/23] sqlc: base pgx servant add custom context help method --- internal/dao/slonik/pgx.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go index d14c5f07..3558df0a 100644 --- a/internal/dao/slonik/pgx.go +++ b/internal/dao/slonik/pgx.go @@ -63,6 +63,28 @@ func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(dbr.Querier) er return tx.Rollback(ctx) } +func (s *pgxServant) withCtx(ctx context.Context, handle func(dbr.Querier) error) error { + tx, err := s.db.Begin(ctx) + if err != nil { + return err + } + if err = handle(dbr.New(tx)); err == nil { + return tx.Commit(ctx) + } + return tx.Rollback(ctx) +} + +func (s *pgxServant) withTxCtx(ctx context.Context, txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { + tx, err := s.db.BeginTx(ctx, txOptions) + if err != nil { + return err + } + if err = handle(dbr.New(tx)); err == nil { + return tx.Commit(ctx) + } + return tx.Rollback(ctx) +} + func newPgxServant(db *pgx.Conn) *pgxServant { return &pgxServant{ db: db, From 728966e56ef89237f4dfb20d860c06b6f32bec90 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Mon, 9 Jan 2023 14:55:07 +0800 Subject: [PATCH 06/23] sqlc: adjust index post service stub interface implement --- internal/dao/slonik/index.go | 61 +++++++++++++++++++++++++++++------ internal/dao/slonik/slonik.go | 37 ++++++++++++++------- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/internal/dao/slonik/index.go b/internal/dao/slonik/index.go index 373a54c6..2ae7cf8c 100644 --- a/internal/dao/slonik/index.go +++ b/internal/dao/slonik/index.go @@ -11,40 +11,81 @@ import ( ) var ( - _ core.IndexPostsService = (*indexPostsServant)(nil) + _ core.IndexPostsService = (*friendIndexServant)(nil) + _ core.IndexPostsService = (*followIndexServant)(nil) + _ core.IndexPostsService = (*lightIndexServant)(nil) _ core.IndexPostsService = (*simpleIndexPostsServant)(nil) ) -type indexPostsServant struct { +type friendIndexServant struct { *pgxServant + ams core.AuthorizationManageService + ths core.TweetHelpService +} + +type followIndexServant struct { + *pgxServant + ths core.TweetHelpService +} + +type lightIndexServant struct { + *pgxServant + ths core.TweetHelpService } type simpleIndexPostsServant struct { *pgxServant + ths core.TweetHelpService +} + +// IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; +func (s *friendIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +// IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; +func (s *followIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + // TODO + return nil, debug.ErrNotImplemented } // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; -func (s *indexPostsServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { +func (s *lightIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO - debug.NotImplemented() - return nil, nil + return nil, debug.ErrNotImplemented } // simpleCacheIndexGetPosts simpleCacheIndex 专属获取广场推文列表函数 func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO - debug.NotImplemented() - return nil, nil + return nil, debug.ErrNotImplemented +} + +func newFriendIndexService(db *pgx.Conn, ams core.AuthorizationManageService, ths core.TweetHelpService) core.IndexPostsService { + return &friendIndexServant{ + ams: ams, + pgxServant: newPgxServant(db), + } +} + +func newFollowIndexService(db *pgx.Conn, ths core.TweetHelpService) core.IndexPostsService { + return &followIndexServant{ + ths: ths, + pgxServant: newPgxServant(db), + } } -func newIndexPostsService(db *pgx.Conn) core.IndexPostsService { - return &indexPostsServant{ +func newLightIndexService(db *pgx.Conn, ths core.TweetHelpService) core.IndexPostsService { + return &lightIndexServant{ + ths: ths, pgxServant: newPgxServant(db), } } -func newSimpleIndexPostsService(db *pgx.Conn) core.IndexPostsService { +func newSimpleIndexPostsService(db *pgx.Conn, ths core.TweetHelpService) core.IndexPostsService { return &simpleIndexPostsServant{ + ths: ths, pgxServant: newPgxServant(db), } } diff --git a/internal/dao/slonik/slonik.go b/internal/dao/slonik/slonik.go index ac2f20d1..be7ba004 100644 --- a/internal/dao/slonik/slonik.go +++ b/internal/dao/slonik/slonik.go @@ -35,33 +35,48 @@ type dataServant struct { } func NewDataService() (core.DataService, core.VersionInfo) { - // initialize CacheIndex if needed var ( - c core.CacheIndexService - v core.VersionInfo + v core.VersionInfo + cis core.CacheIndexService + ips core.IndexPostsService ) db := pgxDB() pvs := security.NewPhoneVerifyService() + ams := NewAuthorizationManageService() + ths := newTweetHelpService(db) - i := newIndexPostsService(db) + // initialize core.IndexPostsService + if cfg.If("Friendship") { + ips = newFriendIndexService(db, ams, ths) + } else if cfg.If("Followship") { + ips = newFollowIndexService(db, ths) + } else if cfg.If("Lightship") { + ips = newLightIndexService(db, ths) + } else { + // default use lightship post index service + ips = newLightIndexService(db, ths) + } + + // initialize core.CacheIndexService if cfg.If("SimpleCacheIndex") { - i = newSimpleIndexPostsService(db) - c, v = cache.NewSimpleCacheIndexService(i) + // simpleCache use special post index service + ips = newSimpleIndexPostsService(db, ths) + cis, v = cache.NewSimpleCacheIndexService(ips) } else if cfg.If("BigCacheIndex") { - a := newAuthorizationManageService(db) - c, v = cache.NewBigCacheIndexService(i, a) + // TODO: make cache index post in different scence like friendship/followship/lightship + cis, v = cache.NewBigCacheIndexService(ips, ams) } else { - c, v = cache.NewNoneCacheIndexService(i) + cis, v = cache.NewNoneCacheIndexService(ips) } logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version()) ds := &dataServant{ - IndexPostsService: c, + IndexPostsService: cis, WalletService: newWalletService(db), MessageService: newMessageService(db), TopicService: newTopicService(db), TweetService: newTweetService(db), - TweetManageService: newTweetManageService(db, c), + TweetManageService: newTweetManageService(db, cis), TweetHelpService: newTweetHelpService(db), CommentService: newCommentService(db), CommentManageService: newCommentManageService(db), From b7dfd7e1731015cd04d7cafbc8cba2c99a061d3f Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 4 Feb 2023 11:23:39 +0800 Subject: [PATCH 07/23] sqlc: add migration support for sqlc scene --- internal/dao/slonik/ce/embed.go | 15 ++++++ internal/dao/slonik/ce/postgres/query.sql | 56 ---------------------- internal/dao/slonik/ce/postgres/schema.sql | 21 -------- internal/dao/slonik/topics.go | 6 +-- internal/migration/migration_embed.go | 32 ++++++++----- 5 files changed, 38 insertions(+), 92 deletions(-) create mode 100644 internal/dao/slonik/ce/embed.go delete mode 100644 internal/dao/slonik/ce/postgres/query.sql delete mode 100644 internal/dao/slonik/ce/postgres/schema.sql diff --git a/internal/dao/slonik/ce/embed.go b/internal/dao/slonik/ce/embed.go new file mode 100644 index 00000000..3cd77972 --- /dev/null +++ b/internal/dao/slonik/ce/embed.go @@ -0,0 +1,15 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build migration +// +build migration + +package ce + +import ( + "embed" +) + +//go:embed postgres/schema +var Files embed.FS diff --git a/internal/dao/slonik/ce/postgres/query.sql b/internal/dao/slonik/ce/postgres/query.sql deleted file mode 100644 index 33a78434..00000000 --- a/internal/dao/slonik/ce/postgres/query.sql +++ /dev/null @@ -1,56 +0,0 @@ --- name: GetAuthor :one -SELECT * FROM authors -WHERE author_id = $1; - --- name: DeleteBookExecResult :execresult -DELETE FROM books -WHERE book_id = $1; - --- name: DeleteBook :batchexec -DELETE FROM books -WHERE book_id = $1; - --- name: DeleteBookNamedFunc :batchexec -DELETE FROM books -WHERE book_id = sqlc.arg(book_id); - --- name: DeleteBookNamedSign :batchexec -DELETE FROM books -WHERE book_id = @book_id; - --- name: BooksByYear :batchmany -SELECT * FROM books -WHERE year = $1; - --- name: CreateAuthor :one -INSERT INTO authors (name) VALUES ($1) -RETURNING *; - --- name: CreateBook :batchone -INSERT INTO books ( - author_id, - isbn, - book_type, - title, - year, - available, - tags -) VALUES ( - $1, - $2, - $3, - $4, - $5, - $6, - $7 -) -RETURNING *; - --- name: UpdateBook :batchexec -UPDATE books -SET title = $1, tags = $2 -WHERE book_id = $3; - --- name: GetBiography :batchone -SELECT biography FROM authors -WHERE author_id = $1; diff --git a/internal/dao/slonik/ce/postgres/schema.sql b/internal/dao/slonik/ce/postgres/schema.sql deleted file mode 100644 index b79f773f..00000000 --- a/internal/dao/slonik/ce/postgres/schema.sql +++ /dev/null @@ -1,21 +0,0 @@ -CREATE TABLE authors ( - author_id SERIAL PRIMARY KEY, - name text NOT NULL DEFAULT '', - biography JSONB -); - -CREATE TYPE book_type AS ENUM ( - 'FICTION', - 'NONFICTION' -); - -CREATE TABLE books ( - book_id SERIAL PRIMARY KEY, - author_id integer NOT NULL REFERENCES authors(author_id), - isbn text NOT NULL DEFAULT '' UNIQUE, - book_type book_type NOT NULL DEFAULT 'FICTION', - title text NOT NULL DEFAULT '', - year integer NOT NULL DEFAULT 2000, - available timestamp with time zone NOT NULL DEFAULT 'NOW()', - tags varchar[] NOT NULL DEFAULT '{}' -); diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 63f4efa3..55a1cc31 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -18,19 +18,19 @@ type topicServant struct { *pgxServant } -func (s *topicServant) CreateTag(tag *core.Tag) (*core.Tag, error) { +func (s *topicServant) UpsertTags(userId int64, tags []string) ([]*core.Tag, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *topicServant) DeleteTag(tag *core.Tag) error { +func (s *topicServant) DecrTagsById(ids []int64) error { // TODO debug.NotImplemented() return nil } -func (s *topicServant) GetTags(conditions *core.ConditionsT, offset, limit int) ([]*core.Tag, error) { +func (s *topicServant) GetTags(category core.TagCategory, offset int, limit int) ([]*core.Tag, error) { // TODO debug.NotImplemented() return nil, nil diff --git a/internal/migration/migration_embed.go b/internal/migration/migration_embed.go index c2232d29..4c0949bb 100644 --- a/internal/migration/migration_embed.go +++ b/internal/migration/migration_embed.go @@ -19,6 +19,7 @@ import ( "github.com/golang-migrate/migrate/v4/source" "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/dao/slonik/ce" "github.com/rocboss/paopao-ce/scripts/migration" "github.com/sirupsen/logrus" ) @@ -55,18 +56,25 @@ func Run() { } migrationsTable := conf.DatabaseSetting.TablePrefix + "schema_migrations" - if cfg.If("MySQL") { - srcDriver, err = iofs.New(migration.Files, "mysql") - dbDriver, err2 = mysql.WithInstance(db, &mysql.Config{MigrationsTable: migrationsTable}) - } else if cfg.If("PostgreSQL") || cfg.If("Postgres") { - srcDriver, err = iofs.New(migration.Files, "postgres") - dbDriver, err2 = postgres.WithInstance(db, &postgres.Config{MigrationsTable: migrationsTable}) - } else if cfg.If("Sqlite3") { - srcDriver, err = iofs.New(migration.Files, "sqlite3") - dbDriver, err2 = sqlite3.WithInstance(db, &sqlite3.Config{MigrationsTable: migrationsTable}) - } else { - srcDriver, err = iofs.New(migration.Files, "mysql") - dbDriver, err2 = mysql.WithInstance(db, &mysql.Config{MigrationsTable: migrationsTable}) + if cfg.If("Gorm") || cfg.If("Sqlx") { + if cfg.If("MySQL") { + srcDriver, err = iofs.New(migration.Files, "mysql") + dbDriver, err2 = mysql.WithInstance(db, &mysql.Config{MigrationsTable: migrationsTable}) + } else if cfg.If("PostgreSQL") || cfg.If("Postgres") { + srcDriver, err = iofs.New(migration.Files, "postgres") + dbDriver, err2 = postgres.WithInstance(db, &postgres.Config{MigrationsTable: migrationsTable}) + } else if cfg.If("Sqlite3") { + srcDriver, err = iofs.New(migration.Files, "sqlite3") + dbDriver, err2 = sqlite3.WithInstance(db, &sqlite3.Config{MigrationsTable: migrationsTable}) + } else { + srcDriver, err = iofs.New(migration.Files, "mysql") + dbDriver, err2 = mysql.WithInstance(db, &mysql.Config{MigrationsTable: migrationsTable}) + } + } else if cfg.If("Sqlc") { + if cfg.If("PostgreSQL") || cfg.If("Postgres") { + srcDriver, err = iofs.New(ce.Files, "postgres/schema") + dbDriver, err2 = postgres.WithInstance(db, &postgres.Config{MigrationsTable: migrationsTable}) + } } if err2 != nil { From 75c376b10d5f1ae25f59fc760f40d3709d861277 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 4 Feb 2023 15:14:34 +0800 Subject: [PATCH 08/23] sqlc: optimize transacation process logic --- internal/dao/slonik/pgx.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go index 3558df0a..60a52cf2 100644 --- a/internal/dao/slonik/pgx.go +++ b/internal/dao/slonik/pgx.go @@ -45,10 +45,11 @@ func (s *pgxServant) with(handle func(dbr.Querier) error) error { if err != nil { return err } - if err = handle(dbr.New(tx)); err == nil { - return tx.Commit(ctx) + defer tx.Rollback(ctx) + if err = handle(dbr.New(tx)); err != nil { + return err } - return tx.Rollback(ctx) + return tx.Commit(ctx) } func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { @@ -57,10 +58,11 @@ func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(dbr.Querier) er if err != nil { return err } - if err = handle(dbr.New(tx)); err == nil { - return tx.Commit(ctx) + defer tx.Rollback(ctx) + if err = handle(dbr.New(tx)); err != nil { + return err } - return tx.Rollback(ctx) + return tx.Commit(ctx) } func (s *pgxServant) withCtx(ctx context.Context, handle func(dbr.Querier) error) error { @@ -68,10 +70,11 @@ func (s *pgxServant) withCtx(ctx context.Context, handle func(dbr.Querier) error if err != nil { return err } - if err = handle(dbr.New(tx)); err == nil { - return tx.Commit(ctx) + defer tx.Rollback(ctx) + if err = handle(dbr.New(tx)); err != nil { + return err } - return tx.Rollback(ctx) + return tx.Commit(ctx) } func (s *pgxServant) withTxCtx(ctx context.Context, txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { @@ -79,10 +82,11 @@ func (s *pgxServant) withTxCtx(ctx context.Context, txOptions pgx.TxOptions, han if err != nil { return err } - if err = handle(dbr.New(tx)); err == nil { - return tx.Commit(ctx) + defer tx.Rollback(ctx) + if err = handle(dbr.New(tx)); err != nil { + return err } - return tx.Rollback(ctx) + return tx.Commit(ctx) } func newPgxServant(db *pgx.Conn) *pgxServant { From bfef2fe7f9e86128ddd7d3c9c61c80e0709f9114 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 4 Feb 2023 18:00:44 +0800 Subject: [PATCH 09/23] sqlc: prepare implement topics data logic --- internal/dao/slonik/ce/postgres/city.sql.go | 90 ----- internal/dao/slonik/ce/postgres/models.go | 81 +--- internal/dao/slonik/ce/postgres/querier.go | 25 +- .../dao/slonik/ce/postgres/query/city.sql | 26 -- .../dao/slonik/ce/postgres/query/topic.sql | 58 +++ .../dao/slonik/ce/postgres/query/venue.sql | 49 --- .../slonik/ce/postgres/schema/0001_city.sql | 4 - .../schema/0001_initialize_schema.down.sql | 2 + .../schema/0001_initialize_schema.up.sql | 17 + .../slonik/ce/postgres/schema/0002_venue.sql | 18 - .../ce/postgres/schema/0003_add_column.sql | 3 - internal/dao/slonik/ce/postgres/topic.sql.go | 348 ++++++++++++++++++ internal/dao/slonik/ce/postgres/venue.sql.go | 189 ---------- internal/dao/slonik/ce/sqlc.yaml | 2 + internal/dao/slonik/pgx.go | 8 +- internal/dao/slonik/topics.go | 92 ++++- 16 files changed, 535 insertions(+), 477 deletions(-) delete mode 100644 internal/dao/slonik/ce/postgres/city.sql.go delete mode 100644 internal/dao/slonik/ce/postgres/query/city.sql create mode 100644 internal/dao/slonik/ce/postgres/query/topic.sql delete mode 100644 internal/dao/slonik/ce/postgres/query/venue.sql delete mode 100644 internal/dao/slonik/ce/postgres/schema/0001_city.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql delete mode 100644 internal/dao/slonik/ce/postgres/schema/0002_venue.sql delete mode 100644 internal/dao/slonik/ce/postgres/schema/0003_add_column.sql create mode 100644 internal/dao/slonik/ce/postgres/topic.sql.go delete mode 100644 internal/dao/slonik/ce/postgres/venue.sql.go diff --git a/internal/dao/slonik/ce/postgres/city.sql.go b/internal/dao/slonik/ce/postgres/city.sql.go deleted file mode 100644 index d16ffab9..00000000 --- a/internal/dao/slonik/ce/postgres/city.sql.go +++ /dev/null @@ -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 -} diff --git a/internal/dao/slonik/ce/postgres/models.go b/internal/dao/slonik/ce/postgres/models.go index 2a099189..d50ca7ad 100644 --- a/internal/dao/slonik/ce/postgres/models.go +++ b/internal/dao/slonik/ce/postgres/models.go @@ -4,72 +4,17 @@ package dbr -import ( - "database/sql/driver" - "fmt" - - "github.com/jackc/pgx/v5/pgtype" -) - -// Venues can be either open or closed -type Status string - -const ( - StatusOpen Status = "op!en" - StatusClosed Status = "clo@sed" -) - -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 +import () + +// 主题标签 +type PTag struct { + ID int64 + UserID int64 + Tag string + QuoteNum int64 + CreatedOn int32 + ModifiedOn int32 + DeletedOn int32 + // 是否删除 + IsDel bool } diff --git a/internal/dao/slonik/ce/postgres/querier.go b/internal/dao/slonik/ce/postgres/querier.go index 5d494697..7ba9ef07 100644 --- a/internal/dao/slonik/ce/postgres/querier.go +++ b/internal/dao/slonik/ce/postgres/querier.go @@ -6,22 +6,21 @@ package dbr import ( "context" + + "github.com/jackc/pgx/v5/pgtype" ) type Querier interface { - // Create a new city. The slug must be unique. - // This is the second line of the comment - // This is the third line - CreateCity(ctx context.Context, arg CreateCityParams) (City, error) - CreateVenue(ctx context.Context, arg CreateVenueParams) (int32, error) - DeleteVenue(ctx context.Context, slug string) error - GetCity(ctx context.Context, slug string) (City, error) - GetVenue(ctx context.Context, arg GetVenueParams) (Venue, error) - ListCities(ctx context.Context) ([]City, error) - ListVenues(ctx context.Context, city string) ([]Venue, error) - UpdateCityName(ctx context.Context, arg UpdateCityNameParams) error - UpdateVenueName(ctx context.Context, arg UpdateVenueNameParams) (int32, error) - VenueCountByCity(ctx context.Context) ([]VenueCountByCityRow, error) + DecrTagsById(ctx context.Context, arg *DecrTagsByIdParams) error + HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRow, error) + IncrTagsById(ctx context.Context, arg *IncrTagsByIdParams) error + InsertTags(ctx context.Context, arg *InsertTagsParams) (*InsertTagsRow, error) + NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*NewestTagsRow, error) + TagsByIdA(ctx context.Context, ids pgtype.Array[int64]) ([]int64, error) + TagsByIdB(ctx context.Context, ids pgtype.Array[int64]) ([]*TagsByIdBRow, error) + TagsByKeywordA(ctx context.Context) ([]*TagsByKeywordARow, error) + TagsByKeywordB(ctx context.Context, tag string) ([]*TagsByKeywordBRow, error) + TagsByName(ctx context.Context, tags pgtype.Array[string]) ([]*TagsByNameRow, error) } var _ Querier = (*Queries)(nil) diff --git a/internal/dao/slonik/ce/postgres/query/city.sql b/internal/dao/slonik/ce/postgres/query/city.sql deleted file mode 100644 index f34dc996..00000000 --- a/internal/dao/slonik/ce/postgres/query/city.sql +++ /dev/null @@ -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; diff --git a/internal/dao/slonik/ce/postgres/query/topic.sql b/internal/dao/slonik/ce/postgres/query/topic.sql new file mode 100644 index 00000000..febcdeb6 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/query/topic.sql @@ -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[]); diff --git a/internal/dao/slonik/ce/postgres/query/venue.sql b/internal/dao/slonik/ce/postgres/query/venue.sql deleted file mode 100644 index 8c6bd026..00000000 --- a/internal/dao/slonik/ce/postgres/query/venue.sql +++ /dev/null @@ -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; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_city.sql b/internal/dao/slonik/ce/postgres/schema/0001_city.sql deleted file mode 100644 index af38f16b..00000000 --- a/internal/dao/slonik/ce/postgres/schema/0001_city.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE city ( - slug text PRIMARY KEY, - name text NOT NULL -) diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql new file mode 100644 index 00000000..f447ca66 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql @@ -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; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql new file mode 100644 index 00000000..aa7900ac --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql @@ -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); + diff --git a/internal/dao/slonik/ce/postgres/schema/0002_venue.sql b/internal/dao/slonik/ce/postgres/schema/0002_venue.sql deleted file mode 100644 index 940de7a5..00000000 --- a/internal/dao/slonik/ce/postgres/schema/0002_venue.sql +++ /dev/null @@ -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'; - diff --git a/internal/dao/slonik/ce/postgres/schema/0003_add_column.sql b/internal/dao/slonik/ce/postgres/schema/0003_add_column.sql deleted file mode 100644 index 9b334bcc..00000000 --- a/internal/dao/slonik/ce/postgres/schema/0003_add_column.sql +++ /dev/null @@ -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; diff --git a/internal/dao/slonik/ce/postgres/topic.sql.go b/internal/dao/slonik/ce/postgres/topic.sql.go new file mode 100644 index 00000000..b3c726c0 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/topic.sql.go @@ -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 +} diff --git a/internal/dao/slonik/ce/postgres/venue.sql.go b/internal/dao/slonik/ce/postgres/venue.sql.go deleted file mode 100644 index 384701a2..00000000 --- a/internal/dao/slonik/ce/postgres/venue.sql.go +++ /dev/null @@ -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 -} diff --git a/internal/dao/slonik/ce/sqlc.yaml b/internal/dao/slonik/ce/sqlc.yaml index 230f8cb4..87c7a4fc 100644 --- a/internal/dao/slonik/ce/sqlc.yaml +++ b/internal/dao/slonik/ce/sqlc.yaml @@ -10,3 +10,5 @@ sql: sql_package: 'pgx/v5' emit_prepared_queries: true emit_interface: true + emit_result_struct_pointers: true + emit_params_struct_pointers: true diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go index 60a52cf2..54ece04a 100644 --- a/internal/dao/slonik/pgx.go +++ b/internal/dao/slonik/pgx.go @@ -39,27 +39,27 @@ func (s *pgxServant) beingTx(ctx context.Context, txOptions pgx.TxOptions) (pgx. 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() tx, err := s.db.Begin(ctx) if err != nil { return err } defer tx.Rollback(ctx) - if err = handle(dbr.New(tx)); err != nil { + if err = handle(ctx, dbr.New(tx)); err != nil { return err } 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() tx, err := s.db.BeginTx(ctx, txOptions) if err != nil { return err } defer tx.Rollback(ctx) - if err = handle(dbr.New(tx)); err != nil { + if err = handle(ctx, dbr.New(tx)); err != nil { return err } return tx.Commit(ctx) diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 55a1cc31..28249f91 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -5,8 +5,12 @@ package slonik import ( + "context" + "strings" + "github.com/jackc/pgx/v5" "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" ) @@ -20,26 +24,88 @@ type topicServant struct { func (s *topicServant) UpsertTags(userId int64, tags []string) ([]*core.Tag, error) { // TODO - debug.NotImplemented() - return nil, nil + return nil, debug.ErrNotImplemented } func (s *topicServant) DecrTagsById(ids []int64) error { - // TODO - debug.NotImplemented() - return nil + // return s.with(func(c context.Context, q dbr.Querier) error { + // tagIds, err := q.TagsByIdA(c, pgtype.Array[int64](ids)) + // 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) { - // TODO - debug.NotImplemented() - return nil, nil +func (s *topicServant) GetTags(category core.TagCategory, offset int, limit int) (res []*core.Tag, _ error) { + ctx := context.Background() + switch category { + 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) { - // TODO - debug.NotImplemented() - return nil, nil +func (s *topicServant) GetTagsByKeyword(keyword string) (res []*core.Tag, _ error) { + ctx := context.Background() + keyword = "%" + strings.Trim(keyword, " ") + "%" + 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 { From 3f3cebed7014f18738263474c9b80a4a3f4d4462 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 5 Feb 2023 15:20:07 +0800 Subject: [PATCH 10/23] sqlc: impement topic data logic --- internal/dao/slonik/ce/postgres/models.go | 6 +- internal/dao/slonik/ce/postgres/querier.go | 9 +- .../dao/slonik/ce/postgres/query/topic.sql | 36 ++-- .../schema/0001_initialize_schema.up.sql | 6 +- internal/dao/slonik/ce/postgres/topic.sql.go | 180 +++++------------- internal/dao/slonik/topics.go | 71 +++++-- pkg/types/types.go | 13 ++ 7 files changed, 144 insertions(+), 177 deletions(-) diff --git a/internal/dao/slonik/ce/postgres/models.go b/internal/dao/slonik/ce/postgres/models.go index d50ca7ad..f8389b70 100644 --- a/internal/dao/slonik/ce/postgres/models.go +++ b/internal/dao/slonik/ce/postgres/models.go @@ -12,9 +12,9 @@ type PTag struct { UserID int64 Tag string QuoteNum int64 - CreatedOn int32 - ModifiedOn int32 - DeletedOn int32 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 // 是否删除 IsDel bool } diff --git a/internal/dao/slonik/ce/postgres/querier.go b/internal/dao/slonik/ce/postgres/querier.go index 7ba9ef07..73bdb8a0 100644 --- a/internal/dao/slonik/ce/postgres/querier.go +++ b/internal/dao/slonik/ce/postgres/querier.go @@ -6,21 +6,16 @@ package dbr import ( "context" - - "github.com/jackc/pgx/v5/pgtype" ) type Querier interface { DecrTagsById(ctx context.Context, arg *DecrTagsByIdParams) error HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRow, error) - IncrTagsById(ctx context.Context, arg *IncrTagsByIdParams) error - InsertTags(ctx context.Context, arg *InsertTagsParams) (*InsertTagsRow, error) + IncrTags(ctx context.Context, arg *IncrTagsParams) ([]*IncrTagsRow, error) + InsertTags(ctx context.Context, arg *InsertTagsParams) (int64, error) NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*NewestTagsRow, error) - TagsByIdA(ctx context.Context, ids pgtype.Array[int64]) ([]int64, error) - TagsByIdB(ctx context.Context, ids pgtype.Array[int64]) ([]*TagsByIdBRow, error) TagsByKeywordA(ctx context.Context) ([]*TagsByKeywordARow, error) TagsByKeywordB(ctx context.Context, tag string) ([]*TagsByKeywordBRow, error) - TagsByName(ctx context.Context, tags pgtype.Array[string]) ([]*TagsByNameRow, error) } var _ Querier = (*Queries)(nil) diff --git a/internal/dao/slonik/ce/postgres/query/topic.sql b/internal/dao/slonik/ce/postgres/query/topic.sql index febcdeb6..96de9bb6 100644 --- a/internal/dao/slonik/ce/postgres/query/topic.sql +++ b/internal/dao/slonik/ce/postgres/query/topic.sql @@ -29,30 +29,26 @@ 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[]); +RETURNING id; -- name: DecrTagsById :exec UPDATE p_tag SET quote_num = quote_num-1, modified_on=$1 -WHERE id = ANY(@ids::bigserial[]); +WHERE id IN ( + SELECT id + FROM p_tag + WHERE id = ANY(@ids::bigserial[]) AND is_del = false AND quote_num >= 1 +); --- 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 +-- name: IncrTags :many UPDATE p_tag -SET quote_num = quote_num+1, modified_on = $1 -WHERE id = ANY(@ids::bigserial[]); +SET quote_num = quote_num+1, + modified_on = $1, + id_del = false +WHERE id IN ( + SELECT id + FROM p_tag + WHERE tag = ANY(@tags::varchar[]) +) +RETURNING id, user_id, tag, quote_num; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql index aa7900ac..546b5874 100644 --- a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql @@ -3,9 +3,9 @@ CREATE TABLE p_tag ( 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, + created_on bigint NOT NULL DEFAULT 0, + modified_on bigint NOT NULL DEFAULT 0, + deleted_on bigint NOT NULL DEFAULT 0, is_del boolean NOT NULL DEFAULT false, UNIQUE (tag) ); diff --git a/internal/dao/slonik/ce/postgres/topic.sql.go b/internal/dao/slonik/ce/postgres/topic.sql.go index b3c726c0..63027dd9 100644 --- a/internal/dao/slonik/ce/postgres/topic.sql.go +++ b/internal/dao/slonik/ce/postgres/topic.sql.go @@ -15,11 +15,15 @@ const decrTagsById = `-- name: DecrTagsById :exec UPDATE p_tag SET quote_num = quote_num-1, modified_on=$1 -WHERE id = ANY($2::bigserial[]) +WHERE id IN ( + SELECT id + FROM p_tag + WHERE id = ANY($2::bigserial[]) AND is_del = false AND quote_num >= 1 +) ` type DecrTagsByIdParams struct { - ModifiedOn int32 + ModifiedOn int64 Ids pgtype.Array[int64] } @@ -73,82 +77,40 @@ func (q *Queries) HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRo return items, nil } -const incrTagsById = `-- name: IncrTagsById :exec +const incrTags = `-- name: IncrTags :many 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) +SET quote_num = quote_num+1, + modified_on = $1, + id_del = false +WHERE id IN ( + SELECT id + FROM p_tag + WHERE tag = ANY($2::varchar[]) +) RETURNING id, user_id, tag, quote_num ` -type InsertTagsParams struct { - UserID int64 - Tag string - CreatedOn int32 +type IncrTagsParams struct { + ModifiedOn int64 + Tags pgtype.Array[string] } -type InsertTagsRow struct { +type IncrTagsRow 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) +func (q *Queries) IncrTags(ctx context.Context, arg *IncrTagsParams) ([]*IncrTagsRow, error) { + rows, err := q.db.Query(ctx, incrTags, arg.ModifiedOn, arg.Tags) if err != nil { return nil, err } defer rows.Close() - var items []*NewestTagsRow + var items []*IncrTagsRow for rows.Next() { - var i NewestTagsRow + var i IncrTagsRow if err := rows.Scan( &i.ID, &i.UserID, @@ -165,54 +127,54 @@ func (q *Queries) NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*New 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 +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 ` -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 +type InsertTagsParams struct { + UserID int64 + Tag string + CreatedOn int64 } -const tagsByIdB = `-- name: TagsByIdB :many +func (q *Queries) InsertTags(ctx context.Context, arg *InsertTagsParams) (int64, error) { + row := q.db.QueryRow(ctx, insertTags, arg.UserID, arg.Tag, arg.CreatedOn) + var id int64 + err := row.Scan(&id) + return id, err +} + +const newestTags = `-- name: NewestTags :many SELECT id, user_id, tag, quote_num FROM p_tag -WHERE id = ANY($1::bigserial[]) +WHERE is_del = false AND quote_num > 0 +ORDER BY id DESC +OFFSET $1 LIMIT $2 ` -type TagsByIdBRow struct { +type NewestTagsParams struct { + Offset int32 + Limit int32 +} + +type NewestTagsRow 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) +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 []*TagsByIdBRow + var items []*NewestTagsRow for rows.Next() { - var i TagsByIdBRow + var i NewestTagsRow if err := rows.Scan( &i.ID, &i.UserID, @@ -308,41 +270,3 @@ func (q *Queries) TagsByKeywordB(ctx context.Context, tag string) ([]*TagsByKeyw } 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 -} diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 28249f91..1e149b38 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -7,11 +7,12 @@ package slonik import ( "context" "strings" + "time" "github.com/jackc/pgx/v5" "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/types" ) var ( @@ -22,24 +23,62 @@ type topicServant struct { *pgxServant } -func (s *topicServant) UpsertTags(userId int64, tags []string) ([]*core.Tag, error) { - // TODO - return nil, debug.ErrNotImplemented +// UpsertTags update/insert tags info. +// Assume tags slice is distinct elements. +func (s *topicServant) UpsertTags(userId int64, tags []string) (res []*core.Tag, err error) { + err = s.with(func(c context.Context, q dbr.Querier) error { + now := time.Now().Unix() + upTags, err := q.IncrTags(c, &dbr.IncrTagsParams{ + Tags: types.PgxArray(tags), + ModifiedOn: now, + }) + if err != nil { + return err + } + if len(upTags) > 0 { + for _, t := range upTags { + for i := 0; i < len(tags); { + if tags[i] == t.Tag { + latestIdx := len(tags) - 1 + tags[i] = tags[latestIdx] + tags = tags[:latestIdx] + break + } + } + res = append(res, &core.Tag{ + ID: t.ID, + UserID: t.UserID, + Tag: t.Tag, + QuoteNum: t.QuoteNum, + }) + } + } + for _, tag := range tags { + id, err := q.InsertTags(c, &dbr.InsertTagsParams{ + UserID: userId, + Tag: tag, + CreatedOn: now, + }) + if err != nil { + return err + } + res = append(res, &core.Tag{ + ID: id, + UserID: userId, + Tag: tag, + QuoteNum: 1, + }) + } + return nil + }) + return } func (s *topicServant) DecrTagsById(ids []int64) error { - // return s.with(func(c context.Context, q dbr.Querier) error { - // tagIds, err := q.TagsByIdA(c, pgtype.Array[int64](ids)) - // 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 + return s.q.DecrTagsById(context.Background(), &dbr.DecrTagsByIdParams{ + Ids: types.PgxArray(ids), + ModifiedOn: time.Now().Unix(), + }) } func (s *topicServant) GetTags(category core.TagCategory, offset int, limit int) (res []*core.Tag, _ error) { diff --git a/pkg/types/types.go b/pkg/types/types.go index 830c56c6..32da1431 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -4,8 +4,21 @@ package types +import ( + "github.com/jackc/pgx/v5/pgtype" +) + // Empty empty alias type type Empty = struct{} // Fn empty argument func alias type type Fn = func() + +// PgxArray returns an object usable by pg drivers for passing a []T slice +// into a database as type T[]. +func PgxArray[T any](elements []T) pgtype.Array[T] { + return pgtype.Array[T]{ + Elements: elements, + Dims: []pgtype.ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}}, + } +} From 7c8849ee54240d0b5f7c9ce6bfdffcdd35eb58ec Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 5 Feb 2023 17:02:17 +0800 Subject: [PATCH 11/23] sqlc: make sqlc generate tool integrate to local build enviroment use github.com/kyleconroy/sqlc/pkg/cli --- Makefile | 2 +- go.mod | 21 +++++++++++++-- go.sum | 47 ++++++++++++++++++++++++++++++--- internal/dao/slonik/ce/ce.go | 4 +-- internal/dao/slonik/ce/embed.go | 2 +- internal/dao/slonik/ce/gen.go | 15 +++++++++++ 6 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 internal/dao/slonik/ce/gen.go diff --git a/Makefile b/Makefile index c257b57e..de6daf34 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ gen-grpc: .PHONY: gen-sqlc gen-sqlc: @find internal/dao/slonik/ce/postgres -name '*.go' -exec rm -f {} + - @go generate internal/dao/slonik/ce/ce.go + @go generate internal/dao/slonik/ce/gen.go @go fmt ./internal/dao/slonik/ce/... .PHONY: proto-mod diff --git a/go.mod b/go.mod index 1355b38f..1ed91b45 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,7 @@ require ( github.com/jackc/pgx/v5 v5.2.0 github.com/jmoiron/sqlx v1.3.5 github.com/json-iterator/go v1.1.12 + github.com/kyleconroy/sqlc v1.16.1-0.20230203175717-382035814184 github.com/meilisearch/meilisearch-go v0.21.0 github.com/minio/minio-go/v7 v7.0.45 github.com/sirupsen/logrus v1.9.0 @@ -48,11 +49,17 @@ require ( require ( github.com/andybalholm/brotli v1.0.4 // indirect + github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220626175859-9abda183db8e // indirect github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect + github.com/benbjohnson/clock v1.1.0 // indirect github.com/btcsuite/btcd v0.22.0-beta // indirect + github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 // indirect github.com/clbanning/mxj v1.8.4 // indirect + github.com/cubicdaiya/gonp v1.0.4 // indirect + github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -68,6 +75,7 @@ require ( github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jinzhu/inflection v1.0.0 // indirect @@ -77,12 +85,12 @@ require ( github.com/klauspost/compress v1.15.9 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect - github.com/lib/pq v1.10.2 // indirect + github.com/lib/pq v1.10.7 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-sqlite3 v1.14.15 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -91,12 +99,17 @@ require ( github.com/mozillazg/go-httpheader v0.3.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pganalyze/pg_query_go/v2 v2.2.0 // indirect + github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 // indirect + github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 // indirect + github.com/pingcap/tidb/parser v0.0.0-20220725134311-c80026e61f00 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/rs/xid v1.4.0 // indirect github.com/smartwalle/crypto4go v1.0.2 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.6.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.1 // indirect @@ -105,11 +118,15 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d // indirect go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.21.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect golang.org/x/crypto v0.4.0 // indirect + golang.org/x/exp v0.0.0-20220428152302-39d4317da171 // indirect golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.3.0 // indirect + golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.3.0 // indirect golang.org/x/text v0.5.0 // indirect golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect diff --git a/go.sum b/go.sum index afb0d8e9..4f5b6ae8 100644 --- a/go.sum +++ b/go.sum @@ -158,6 +158,8 @@ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220626175859-9abda183db8e h1:bt6SW1eSSvdmmsG0KqyxYXorcTnFBTX7hfVR1+68+jg= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220626175859-9abda183db8e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/arrow/go/arrow v0.0.0-20210818145353-234c94e4ce64/go.mod h1:2qMFB56yOP3KzkB3PbYZ4AlUFg3a88F67TIx5lB/WwY= github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= @@ -206,6 +208,8 @@ github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAm github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -241,6 +245,8 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= +github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q= github.com/bytedance/sonic v1.5.0 h1:XWdTi8bwPgxIML+eNV1IwNuTROK6EUrQ65ey8yd6fRQ= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= @@ -409,13 +415,18 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cubicdaiya/gonp v1.0.4 h1:ky2uIAJh81WiLcGKBVD5R7KsM/36W6IqqTy6Bo6rGws= +github.com/cubicdaiya/gonp v1.0.4/go.mod h1:iWGuP/7+JVTn02OWhRemVbMmG1DOUnmrGTYYACpOI0I= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= @@ -817,6 +828,8 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= @@ -971,6 +984,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= +github.com/kyleconroy/sqlc v1.16.1-0.20230203175717-382035814184 h1:e65fQg3yooUBlmkSJc3nwRxw1vEYKU5sF0vxakIGUI0= +github.com/kyleconroy/sqlc v1.16.1-0.20230203175717-382035814184/go.mod h1:KVDjqlXjhpsAKlzFfOwywU4S+/FHB2pAIbCLlCmdnLY= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= @@ -984,8 +999,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1037,8 +1052,9 @@ github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO github.com/mattn/go-sqlite3 v1.14.3/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -1186,11 +1202,20 @@ github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaF github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pganalyze/pg_query_go/v2 v2.2.0 h1:OW+reH+ZY7jdEuPyuLGlf1m7dLbE+fDudKXhLs0Ttpk= +github.com/pganalyze/pg_query_go/v2 v2.2.0/go.mod h1:XAxmVqz1tEGqizcQ3YSdN90vCOHBWjJi8URL1er5+cA= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM= +github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 h1:SvWCbCPh1YeHd9yQLksvJYAgft6wLTY1aNG81tpyscQ= +github.com/pingcap/log v0.0.0-20210906054005-afc726e70354/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= +github.com/pingcap/tidb/parser v0.0.0-20220725134311-c80026e61f00 h1:aDC/yAGx/jPEyrX+UPKV3GWg+4A4yG8ifuP6jBEhDi0= +github.com/pingcap/tidb/parser v0.0.0-20220725134311-c80026e61f00/go.mod h1:wjvp+T3/T9XYt0nKqGX3Kc1AKuyUcfno6LTc6b2A6ew= github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1259,6 +1284,7 @@ github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= @@ -1313,6 +1339,8 @@ github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKv github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1467,17 +1495,26 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1532,6 +1569,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1677,6 +1716,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/internal/dao/slonik/ce/ce.go b/internal/dao/slonik/ce/ce.go index 8e6b4e71..872bf14c 100644 --- a/internal/dao/slonik/ce/ce.go +++ b/internal/dao/slonik/ce/ce.go @@ -2,6 +2,4 @@ // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. -package ce - -//go:generate sqlc generate -x +package main diff --git a/internal/dao/slonik/ce/embed.go b/internal/dao/slonik/ce/embed.go index 3cd77972..426e7576 100644 --- a/internal/dao/slonik/ce/embed.go +++ b/internal/dao/slonik/ce/embed.go @@ -5,7 +5,7 @@ //go:build migration // +build migration -package ce +package main import ( "embed" diff --git a/internal/dao/slonik/ce/gen.go b/internal/dao/slonik/ce/gen.go new file mode 100644 index 00000000..bcd09185 --- /dev/null +++ b/internal/dao/slonik/ce/gen.go @@ -0,0 +1,15 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. +package main + +import ( + "os" + + sqlc "github.com/kyleconroy/sqlc/pkg/cli" +) + +//go:generate go run $GOFILE generate -x +func main() { + os.Exit(sqlc.Run(os.Args[1:])) +} From bac261acda8a691bd812ea9aa606c292bf15f60a Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 5 Feb 2023 17:08:19 +0800 Subject: [PATCH 12/23] sqlc: fixed migration import package error --- internal/dao/slonik/ce/ce.go | 5 ----- internal/dao/slonik/{ce => }/embed.go | 4 ++-- internal/migration/migration_embed.go | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) delete mode 100644 internal/dao/slonik/ce/ce.go rename internal/dao/slonik/{ce => }/embed.go (83%) diff --git a/internal/dao/slonik/ce/ce.go b/internal/dao/slonik/ce/ce.go deleted file mode 100644 index 872bf14c..00000000 --- a/internal/dao/slonik/ce/ce.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2023 ROC. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package main diff --git a/internal/dao/slonik/ce/embed.go b/internal/dao/slonik/embed.go similarity index 83% rename from internal/dao/slonik/ce/embed.go rename to internal/dao/slonik/embed.go index 426e7576..70703133 100644 --- a/internal/dao/slonik/ce/embed.go +++ b/internal/dao/slonik/embed.go @@ -5,11 +5,11 @@ //go:build migration // +build migration -package main +package slonik import ( "embed" ) -//go:embed postgres/schema +//go:embed ce/postgres/schema var Files embed.FS diff --git a/internal/migration/migration_embed.go b/internal/migration/migration_embed.go index 4c0949bb..14b4c1d3 100644 --- a/internal/migration/migration_embed.go +++ b/internal/migration/migration_embed.go @@ -19,7 +19,7 @@ import ( "github.com/golang-migrate/migrate/v4/source" "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/dao/slonik/ce" + "github.com/rocboss/paopao-ce/internal/dao/slonik" "github.com/rocboss/paopao-ce/scripts/migration" "github.com/sirupsen/logrus" ) @@ -72,7 +72,7 @@ func Run() { } } else if cfg.If("Sqlc") { if cfg.If("PostgreSQL") || cfg.If("Postgres") { - srcDriver, err = iofs.New(ce.Files, "postgres/schema") + srcDriver, err = iofs.New(slonik.Files, "ce/postgres/schema") dbDriver, err2 = postgres.WithInstance(db, &postgres.Config{MigrationsTable: migrationsTable}) } } From c7a79d0226b5c89e4e44b0e4700e1a30e694eb3e Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 5 Feb 2023 17:09:48 +0800 Subject: [PATCH 13/23] sqlc: adjust Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index de6daf34..16da17d2 100644 --- a/Makefile +++ b/Makefile @@ -115,7 +115,7 @@ pre-commit: fmt .PHONY: install-plugins -install-plugins: install-protobuf-plugins install-sqlc-plugins +install-plugins: install-protobuf-plugins .PHONY: install-protobuf-plugins install-protobuf-plugins: From c479250eddcc53c9650dfe02314b279b96ec4671 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 5 Feb 2023 17:17:15 +0800 Subject: [PATCH 14/23] sqlc: add gen-sqlc directive to generate in Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 16da17d2..24a04f0a 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ windows-x64: @CGO_ENABLED=$(CGO_ENABLED) GOOS=windows GOARCH=amd64 go build -trimpath -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o $(RELEASE_WINDOWS_AMD64)/$(basename $(TARGET)).exe .PHONY: generate -generate: gen-mir gen-grpc +generate: gen-mir gen-grpc gen-sqlc .PHONY: gen-mir gen-mir: From 8578cd063b5e260d1a13d8fff9683b1bb961a7cb Mon Sep 17 00:00:00 2001 From: Michael Li Date: Tue, 7 Feb 2023 18:17:54 +0800 Subject: [PATCH 15/23] sqlc: prepare implement tweets data logic for sqlc feature --- internal/dao/slonik/ce/postgres/models.go | 21 ++++ .../dao/slonik/ce/postgres/query/topic.sql | 14 +-- .../schema/0001_initialize_schema.down.sql | 3 + .../schema/0001_initialize_schema.up.sql | 47 ++++++-- internal/dao/slonik/ce/postgres/topic.sql.go | 42 +++++-- internal/dao/slonik/{index.go => timeline.go} | 21 ++++ internal/dao/slonik/topics.go | 41 +++++-- internal/dao/slonik/tweets.go | 107 +++++++++++++++++- internal/dao/slonik/user.go | 6 - 9 files changed, 249 insertions(+), 53 deletions(-) rename internal/dao/slonik/{index.go => timeline.go} (80%) diff --git a/internal/dao/slonik/ce/postgres/models.go b/internal/dao/slonik/ce/postgres/models.go index f8389b70..d4d8e7ff 100644 --- a/internal/dao/slonik/ce/postgres/models.go +++ b/internal/dao/slonik/ce/postgres/models.go @@ -18,3 +18,24 @@ type PTag struct { // 是否删除 IsDel bool } + +// 用户 +type PUser struct { + ID int64 + Nickname string + Username string + Phone string + // MD5密码 + Password string + Salt string + // 状态, 1正常, 2停用 + Status int16 + Avatar string + // 用户余额(分) + Balance int64 + IsAdmin bool + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel bool +} diff --git a/internal/dao/slonik/ce/postgres/query/topic.sql b/internal/dao/slonik/ce/postgres/query/topic.sql index 96de9bb6..b43048ca 100644 --- a/internal/dao/slonik/ce/postgres/query/topic.sql +++ b/internal/dao/slonik/ce/postgres/query/topic.sql @@ -1,14 +1,14 @@ -- 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 +SELECT t.id, t.tag, t.quote_num, u.id user_id, u.nickname, u.username, u.status, u.avatar, u.is_admin +FROM p_tag t JOIN p_user u ON t.user_id = u.id +WHERE t.is_del = 0 AND t.quote_num > 0 +ORDER BY t.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 +SELECT t.id, t.tag, t.quote_num, u.id user_id, u.nickname, u.username, u.status, u.avatar, u.is_admin +FROM p_tag t JOIN p_user u ON t.user_id = u.id +WHERE t.is_del = false AND t.quote_num > 0 ORDER BY quote_num DESC OFFSET $1 LIMIT $2; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql index f447ca66..a7b22974 100644 --- a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql @@ -1,2 +1,5 @@ +DROP TABLE IF EXISTS p_user; +DROP INDEX IF EXISTS p_user_username_idx, p_user_phone_idx; + DROP TABLE IF EXISTS p_tag; DROP INDEX IF EXISTS p_tag_tag_idx, p_tag_user_idx, p_tag_quote_num_idx; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql index 546b5874..c097e776 100644 --- a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql @@ -1,17 +1,42 @@ +-- user ddl -- +CREATE TABLE p_user ( + id bigserial PRIMARY KEY, + nickname VARCHAR(32) NOT NULL DEFAULT '', + username VARCHAR(32) NOT NULL DEFAULT '', + phone VARCHAR(16) NOT NULL DEFAULT '', + PASSWORD VARCHAR(32) NOT NULL DEFAULT '', + salt VARCHAR(16) NOT NULL DEFAULT '', + status SMALLINT NOT NULL DEFAULT 1, + avatar VARCHAR(255) NOT NULL DEFAULT '', + balance BIGINT NOT NULL, + is_admin BOOLEAN NOT NULL DEFAULT FALSE, + created_on BIGINT NOT NULL, + modified_on BIGINT NOT NULL, + deleted_on BIGINT NOT NULL, + is_del BOOLEAN NOT NULL DEFAULT FALSE, + UNIQUE (username) +); +COMMENT ON TABLE p_user IS '用户'; +COMMENT ON COLUMN p_user.password IS 'MD5密码'; +COMMENT ON COLUMN p_user.status IS '状态, 1正常, 2停用'; +COMMENT ON COLUMN p_user.balance IS '用户余额(分)'; +CREATE UNIQUE INDEX p_user_username_idx ON p_user (username); +CREATE INDEX p_user_phone_idx ON p_user (phone); + +-- tag ddl -- 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 bigint NOT NULL DEFAULT 0, - modified_on bigint NOT NULL DEFAULT 0, - deleted_on bigint NOT NULL DEFAULT 0, - is_del boolean NOT NULL DEFAULT false, - UNIQUE (tag) + id bigserial PRIMARY KEY, + user_id bigserial NOT NULL, + tag VARCHAR(255) NOT NULL, + quote_num BIGINT NOT NULL DEFAULT 0, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT 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); - +CREATE INDEX p_tag_quote_num_idx ON p_tag (quote_num); diff --git a/internal/dao/slonik/ce/postgres/topic.sql.go b/internal/dao/slonik/ce/postgres/topic.sql.go index 63027dd9..79a9b757 100644 --- a/internal/dao/slonik/ce/postgres/topic.sql.go +++ b/internal/dao/slonik/ce/postgres/topic.sql.go @@ -33,9 +33,9 @@ func (q *Queries) DecrTagsById(ctx context.Context, arg *DecrTagsByIdParams) err } const hotTags = `-- name: HotTags :many -SELECT id, user_id, tag, quote_num -FROM p_tag -WHERE is_del = false AND quote_num > 0 +SELECT t.id, t.tag, t.quote_num, u.id user_id, u.nickname, u.username, u.status, u.avatar, u.is_admin +FROM p_tag t JOIN p_user u ON t.user_id = u.id +WHERE t.is_del = false AND t.quote_num > 0 ORDER BY quote_num DESC OFFSET $1 LIMIT $2 ` @@ -47,9 +47,14 @@ type HotTagsParams struct { type HotTagsRow struct { ID int64 - UserID int64 Tag string QuoteNum int64 + UserID int64 + Nickname string + Username string + Status int16 + Avatar string + IsAdmin bool } func (q *Queries) HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRow, error) { @@ -63,9 +68,14 @@ func (q *Queries) HotTags(ctx context.Context, arg *HotTagsParams) ([]*HotTagsRo var i HotTagsRow if err := rows.Scan( &i.ID, - &i.UserID, &i.Tag, &i.QuoteNum, + &i.UserID, + &i.Nickname, + &i.Username, + &i.Status, + &i.Avatar, + &i.IsAdmin, ); err != nil { return nil, err } @@ -147,10 +157,10 @@ func (q *Queries) InsertTags(ctx context.Context, arg *InsertTagsParams) (int64, } 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 +SELECT t.id, t.tag, t.quote_num, u.id user_id, u.nickname, u.username, u.status, u.avatar, u.is_admin +FROM p_tag t JOIN p_user u ON t.user_id = u.id +WHERE t.is_del = 0 AND t.quote_num > 0 +ORDER BY t.id DESC OFFSET $1 LIMIT $2 ` @@ -161,9 +171,14 @@ type NewestTagsParams struct { type NewestTagsRow struct { ID int64 - UserID int64 Tag string QuoteNum int64 + UserID int64 + Nickname string + Username string + Status int16 + Avatar string + IsAdmin bool } func (q *Queries) NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*NewestTagsRow, error) { @@ -177,9 +192,14 @@ func (q *Queries) NewestTags(ctx context.Context, arg *NewestTagsParams) ([]*New var i NewestTagsRow if err := rows.Scan( &i.ID, - &i.UserID, &i.Tag, &i.QuoteNum, + &i.UserID, + &i.Nickname, + &i.Username, + &i.Status, + &i.Avatar, + &i.IsAdmin, ); err != nil { return nil, err } diff --git a/internal/dao/slonik/index.go b/internal/dao/slonik/timeline.go similarity index 80% rename from internal/dao/slonik/index.go rename to internal/dao/slonik/timeline.go index 2ae7cf8c..e6b9eeb6 100644 --- a/internal/dao/slonik/index.go +++ b/internal/dao/slonik/timeline.go @@ -7,6 +7,7 @@ package slonik import ( "github.com/jackc/pgx/v5" "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/pkg/debug" ) @@ -44,24 +45,44 @@ func (s *friendIndexServant) IndexPosts(user *core.User, offset int, limit int) return nil, debug.ErrNotImplemented } +func (s *friendIndexServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { + // TODO + return nil, debug.ErrNotImplemented +} + // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; func (s *followIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } +func (s *followIndexServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { + // TODO + return nil, debug.ErrNotImplemented +} + // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; func (s *lightIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } +func (s *lightIndexServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { + // TODO + return nil, debug.ErrNotImplemented +} + // simpleCacheIndexGetPosts simpleCacheIndex 专属获取广场推文列表函数 func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } +func (s *simpleIndexPostsServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { + // TODO + return nil, debug.ErrNotImplemented +} + func newFriendIndexService(db *pgx.Conn, ams core.AuthorizationManageService, ths core.TweetHelpService) core.IndexPostsService { return &friendIndexServant{ ams: ams, diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 1e149b38..70bfc9ee 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -11,6 +11,7 @@ import ( "github.com/jackc/pgx/v5" "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/cs" dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/ce/postgres" "github.com/rocboss/paopao-ce/pkg/types" ) @@ -25,7 +26,7 @@ type topicServant struct { // UpsertTags update/insert tags info. // Assume tags slice is distinct elements. -func (s *topicServant) UpsertTags(userId int64, tags []string) (res []*core.Tag, err error) { +func (s *topicServant) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, err error) { err = s.with(func(c context.Context, q dbr.Querier) error { now := time.Now().Unix() upTags, err := q.IncrTags(c, &dbr.IncrTagsParams{ @@ -45,7 +46,7 @@ func (s *topicServant) UpsertTags(userId int64, tags []string) (res []*core.Tag, break } } - res = append(res, &core.Tag{ + res = append(res, &cs.TagInfo{ ID: t.ID, UserID: t.UserID, Tag: t.Tag, @@ -62,7 +63,7 @@ func (s *topicServant) UpsertTags(userId int64, tags []string) (res []*core.Tag, if err != nil { return err } - res = append(res, &core.Tag{ + res = append(res, &cs.TagInfo{ ID: id, UserID: userId, Tag: tag, @@ -81,40 +82,56 @@ func (s *topicServant) DecrTagsById(ids []int64) error { }) } -func (s *topicServant) GetTags(category core.TagCategory, offset int, limit int) (res []*core.Tag, _ error) { +func (s *topicServant) ListTags(typ cs.TagType, offset int, limit int) (res cs.TagList, _ error) { ctx := context.Background() - switch category { - case core.TagCategoryHot: + switch typ { + case cs.TagTypeHot: 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{ + res = append(res, &cs.TagItem{ ID: tag.ID, UserID: tag.UserID, Tag: tag.Tag, QuoteNum: tag.QuoteNum, + User: &cs.UserInfo{ + ID: tag.UserID, + Nickname: tag.Nickname, + Username: tag.Username, + Status: int(tag.Status), + Avatar: tag.Avatar, + IsAdmin: tag.IsAdmin, + }, }) } - case core.TagCategoryNew: + case cs.TagTypeNew: 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{ + res = append(res, &cs.TagItem{ ID: tag.ID, UserID: tag.UserID, Tag: tag.Tag, QuoteNum: tag.QuoteNum, + User: &cs.UserInfo{ + ID: tag.UserID, + Nickname: tag.Nickname, + Username: tag.Username, + Status: int(tag.Status), + Avatar: tag.Avatar, + IsAdmin: tag.IsAdmin, + }, }) } } return } -func (s *topicServant) GetTagsByKeyword(keyword string) (res []*core.Tag, _ error) { +func (s *topicServant) TagsByKeyword(keyword string) (res cs.TagInfoList, _ error) { ctx := context.Background() keyword = "%" + strings.Trim(keyword, " ") + "%" if keyword == "%%" { @@ -123,7 +140,7 @@ func (s *topicServant) GetTagsByKeyword(keyword string) (res []*core.Tag, _ erro return nil, err } for _, tag := range tags { - res = append(res, &core.Tag{ + res = append(res, &cs.TagInfo{ ID: tag.ID, UserID: tag.UserID, Tag: tag.Tag, @@ -136,7 +153,7 @@ func (s *topicServant) GetTagsByKeyword(keyword string) (res []*core.Tag, _ erro return nil, err } for _, tag := range tags { - res = append(res, &core.Tag{ + res = append(res, &cs.TagInfo{ ID: tag.ID, UserID: tag.UserID, Tag: tag.Tag, diff --git a/internal/dao/slonik/tweets.go b/internal/dao/slonik/tweets.go index f07ff198..5b6185d4 100644 --- a/internal/dao/slonik/tweets.go +++ b/internal/dao/slonik/tweets.go @@ -7,6 +7,7 @@ package slonik import ( "github.com/jackc/pgx/v5" "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/core/cs" "github.com/rocboss/paopao-ce/pkg/debug" "gorm.io/gorm" ) @@ -43,6 +44,16 @@ func (s *tweetHelpServant) RevampPosts(posts []*core.PostFormated) ([]*core.Post return nil, nil } +func (s *tweetHelpServant) RevampTweets(tweets cs.TweetList) (cs.TweetList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetHelpServant) MergeTweets(tweets cs.TweetInfo) (cs.TweetList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + func (s *tweetHelpServant) getPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { // TODO debug.NotImplemented() @@ -73,12 +84,6 @@ func (s *tweetManageServant) CreatePostContent(content *core.PostContent) (*core return nil, nil } -func (s *tweetManageServant) CreateAttachment(attachment *core.Attachment) (*core.Attachment, error) { - // TODO - debug.NotImplemented() - return nil, nil -} - func (s *tweetManageServant) CreatePost(post *core.Post) (*core.Post, error) { // TODO debug.NotImplemented() @@ -133,6 +138,56 @@ func (s *tweetManageServant) DeletePostStar(p *core.PostStar) error { return nil } +func (s *tweetManageServant) CreateAttachment(obj *cs.Attachment) (int64, error) { + // TODO + return 0, debug.ErrNotImplemented +} + +func (s *tweetManageServant) CreateTweet(userId int64, req *cs.NewTweetReq) (*cs.TweetItem, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetManageServant) DeleteTweet(userId int64, tweetId int64) ([]string, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetManageServant) LockTweet(userId int64, tweetId int64) error { + // TODO + return debug.ErrNotImplemented +} + +func (s *tweetManageServant) StickTweet(userId int64, tweetId int64) error { + // TODO + return debug.ErrNotImplemented +} + +func (s *tweetManageServant) VisibleTweet(userId int64, visibility cs.TweetVisibleType) error { + // TODO + return debug.ErrNotImplemented +} + +func (s *tweetManageServant) CreateReaction(userId int64, tweetId int64) error { + // TODO + return debug.ErrNotImplemented +} + +func (s *tweetManageServant) DeleteReaction(userId int64, reactionId int64) error { + // TODO + return debug.ErrNotImplemented +} + +func (s *tweetManageServant) CreateFavorite(userId int64, tweetId int64) error { + // TODO + return debug.ErrNotImplemented +} + +func (s *tweetManageServant) DeleteFavorite(userId int64, favoriteId int64) error { + // TODO + return debug.ErrNotImplemented +} + func (s *tweetServant) GetPostByID(id int64) (*core.Post, error) { // TODO debug.NotImplemented() @@ -217,6 +272,46 @@ func (s *tweetServant) GetPostContentByID(id int64) (*core.PostContent, error) { return nil, nil } +func (s *tweetServant) TweetInfoById(id int64) (*cs.TweetInfo, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) TweetItemById(id int64) (*cs.TweetItem, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) UserTweets(visitorId, userId int64) (cs.TweetList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) ReactionByTweetId(userId int64, tweetId int64) (*cs.ReactionItem, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) UserReactions(userId int64, offset int, limit int) (cs.ReactionList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) FavoriteByTweetId(userId int64, tweetId int64) (*cs.FavoriteItem, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) UserFavorites(userId int64, offset int, limit int) (cs.FavoriteList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +func (s *tweetServant) AttachmentByTweetId(userId int64, tweetId int64) (*cs.AttachmentBill, error) { + // TODO + return nil, debug.ErrNotImplemented +} + func newTweetService(db *pgx.Conn) core.TweetService { return &tweetServant{ pgxServant: newPgxServant(db), diff --git a/internal/dao/slonik/user.go b/internal/dao/slonik/user.go index 94035833..382a971e 100644 --- a/internal/dao/slonik/user.go +++ b/internal/dao/slonik/user.go @@ -48,12 +48,6 @@ func (s *userManageServant) GetUsersByKeyword(keyword string) ([]*core.User, err return nil, nil } -func (s *userManageServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { - // TODO - debug.NotImplemented() - return nil, nil -} - func (s *userManageServant) CreateUser(user *core.User) (*core.User, error) { // TODO debug.NotImplemented() From e63149b78ebf33baa5c82254d358ffdafd729447 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 11 Feb 2023 17:10:39 +0800 Subject: [PATCH 16/23] sqlc: add a temp sql ddl for postgres in scripts/paopao-postgresql --- scripts/paopao-postgres.sql | 620 +++++++++++++++++++++++++++++++++++- 1 file changed, 619 insertions(+), 1 deletion(-) diff --git a/scripts/paopao-postgres.sql b/scripts/paopao-postgres.sql index 3ce95155..e359ec3e 100644 --- a/scripts/paopao-postgres.sql +++ b/scripts/paopao-postgres.sql @@ -1 +1,619 @@ --- TODO: WIP +/* + Navicat Premium Data Transfer +*/ + +-- ---------------------------- +-- Table structure for p_anouncement +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_anouncement"; +CREATE TABLE "public"."p_anouncement" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "comment_count" numeric(20,0) NOT NULL, + "collection_count" numeric(20,0) NOT NULL, + "upvote_count" numeric(20,0) NOT NULL, + "is_top" int2 NOT NULL, + "is_essence" int2 NOT NULL, + "is_lock" int2 NOT NULL, + "latest_replied_on" numeric(20,0) NOT NULL, + "tags" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "attachment_price" numeric(20,0) NOT NULL, + "ip" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "ip_loc" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_anouncement"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_anouncement"."comment_count" IS '评论数'; +COMMENT ON COLUMN "public"."p_anouncement"."collection_count" IS '收藏数'; +COMMENT ON COLUMN "public"."p_anouncement"."upvote_count" IS '点赞数'; +COMMENT ON COLUMN "public"."p_anouncement"."is_top" IS '是否置顶'; +COMMENT ON COLUMN "public"."p_anouncement"."is_essence" IS '是否精华'; +COMMENT ON COLUMN "public"."p_anouncement"."is_lock" IS '是否锁定'; +COMMENT ON COLUMN "public"."p_anouncement"."latest_replied_on" IS '最新回复时间'; +COMMENT ON COLUMN "public"."p_anouncement"."tags" IS '标签'; +COMMENT ON COLUMN "public"."p_anouncement"."attachment_price" IS '附件价格(分)'; +COMMENT ON COLUMN "public"."p_anouncement"."ip" IS 'IP地址'; +COMMENT ON COLUMN "public"."p_anouncement"."ip_loc" IS 'IP城市地址'; +COMMENT ON COLUMN "public"."p_anouncement"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_anouncement"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_anouncement"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_anouncement"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_anouncement" IS '公告'; + +-- ---------------------------- +-- Table structure for p_anouncement_content +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_anouncement_content"; +CREATE TABLE "public"."p_anouncement_content" ( + "id" numeric(20,0) NOT NULL, + "anouncement_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "content" varchar(2000) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "sort" int8 NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_anouncement_content"."id" IS '内容ID'; +COMMENT ON COLUMN "public"."p_anouncement_content"."anouncement_id" IS '公告ID'; +COMMENT ON COLUMN "public"."p_anouncement_content"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_anouncement_content"."content" IS '内容'; +COMMENT ON COLUMN "public"."p_anouncement_content"."type" IS '类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址,7附件资源,8收费资源'; +COMMENT ON COLUMN "public"."p_anouncement_content"."sort" IS '排序,越小越靠前'; +COMMENT ON COLUMN "public"."p_anouncement_content"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_anouncement_content"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_anouncement_content"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_anouncement_content"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_anouncement_content" IS '公告内容'; + +-- ---------------------------- +-- Table structure for p_attachment +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_attachment"; +CREATE TABLE "public"."p_attachment" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "file_size" numeric(20,0) NOT NULL, + "img_width" numeric(20,0) NOT NULL, + "img_height" numeric(20,0) NOT NULL, + "type" int2 NOT NULL, + "content" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL, + "scope" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_attachment"."type" IS '1图片,2视频,3其他附件'; +COMMENT ON COLUMN "public"."p_attachment"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_attachment"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_attachment"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_attachment"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON COLUMN "public"."p_attachment"."scope" IS '领域 0未知 1泡泡 2公告'; +COMMENT ON TABLE "public"."p_attachment" IS '附件'; + +-- ---------------------------- +-- Table structure for p_captcha +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_captcha"; +CREATE TABLE "public"."p_captcha" ( + "id" numeric(20,0) NOT NULL, + "phone" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "captcha" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "use_times" int8 NOT NULL, + "expired_on" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_captcha"."id" IS '验证码ID'; +COMMENT ON COLUMN "public"."p_captcha"."phone" IS '手机号'; +COMMENT ON COLUMN "public"."p_captcha"."captcha" IS '验证码'; +COMMENT ON COLUMN "public"."p_captcha"."use_times" IS '使用次数'; +COMMENT ON COLUMN "public"."p_captcha"."expired_on" IS '过期时间'; +COMMENT ON COLUMN "public"."p_captcha"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_captcha"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_captcha"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_captcha"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_captcha" IS '手机验证码'; + +-- ---------------------------- +-- Table structure for p_comment +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_comment"; +CREATE TABLE "public"."p_comment" ( + "id" numeric(20,0) NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "ip" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "ip_loc" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL, + "scope" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_comment"."id" IS '评论ID'; +COMMENT ON COLUMN "public"."p_comment"."post_id" IS 'POST ID'; +COMMENT ON COLUMN "public"."p_comment"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_comment"."ip" IS 'IP地址'; +COMMENT ON COLUMN "public"."p_comment"."ip_loc" IS 'IP城市地址'; +COMMENT ON COLUMN "public"."p_comment"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_comment"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_comment"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_comment"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON COLUMN "public"."p_comment"."scope" IS '领域 0未知 1泡泡 2公告'; +COMMENT ON TABLE "public"."p_comment" IS '评论'; + +-- ---------------------------- +-- Table structure for p_comment_content +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_comment_content"; +CREATE TABLE "public"."p_comment_content" ( + "id" numeric(20,0) NOT NULL, + "comment_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "content" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "sort" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_comment_content"."id" IS '内容ID'; +COMMENT ON COLUMN "public"."p_comment_content"."comment_id" IS '评论ID'; +COMMENT ON COLUMN "public"."p_comment_content"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_comment_content"."content" IS '内容'; +COMMENT ON COLUMN "public"."p_comment_content"."type" IS '类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址'; +COMMENT ON COLUMN "public"."p_comment_content"."sort" IS '排序,越小越靠前'; +COMMENT ON COLUMN "public"."p_comment_content"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_comment_content"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_comment_content"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_comment_content"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_comment_content" IS '评论内容'; + +-- ---------------------------- +-- Table structure for p_comment_reply +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_comment_reply"; +CREATE TABLE "public"."p_comment_reply" ( + "id" numeric(20,0) NOT NULL, + "comment_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "at_user_id" numeric(20,0) NOT NULL, + "content" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "ip" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "ip_loc" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_comment_reply"."id" IS '回复ID'; +COMMENT ON COLUMN "public"."p_comment_reply"."comment_id" IS '评论ID'; +COMMENT ON COLUMN "public"."p_comment_reply"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_comment_reply"."at_user_id" IS '@用户ID'; +COMMENT ON COLUMN "public"."p_comment_reply"."content" IS '内容'; +COMMENT ON COLUMN "public"."p_comment_reply"."ip" IS 'IP地址'; +COMMENT ON COLUMN "public"."p_comment_reply"."ip_loc" IS 'IP城市地址'; +COMMENT ON COLUMN "public"."p_comment_reply"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_comment_reply"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_comment_reply"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_comment_reply"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_comment_reply" IS '评论回复'; + +-- ---------------------------- +-- Table structure for p_contact +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_contact"; +CREATE TABLE "public"."p_contact" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "friend_id" numeric(20,0) NOT NULL, + "group_id" numeric(20,0) NOT NULL, + "remark" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "notice_enable" int2 NOT NULL, + "is_top" int2 NOT NULL, + "is_black" int2 NOT NULL, + "is_del" int2 NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL +); +COMMENT ON COLUMN "public"."p_contact"."id" IS '联系人ID'; +COMMENT ON COLUMN "public"."p_contact"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_contact"."friend_id" IS '好友ID'; +COMMENT ON COLUMN "public"."p_contact"."group_id" IS '好友分组ID:默认为0无分组'; +COMMENT ON COLUMN "public"."p_contact"."remark" IS '好友备注'; +COMMENT ON COLUMN "public"."p_contact"."status" IS '好友状态: 1请求好友, 2已好友, 3拒绝好友, 4已删好友'; +COMMENT ON COLUMN "public"."p_contact"."notice_enable" IS '是否有消息提醒, 0否, 1是'; +COMMENT ON COLUMN "public"."p_contact"."is_top" IS '是否置顶, 0否, 1是'; +COMMENT ON COLUMN "public"."p_contact"."is_black" IS '是否为黑名单, 0否, 1是'; +COMMENT ON COLUMN "public"."p_contact"."is_del" IS '是否删除好友, 0否, 1是'; +COMMENT ON COLUMN "public"."p_contact"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_contact"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_contact"."deleted_on" IS '删除时间'; +COMMENT ON TABLE "public"."p_contact" IS '联系人'; + +-- ---------------------------- +-- Table structure for p_contact_group +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_contact_group"; +CREATE TABLE "public"."p_contact_group" ( + "id" numeric(20,0) NOT NULL, + "user_id" int4 NOT NULL, + "name" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "is_del" int2 NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL +); +COMMENT ON COLUMN "public"."p_contact_group"."id" IS '联系人ID'; +COMMENT ON COLUMN "public"."p_contact_group"."user_id" IS '用户id'; +COMMENT ON COLUMN "public"."p_contact_group"."name" IS '分组名称'; +COMMENT ON COLUMN "public"."p_contact_group"."is_del" IS '是否删除, 0否, 1是'; +COMMENT ON COLUMN "public"."p_contact_group"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_contact_group"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_contact_group"."deleted_on" IS '删除时间'; +COMMENT ON TABLE "public"."p_contact_group" IS '联系人分组'; + +-- ---------------------------- +-- Table structure for p_message +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_message"; +CREATE TABLE "public"."p_message" ( + "id" numeric(20,0) NOT NULL, + "sender_user_id" numeric(20,0) NOT NULL, + "receiver_user_id" numeric(20,0) NOT NULL, + "type" int2 NOT NULL, + "brief" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "content" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "comment_id" numeric(20,0) NOT NULL, + "reply_id" numeric(20,0) NOT NULL, + "is_read" int2 NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_message"."id" IS '消息通知ID'; +COMMENT ON COLUMN "public"."p_message"."sender_user_id" IS '发送方用户ID'; +COMMENT ON COLUMN "public"."p_message"."receiver_user_id" IS '接收方用户ID'; +COMMENT ON COLUMN "public"."p_message"."type" IS '通知类型,1动态,2评论,3回复,4私信,99系统通知'; +COMMENT ON COLUMN "public"."p_message"."brief" IS '摘要说明'; +COMMENT ON COLUMN "public"."p_message"."content" IS '详细内容'; +COMMENT ON COLUMN "public"."p_message"."post_id" IS '动态ID'; +COMMENT ON COLUMN "public"."p_message"."comment_id" IS '评论ID'; +COMMENT ON COLUMN "public"."p_message"."reply_id" IS '回复ID'; +COMMENT ON COLUMN "public"."p_message"."is_read" IS '是否已读'; +COMMENT ON COLUMN "public"."p_message"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_message"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_message"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_message"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_message" IS '消息通知'; + +-- ---------------------------- +-- Table structure for p_post +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_post"; +CREATE TABLE "public"."p_post" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "comment_count" numeric(20,0) NOT NULL, + "collection_count" numeric(20,0) NOT NULL, + "upvote_count" numeric(20,0) NOT NULL, + "is_top" int2 NOT NULL, + "is_essence" int2 NOT NULL, + "is_lock" int2 NOT NULL, + "latest_replied_on" numeric(20,0) NOT NULL, + "tags" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "attachment_price" numeric(20,0) NOT NULL, + "ip" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "ip_loc" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL, + "visibility" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_post"."id" IS '主题ID'; +COMMENT ON COLUMN "public"."p_post"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_post"."comment_count" IS '评论数'; +COMMENT ON COLUMN "public"."p_post"."collection_count" IS '收藏数'; +COMMENT ON COLUMN "public"."p_post"."upvote_count" IS '点赞数'; +COMMENT ON COLUMN "public"."p_post"."is_top" IS '是否置顶'; +COMMENT ON COLUMN "public"."p_post"."is_essence" IS '是否精华'; +COMMENT ON COLUMN "public"."p_post"."is_lock" IS '是否锁定'; +COMMENT ON COLUMN "public"."p_post"."latest_replied_on" IS '最新回复时间'; +COMMENT ON COLUMN "public"."p_post"."tags" IS '标签'; +COMMENT ON COLUMN "public"."p_post"."attachment_price" IS '附件价格(分)'; +COMMENT ON COLUMN "public"."p_post"."ip" IS 'IP地址'; +COMMENT ON COLUMN "public"."p_post"."ip_loc" IS 'IP城市地址'; +COMMENT ON COLUMN "public"."p_post"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_post"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_post"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_post"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON COLUMN "public"."p_post"."visibility" IS '可见性 0公开 1私密 2好友可见'; +COMMENT ON TABLE "public"."p_post" IS '冒泡/文章'; + +-- ---------------------------- +-- Table structure for p_post_attachment_bill +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_post_attachment_bill"; +CREATE TABLE "public"."p_post_attachment_bill" ( + "id" numeric(20,0) NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "paid_amount" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL, + "scope" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_post_attachment_bill"."id" IS '购买记录ID'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."post_id" IS 'POST ID'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."paid_amount" IS '支付金额'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON COLUMN "public"."p_post_attachment_bill"."scope" IS '领域 0未知 1泡泡 2公告'; +COMMENT ON TABLE "public"."p_post_attachment_bill" IS '冒泡/文章附件账单'; + +-- ---------------------------- +-- Table structure for p_post_collection +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_post_collection"; +CREATE TABLE "public"."p_post_collection" ( + "id" numeric(20,0) NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL, + "scope" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_post_collection"."id" IS '收藏ID'; +COMMENT ON COLUMN "public"."p_post_collection"."post_id" IS 'POST ID'; +COMMENT ON COLUMN "public"."p_post_collection"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_post_collection"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_post_collection"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_post_collection"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_post_collection"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON COLUMN "public"."p_post_collection"."scope" IS '领域 0未知 1泡泡 2公告'; +COMMENT ON TABLE "public"."p_post_collection" IS '冒泡/文章收藏'; + +-- ---------------------------- +-- Table structure for p_post_content +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_post_content"; +CREATE TABLE "public"."p_post_content" ( + "id" numeric(20,0) NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "content" varchar(2000) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "sort" int8 NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_post_content"."id" IS '内容ID'; +COMMENT ON COLUMN "public"."p_post_content"."post_id" IS 'POST ID'; +COMMENT ON COLUMN "public"."p_post_content"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_post_content"."content" IS '内容'; +COMMENT ON COLUMN "public"."p_post_content"."type" IS '类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址,7附件资源,8收费资源'; +COMMENT ON COLUMN "public"."p_post_content"."sort" IS '排序,越小越靠前'; +COMMENT ON COLUMN "public"."p_post_content"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_post_content"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_post_content"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_post_content"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_post_content" IS '冒泡/文章内容'; + +-- ---------------------------- +-- Table structure for p_post_star +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_post_star"; +CREATE TABLE "public"."p_post_star" ( + "id" numeric(20,0) NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL, + "scope" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_post_star"."id" IS '收藏ID'; +COMMENT ON COLUMN "public"."p_post_star"."post_id" IS 'POST ID'; +COMMENT ON COLUMN "public"."p_post_star"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_post_star"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_post_star"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_post_star"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_post_star"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON COLUMN "public"."p_post_star"."scope" IS '领域 0未知 1泡泡 2公告'; +COMMENT ON TABLE "public"."p_post_star" IS '冒泡/文章点赞'; + +-- ---------------------------- +-- Table structure for p_tag +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_tag"; +CREATE TABLE "public"."p_tag" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "tag" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "quote_num" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_tag"."id" IS '标签ID'; +COMMENT ON COLUMN "public"."p_tag"."user_id" IS '创建者ID'; +COMMENT ON COLUMN "public"."p_tag"."tag" IS '标签名'; +COMMENT ON COLUMN "public"."p_tag"."quote_num" IS '引用数'; +COMMENT ON COLUMN "public"."p_tag"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_tag"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_tag"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_tag"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_tag" IS '标签'; + +-- ---------------------------- +-- Table structure for p_user +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_user"; +CREATE TABLE "public"."p_user" ( + "id" numeric(20,0) NOT NULL, + "nickname" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "username" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "phone" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "password" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "salt" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "avatar" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "balance" numeric(20,0) NOT NULL, + "is_admin" int2 NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_user"."id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_user"."nickname" IS '昵称'; +COMMENT ON COLUMN "public"."p_user"."username" IS '用户名'; +COMMENT ON COLUMN "public"."p_user"."phone" IS '手机号'; +COMMENT ON COLUMN "public"."p_user"."password" IS 'MD5密码'; +COMMENT ON COLUMN "public"."p_user"."salt" IS '盐值'; +COMMENT ON COLUMN "public"."p_user"."status" IS '状态,1正常,2停用'; +COMMENT ON COLUMN "public"."p_user"."avatar" IS '用户头像'; +COMMENT ON COLUMN "public"."p_user"."balance" IS '用户余额(分)'; +COMMENT ON COLUMN "public"."p_user"."is_admin" IS '是否管理员'; +COMMENT ON COLUMN "public"."p_user"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_user"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_user"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_user"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_user" IS '用户'; + +-- ---------------------------- +-- Table structure for p_wallet_recharge +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_wallet_recharge"; +CREATE TABLE "public"."p_wallet_recharge" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "amount" int8 NOT NULL, + "trade_no" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "trade_status" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_wallet_recharge"."id" IS '充值ID'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."amount" IS '充值金额'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."trade_no" IS '支付宝订单号'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."trade_status" IS '交易状态'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_wallet_recharge"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_wallet_recharge" IS '钱包流水'; + +-- ---------------------------- +-- Table structure for p_wallet_statement +-- ---------------------------- +DROP TABLE IF EXISTS "public"."p_wallet_statement"; +CREATE TABLE "public"."p_wallet_statement" ( + "id" numeric(20,0) NOT NULL, + "user_id" numeric(20,0) NOT NULL, + "change_amount" int8 NOT NULL, + "balance_snapshot" int8 NOT NULL, + "reason" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "post_id" numeric(20,0) NOT NULL, + "created_on" numeric(20,0) NOT NULL, + "modified_on" numeric(20,0) NOT NULL, + "deleted_on" numeric(20,0) NOT NULL, + "is_del" int2 NOT NULL +); +COMMENT ON COLUMN "public"."p_wallet_statement"."id" IS '账单ID'; +COMMENT ON COLUMN "public"."p_wallet_statement"."user_id" IS '用户ID'; +COMMENT ON COLUMN "public"."p_wallet_statement"."change_amount" IS '变动金额'; +COMMENT ON COLUMN "public"."p_wallet_statement"."balance_snapshot" IS '资金快照'; +COMMENT ON COLUMN "public"."p_wallet_statement"."reason" IS '变动原因'; +COMMENT ON COLUMN "public"."p_wallet_statement"."post_id" IS '关联动态'; +COMMENT ON COLUMN "public"."p_wallet_statement"."created_on" IS '创建时间'; +COMMENT ON COLUMN "public"."p_wallet_statement"."modified_on" IS '修改时间'; +COMMENT ON COLUMN "public"."p_wallet_statement"."deleted_on" IS '删除时间'; +COMMENT ON COLUMN "public"."p_wallet_statement"."is_del" IS '是否删除 0 为未删除、1 为已删除'; +COMMENT ON TABLE "public"."p_wallet_statement" IS '钱包流水'; + +-- ---------------------------- +-- Primary Key structure for table p_anouncement +-- ---------------------------- +ALTER TABLE "public"."p_anouncement" ADD CONSTRAINT "p_anouncement_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table p_anouncement_content +-- ---------------------------- +CREATE INDEX "idx_b_anouncement" ON "public"."p_anouncement_content" USING btree ( + "anouncement_id" "pg_catalog"."numeric_ops" ASC NULLS LAST +); +CREATE INDEX "idx_b_user" ON "public"."p_anouncement_content" USING btree ( + "user_id" "pg_catalog"."numeric_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table p_anouncement_content +-- ---------------------------- +ALTER TABLE "public"."p_anouncement_content" ADD CONSTRAINT "p_anouncement_content_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table p_attachment +-- ---------------------------- +CREATE INDEX "idx_user" ON "public"."p_attachment" USING btree ( + "user_id" "pg_catalog"."numeric_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table p_attachment +-- ---------------------------- +ALTER TABLE "public"."p_attachment" ADD CONSTRAINT "p_attachment_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table p_captcha +-- ---------------------------- +CREATE INDEX "idx_expired_on" ON "public"."p_captcha" USING btree ( + "expired_on" "pg_catalog"."numeric_ops" ASC NULLS LAST +); +CREATE INDEX "idx_phone" ON "public"."p_captcha" USING btree ( + "phone" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +CREATE INDEX "idx_use_times" ON "public"."p_captcha" USING btree ( + "use_times" "pg_catalog"."int8_ops" ASC NULLS LAST +); + +-- ---------------------------- +-- Primary Key structure for table p_captcha +-- ---------------------------- +ALTER TABLE "public"."p_captcha" ADD CONSTRAINT "p_captcha_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table p_comment +-- ---------------------------- +CREATE INDEX "idx_post" ON "public"."p_comment" USING btree ( + "post_id" "pg_catalog"."numeric_ops" ASC NULLS LAST +); From e72873cca7f8d1a26457a84510b530f1f37f3ccb Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 11 Feb 2023 17:27:46 +0800 Subject: [PATCH 17/23] sqlc: fixed topic query sql error: --- internal/dao/slonik/ce/postgres/query/topic.sql | 2 +- internal/dao/slonik/ce/postgres/topic.sql.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/dao/slonik/ce/postgres/query/topic.sql b/internal/dao/slonik/ce/postgres/query/topic.sql index b43048ca..b549b6fc 100644 --- a/internal/dao/slonik/ce/postgres/query/topic.sql +++ b/internal/dao/slonik/ce/postgres/query/topic.sql @@ -1,7 +1,7 @@ -- name: NewestTags :many SELECT t.id, t.tag, t.quote_num, u.id user_id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM p_tag t JOIN p_user u ON t.user_id = u.id -WHERE t.is_del = 0 AND t.quote_num > 0 +WHERE t.is_del = false AND t.quote_num > 0 ORDER BY t.id DESC OFFSET $1 LIMIT $2; diff --git a/internal/dao/slonik/ce/postgres/topic.sql.go b/internal/dao/slonik/ce/postgres/topic.sql.go index 79a9b757..9bf82268 100644 --- a/internal/dao/slonik/ce/postgres/topic.sql.go +++ b/internal/dao/slonik/ce/postgres/topic.sql.go @@ -159,7 +159,7 @@ func (q *Queries) InsertTags(ctx context.Context, arg *InsertTagsParams) (int64, const newestTags = `-- name: NewestTags :many SELECT t.id, t.tag, t.quote_num, u.id user_id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM p_tag t JOIN p_user u ON t.user_id = u.id -WHERE t.is_del = 0 AND t.quote_num > 0 +WHERE t.is_del = false AND t.quote_num > 0 ORDER BY t.id DESC OFFSET $1 LIMIT $2 ` From 155e5e7ba012dc26131abfd7a9e64765ce2779b6 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Thu, 16 Feb 2023 11:32:55 +0800 Subject: [PATCH 18/23] adjust some method implement about limit/offset position change --- internal/dao/slonik/topics.go | 6 +++--- internal/dao/slonik/tweets.go | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 70bfc9ee..94af2c1c 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -82,11 +82,11 @@ func (s *topicServant) DecrTagsById(ids []int64) error { }) } -func (s *topicServant) ListTags(typ cs.TagType, offset int, limit int) (res cs.TagList, _ error) { +func (s *topicServant) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagList, _ error) { ctx := context.Background() switch typ { case cs.TagTypeHot: - tags, err := s.q.HotTags(ctx, &dbr.HotTagsParams{Offset: int32(offset), Limit: int32(limit)}) + tags, err := s.q.HotTags(ctx, &dbr.HotTagsParams{Limit: int32(limit), Offset: int32(offset)}) if err != nil { return nil, err } @@ -107,7 +107,7 @@ func (s *topicServant) ListTags(typ cs.TagType, offset int, limit int) (res cs.T }) } case cs.TagTypeNew: - tags, err := s.q.NewestTags(ctx, &dbr.NewestTagsParams{Offset: int32(offset), Limit: int32(limit)}) + tags, err := s.q.NewestTags(ctx, &dbr.NewestTagsParams{Limit: int32(limit), Offset: int32(offset)}) if err != nil { return nil, err } diff --git a/internal/dao/slonik/tweets.go b/internal/dao/slonik/tweets.go index 5b6185d4..4cdd2526 100644 --- a/internal/dao/slonik/tweets.go +++ b/internal/dao/slonik/tweets.go @@ -194,7 +194,7 @@ func (s *tweetServant) GetPostByID(id int64) (*core.Post, error) { return nil, nil } -func (s *tweetServant) GetPosts(conditions *core.ConditionsT, offset, limit int) ([]*core.Post, error) { +func (s *tweetServant) GetPosts(conditions *core.ConditionsT, limit int, offset int) ([]*core.Post, error) { // TODO debug.NotImplemented() return nil, nil @@ -212,7 +212,7 @@ func (s *tweetServant) GetUserPostStar(postID, userID int64) (*core.PostStar, er return nil, nil } -func (s *tweetServant) GetUserPostStars(userID int64, offset, limit int) ([]*core.PostStar, error) { +func (s *tweetServant) GetUserPostStars(userID int64, limit int, offset int) ([]*core.PostStar, error) { // TODO debug.NotImplemented() return nil, nil @@ -230,7 +230,7 @@ func (s *tweetServant) GetUserPostCollection(postID, userID int64) (*core.PostCo return nil, nil } -func (s *tweetServant) GetUserPostCollections(userID int64, offset, limit int) ([]*core.PostCollection, error) { +func (s *tweetServant) GetUserPostCollections(userID int64, limit int, offset int) ([]*core.PostCollection, error) { // TODO debug.NotImplemented() return nil, nil @@ -242,7 +242,7 @@ func (s *tweetServant) GetUserPostCollectionCount(userID int64) (int64, error) { return 0, nil } -func (s *tweetServant) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { +func (s *tweetServant) GetUserWalletBills(userID int64, limit int, offset int) ([]*core.WalletStatement, error) { // TODO debug.NotImplemented() return nil, nil @@ -292,7 +292,7 @@ func (s *tweetServant) ReactionByTweetId(userId int64, tweetId int64) (*cs.React return nil, debug.ErrNotImplemented } -func (s *tweetServant) UserReactions(userId int64, offset int, limit int) (cs.ReactionList, error) { +func (s *tweetServant) UserReactions(userId int64, limit int, offset int) (cs.ReactionList, error) { // TODO return nil, debug.ErrNotImplemented } @@ -302,7 +302,7 @@ func (s *tweetServant) FavoriteByTweetId(userId int64, tweetId int64) (*cs.Favor return nil, debug.ErrNotImplemented } -func (s *tweetServant) UserFavorites(userId int64, offset int, limit int) (cs.FavoriteList, error) { +func (s *tweetServant) UserFavorites(userId int64, limit int, offset int) (cs.FavoriteList, error) { // TODO return nil, debug.ErrNotImplemented } From 75d65defda7a7da3e69ea0707cdf8c36ab84229f Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sun, 12 Mar 2023 12:03:01 +0800 Subject: [PATCH 19/23] fixed test error --- internal/dao/slonik/ce/postgres/models.go | 208 ++++++++++++++- .../dao/slonik/ce/postgres/query/topic.sql | 4 +- .../schema/0001_initialize_schema.down.sql | 18 +- .../schema/0001_initialize_schema.up.sql | 250 ++++++++++++++++-- .../schema/0002_post_visibility.down.sql | 1 + .../schema/0002_post_visibility.up.sql | 1 + .../schema/0003_feature_contact.down.sql | 2 + .../schema/0003_feature_contact.up.sql | 27 ++ internal/dao/slonik/ce/postgres/topic.sql.go | 4 +- internal/dao/slonik/topics.go | 5 +- 10 files changed, 477 insertions(+), 43 deletions(-) create mode 100644 internal/dao/slonik/ce/postgres/schema/0002_post_visibility.down.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0002_post_visibility.up.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0003_feature_contact.down.sql create mode 100644 internal/dao/slonik/ce/postgres/schema/0003_feature_contact.up.sql diff --git a/internal/dao/slonik/ce/postgres/models.go b/internal/dao/slonik/ce/postgres/models.go index 3d23c045..cdd22695 100644 --- a/internal/dao/slonik/ce/postgres/models.go +++ b/internal/dao/slonik/ce/postgres/models.go @@ -4,9 +4,183 @@ package dbr -import () +import ( + "github.com/jackc/pgx/v5/pgtype" +) + +type PAttachment struct { + ID int64 + UserID int64 + FileSize int64 + ImgWidth int64 + ImgHeight int64 + Type int16 + Content string + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PCaptcha struct { + ID int64 + Phone pgtype.Text + Captcha pgtype.Text + UseTimes int32 + ExpiredOn int64 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PComment struct { + ID int64 + PostID int64 + UserID int64 + Ip string + IpLoc string + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PCommentContent struct { + ID int64 + CommentID int64 + UserID int64 + Content string + Type int16 + Sort int64 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PCommentReply struct { + ID int64 + CommentID int64 + UserID int64 + AtUserID int64 + Content string + Ip string + IpLoc string + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PContact struct { + ID int64 + UserID int64 + FriendID int64 + GroupID int64 + Remark string + Status int16 + IsTop int16 + IsBlack int16 + IsDel int16 + NoticeEnable int16 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 +} + +type PContactGroup struct { + ID int64 + UserID int32 + Name string + IsDel int16 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 +} + +type PMessage struct { + ID int64 + SenderUserID int64 + ReceiverUserID int64 + Type int16 + Brief string + Content string + PostID int64 + CommentID int64 + ReplyID int64 + IsRead int16 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PPost struct { + ID int64 + UserID int64 + CommentCount int64 + CollectionCount int64 + UpvoteCount int64 + IsTop int16 + IsEssence int16 + IsLock int16 + LatestRepliedOn int64 + Tags string + AttachmentPrice int64 + Ip string + IpLoc string + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 + Visibility int16 +} + +type PPostAttachmentBill struct { + ID int64 + PostID int64 + UserID int64 + PaidAmount int64 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PPostCollection struct { + ID int64 + PostID int64 + UserID int64 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PPostContent struct { + ID int64 + PostID int64 + UserID int64 + Content string + Type int16 + Sort int16 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PPostStar struct { + ID int64 + PostID int64 + UserID int64 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} -// 主题标签 type PTag struct { ID int64 UserID int64 @@ -15,8 +189,7 @@ type PTag struct { CreatedOn int64 ModifiedOn int64 DeletedOn int64 - // 是否删除 - IsDel bool + IsDel int16 } // 用户 @@ -37,5 +210,30 @@ type PUser struct { CreatedOn int64 ModifiedOn int64 DeletedOn int64 - IsDel bool + IsDel int16 +} + +type PWalletRecharge struct { + ID int64 + UserID int64 + Amount int64 + TradeNo string + TradeStatus string + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 +} + +type PWalletStatement struct { + ID int64 + UserID int64 + ChangeAmount int64 + BalanceSnapshot int64 + Reason string + PostID int64 + CreatedOn int64 + ModifiedOn int64 + DeletedOn int64 + IsDel int16 } diff --git a/internal/dao/slonik/ce/postgres/query/topic.sql b/internal/dao/slonik/ce/postgres/query/topic.sql index b549b6fc..b7fb950c 100644 --- a/internal/dao/slonik/ce/postgres/query/topic.sql +++ b/internal/dao/slonik/ce/postgres/query/topic.sql @@ -38,7 +38,7 @@ SET quote_num = quote_num-1, WHERE id IN ( SELECT id FROM p_tag - WHERE id = ANY(@ids::bigserial[]) AND is_del = false AND quote_num >= 1 + WHERE id = ANY(@ids::BIGINT[]) AND is_del = false AND quote_num >= 1 ); -- name: IncrTags :many @@ -49,6 +49,6 @@ SET quote_num = quote_num+1, WHERE id IN ( SELECT id FROM p_tag - WHERE tag = ANY(@tags::varchar[]) + WHERE tag = ANY(@tags::VARCHAR[]) ) RETURNING id, user_id, tag, quote_num; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql index a7b22974..d1fdd15f 100644 --- a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql @@ -1,5 +1,17 @@ +DROP TABLE IF EXISTS p_attachment; +DROP TABLE IF EXISTS p_captcha; +DROP TABLE IF EXISTS p_comment; +DROP TABLE IF EXISTS p_comment_content; +DROP TABLE IF EXISTS p_comment_reply; +DROP TABLE IF EXISTS p_message; +DROP TABLE IF EXISTS p_post; +DROP TABLE IF EXISTS p_post_attachment_bill; +DROP TABLE IF EXISTS p_post_collection; +DROP TABLE IF EXISTS p_post_content; +DROP TABLE IF EXISTS p_post_star; +DROP TABLE IF EXISTS p_tag; DROP TABLE IF EXISTS p_user; -DROP INDEX IF EXISTS p_user_username_idx, p_user_phone_idx; +DROP TABLE IF EXISTS p_wallet_recharge; +DROP TABLE IF EXISTS p_wallet_statement; +DROP SEQUENCE IF EXISTS post_id_seq; -DROP TABLE IF EXISTS p_tag; -DROP INDEX IF EXISTS p_tag_tag_idx, p_tag_user_idx, p_tag_quote_num_idx; diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql index c097e776..43a68d2f 100644 --- a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql +++ b/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql @@ -1,42 +1,236 @@ --- user ddl -- +CREATE TABLE p_attachment ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL DEFAULT 0, + file_size BIGINT NOT NULL, + img_width BIGINT NOT NULL DEFAULT 0, + img_height BIGINT NOT NULL DEFAULT 0, + "type" SMALLINT NOT NULL DEFAULT 1, -- 1图片、2视频、3其他附件 + content VARCHAR(255) NOT NULL DEFAULT '', + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 -- 是否删除 0为未删除、1为已删除 +); +CREATE INDEX idx_attachment_user_id ON p_attachment USING btree (id); + +CREATE TABLE p_captcha ( + id BIGSERIAL PRIMARY KEY, + phone VARCHAR(16), + captcha VARCHAR(16), + use_times INTEGER NOT NULL DEFAULT 0, + expired_on BIGINT NOT NULL DEFAULT 0, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 -- 是否删除 0为未删除、1为已删除' +); +CREATE INDEX idx_captcha_phone ON p_captcha USING btree (phone); +CREATE INDEX idx_captcha_expired_on ON p_captcha USING btree (expired_on); +CREATE INDEX idx_captcha_use_times ON p_captcha USING btree (use_times); + +CREATE TABLE p_comment ( + id BIGSERIAL PRIMARY KEY, + post_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + ip VARCHAR(64) NOT NULL DEFAULT '', + ip_loc VARCHAR(64) NOT NULL DEFAULT '', + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_comment_post_id ON p_comment USING btree (post_id); +CREATE INDEX idx_comment_user_id ON p_comment USING btree (user_id); + +CREATE TABLE p_comment_content ( + id BIGSERIAL PRIMARY KEY, + comment_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + content VARCHAR(255) NOT NULL DEFAULT '', + "type" SMALLINT NOT NULL DEFAULT 2, -- 类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址, + sort BIGINT NOT NULL DEFAULT 100, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_comment_content_comment_id ON p_comment_content USING btree (comment_id); +CREATE INDEX idx_comment_content_user_id ON p_comment_content USING btree (user_id); +CREATE INDEX idx_comment_content_type ON p_comment_content USING btree ("type"); +CREATE INDEX idx_comment_content_sort ON p_comment_content USING btree (sort); + +CREATE TABLE p_comment_reply ( + id BIGSERIAL PRIMARY KEY, + comment_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + at_user_id BIGINT NOT NULL DEFAULT 0, + content VARCHAR(255) NOT NULL DEFAULT '', + ip VARCHAR(64) NOT NULL DEFAULT '', + ip_loc VARCHAR(64) NOT NULL DEFAULT '', + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_comment_reply_comment_id ON p_comment_reply USING btree (comment_id); + +CREATE TABLE p_message ( + id BIGSERIAL PRIMARY KEY, + sender_user_id BIGINT NOT NULL DEFAULT 0, + receiver_user_id BIGINT NOT NULL DEFAULT 0, + type SMALLINT NOT NULL DEFAULT 1, + brief VARCHAR(255) NOT NULL DEFAULT '', + content VARCHAR(255) NOT NULL DEFAULT '', + post_id BIGINT NOT NULL DEFAULT 0, + comment_id BIGINT NOT NULL DEFAULT 0, + reply_id BIGINT NOT NULL DEFAULT 0, + is_read SMALLINT NOT NULL DEFAULT 0, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_message_receiver_user_id ON p_message USING btree (receiver_user_id); +CREATE INDEX idx_message_is_read ON p_message USING btree (is_read); +CREATE INDEX idx_message_type ON p_message USING btree ("type"); + +CREATE SEQUENCE IF NOT EXISTS post_id_seq AS BIGINT MINVALUE 1080017989 NO MAXVALUE; +CREATE TABLE p_post ( + id BIGINT NOT NULL DEFAULT nextval('post_id_seq'::regclass), + user_id BIGINT NOT NULL DEFAULT 0, + comment_count BIGINT NOT NULL DEFAULT 0, + collection_count BIGINT NOT NULL DEFAULT 0, + upvote_count BIGINT NOT NULL DEFAULT 0, + is_top SMALLINT NOT NULL DEFAULT 0, -- 是否置顶 + is_essence SMALLINT NOT NULL DEFAULT 0, -- 是否精华 + is_lock SMALLINT NOT NULL DEFAULT 0, -- 是否锁定 + latest_replied_on BIGINT NOT NULL DEFAULT 0, -- 最新回复时间 + tags VARCHAR(255) NOT NULL DEFAULT '', + attachment_price BIGINT NOT NULL DEFAULT 0, -- 附件价格(分) + ip VARCHAR(64) NOT NULL DEFAULT '', -- IP地址 + ip_loc VARCHAR(64) NOT NULL DEFAULT '', -- IP城市地址 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0, + PRIMARY KEY (id) +); +CREATE INDEX idx_post_user_id ON p_post USING btree (user_id); + +CREATE TABLE p_post_attachment_bill ( + id BIGSERIAL PRIMARY KEY, + post_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + paid_amount BIGINT NOT NULL DEFAULT 0, -- 支付金额 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_post_attachment_bill_post_id ON p_post_attachment_bill USING btree (post_id); +CREATE INDEX idx_post_attachment_bill_user_id ON p_post_attachment_bill USING btree (user_id); + +CREATE TABLE p_post_collection ( + id BIGSERIAL PRIMARY KEY, + post_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_post_collection_post_id ON p_post_collection USING btree (post_id); +CREATE INDEX idx_post_collection_user_id ON p_post_collection USING btree (user_id); + +CREATE TABLE p_post_content ( + id BIGSERIAL PRIMARY KEY, + post_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + content VARCHAR(2000) NOT NULL DEFAULT '', + "type" SMALLINT NOT NULL DEFAULT 2, -- 类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址,7附件资源,8收费资源 + sort SMALLINT NOT NULL DEFAULT 100, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_post_content_post_id ON p_post_content USING btree (post_id); +CREATE INDEX idx_post_content_user_id ON p_post_content USING btree (user_id); + +CREATE TABLE p_post_star ( + id BIGSERIAL PRIMARY KEY, + post_id BIGINT NOT NULL DEFAULT 0, + user_id BIGINT NOT NULL DEFAULT 0, + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE INDEX idx_post_star_post_id ON p_post_star USING btree (post_id); +CREATE INDEX idx_post_star_user_id ON p_post_star USING btree (user_id); + +CREATE TABLE p_tag ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL DEFAULT 0, + tag VARCHAR(255) NOT NULL, + quote_num BIGINT NOT NULL DEFAULT 0, -- 引用数 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 +); +CREATE UNIQUE INDEX idx_tag_tag ON p_tag USING btree (tag); +CREATE INDEX idx_tag_user_id ON p_tag USING btree (user_id); +CREATE INDEX idx_tag_quote_num ON p_tag USING btree (quote_num); + CREATE TABLE p_user ( - id bigserial PRIMARY KEY, + id BIGSERIAL PRIMARY KEY, nickname VARCHAR(32) NOT NULL DEFAULT '', username VARCHAR(32) NOT NULL DEFAULT '', - phone VARCHAR(16) NOT NULL DEFAULT '', - PASSWORD VARCHAR(32) NOT NULL DEFAULT '', - salt VARCHAR(16) NOT NULL DEFAULT '', - status SMALLINT NOT NULL DEFAULT 1, + phone VARCHAR(16) NOT NULL DEFAULT '', -- 手机号 + password VARCHAR(32) NOT NULL DEFAULT '', -- MD5密码 + salt VARCHAR(16) NOT NULL DEFAULT '', -- 盐值 + status SMALLINT NOT NULL DEFAULT 1, -- 状态,1正常,2停用 avatar VARCHAR(255) NOT NULL DEFAULT '', - balance BIGINT NOT NULL, - is_admin BOOLEAN NOT NULL DEFAULT FALSE, - created_on BIGINT NOT NULL, - modified_on BIGINT NOT NULL, - deleted_on BIGINT NOT NULL, - is_del BOOLEAN NOT NULL DEFAULT FALSE, - UNIQUE (username) + balance BIGINT NOT NULL, -- 用户余额(分) + is_admin BOOLEAN NOT NULL DEFAULT false, -- 是否管理员 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 ); COMMENT ON TABLE p_user IS '用户'; COMMENT ON COLUMN p_user.password IS 'MD5密码'; COMMENT ON COLUMN p_user.status IS '状态, 1正常, 2停用'; COMMENT ON COLUMN p_user.balance IS '用户余额(分)'; -CREATE UNIQUE INDEX p_user_username_idx ON p_user (username); -CREATE INDEX p_user_phone_idx ON p_user (phone); +CREATE UNIQUE INDEX idx_user_username ON p_user USING btree (username); +CREATE INDEX idx_user_phone ON p_user USING btree (phone); --- tag ddl -- -CREATE TABLE p_tag ( - id bigserial PRIMARY KEY, - user_id bigserial NOT NULL, - tag VARCHAR(255) NOT NULL, - quote_num BIGINT NOT NULL DEFAULT 0, +CREATE TABLE p_wallet_recharge ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL DEFAULT 0, + amount BIGINT NOT NULL DEFAULT 0, -- 充值金额 + trade_no VARCHAR(64) NOT NULL DEFAULT '', -- 支付宝订单号 + trade_status VARCHAR(32) NOT NULL DEFAULT '', -- 交易状态 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0, + is_del SMALLINT NOT NULL DEFAULT 0 -- 是否删除 0 为未删除、1 为已删除 +); +CREATE INDEX idx_wallet_recharge_user_id ON p_wallet_recharge USING btree (user_id); +CREATE INDEX idx_wallet_recharge_trade_no ON p_wallet_recharge USING btree (trade_no); +CREATE INDEX idx_wallet_recharge_trade_status ON p_wallet_recharge USING btree (trade_status); + +CREATE TABLE p_wallet_statement ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL DEFAULT 0, + change_amount BIGINT NOT NULL DEFAULT 0, -- 变动金额 + balance_snapshot BIGINT NOT NULL DEFAULT 0, -- 资金快照 + reason VARCHAR(255) NOT NULL, -- 变动原因 + post_id BIGINT NOT NULL DEFAULT 0, -- 关联动态 created_on BIGINT NOT NULL DEFAULT 0, modified_on BIGINT NOT NULL DEFAULT 0, deleted_on BIGINT NOT NULL DEFAULT 0, - is_del BOOLEAN NOT NULL DEFAULT FALSE, - UNIQUE (tag) + is_del SMALLINT NOT NULL DEFAULT 0 ); -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); +CREATE INDEX idx_wallet_statement_user_id ON p_wallet_statement USING btree (user_id); diff --git a/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.down.sql b/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.down.sql new file mode 100644 index 00000000..2c9986ac --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.down.sql @@ -0,0 +1 @@ +ALTER TABLE p_post DROP COLUMN visibility; diff --git a/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.up.sql b/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.up.sql new file mode 100644 index 00000000..673432ab --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.up.sql @@ -0,0 +1 @@ +ALTER TABLE p_post ADD COLUMN visibility SMALLINT NOT NULL DEFAULT 0; -- 可见性 0公开 1私密 2好友可见 diff --git a/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.down.sql b/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.down.sql new file mode 100644 index 00000000..d3eb2b4e --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS p_contact; +DROP TABLE IF EXISTS p_contact_group; diff --git a/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.up.sql b/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.up.sql new file mode 100644 index 00000000..9177db77 --- /dev/null +++ b/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.up.sql @@ -0,0 +1,27 @@ +CREATE TABLE p_contact ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL, + friend_id BIGINT NOT NULL, + group_id BIGINT NOT NULL DEFAULT 0, -- 好友分组ID:默认为0无分组 + remark VARCHAR(32) NOT NULL DEFAULT '', -- 好友备注 + status SMALLINT NOT NULL DEFAULT 0, -- 好友状态: 1请求好友, 2已好友, 3拒绝好友, 4已删好友 + is_top SMALLINT NOT NULL DEFAULT 0, -- 是否置顶, 0否, 1是 + is_black SMALLINT NOT NULL DEFAULT 0, -- 是否为黑名单, 0否, 1是 + is_del SMALLINT NOT NULL DEFAULT 0, -- 否删除好友, 0否, 1是 + notice_enable SMALLINT NOT NULL DEFAULT 0, -- 是否有消息提醒, 0否, 1是 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0 +); +CREATE UNIQUE INDEX idx_contact_user_friend ON p_contact USING btree (user_id,friend_id); +CREATE INDEX idx_contact_user_friend_status ON p_contact USING btree (user_id, friend_id, status); + +CREATE TABLE p_contact_group ( + id BIGSERIAL PRIMARY KEY, + user_id int NOT NULL DEFAULT 0, + name VARCHAR(32) NOT NULL DEFAULT '', -- 分组名称 + is_del SMALLINT NOT NULL DEFAULT 1, -- 是否删除, 0否, 1是 + created_on BIGINT NOT NULL DEFAULT 0, + modified_on BIGINT NOT NULL DEFAULT 0, + deleted_on BIGINT NOT NULL DEFAULT 0 +); diff --git a/internal/dao/slonik/ce/postgres/topic.sql.go b/internal/dao/slonik/ce/postgres/topic.sql.go index 49dd48a2..f25a27e8 100644 --- a/internal/dao/slonik/ce/postgres/topic.sql.go +++ b/internal/dao/slonik/ce/postgres/topic.sql.go @@ -16,7 +16,7 @@ SET quote_num = quote_num-1, WHERE id IN ( SELECT id FROM p_tag - WHERE id = ANY($2::bigserial[]) AND is_del = false AND quote_num >= 1 + WHERE id = ANY($2::BIGINT[]) AND is_del = false AND quote_num >= 1 ) ` @@ -93,7 +93,7 @@ SET quote_num = quote_num+1, WHERE id IN ( SELECT id FROM p_tag - WHERE tag = ANY($2::varchar[]) + WHERE tag = ANY($2::VARCHAR[]) ) RETURNING id, user_id, tag, quote_num ` diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index 94af2c1c..a1ce3d7d 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -13,7 +13,6 @@ import ( "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/ce/postgres" - "github.com/rocboss/paopao-ce/pkg/types" ) var ( @@ -30,7 +29,7 @@ func (s *topicServant) UpsertTags(userId int64, tags []string) (res cs.TagInfoLi err = s.with(func(c context.Context, q dbr.Querier) error { now := time.Now().Unix() upTags, err := q.IncrTags(c, &dbr.IncrTagsParams{ - Tags: types.PgxArray(tags), + Tags: tags, ModifiedOn: now, }) if err != nil { @@ -77,7 +76,7 @@ func (s *topicServant) UpsertTags(userId int64, tags []string) (res cs.TagInfoLi func (s *topicServant) DecrTagsById(ids []int64) error { return s.q.DecrTagsById(context.Background(), &dbr.DecrTagsByIdParams{ - Ids: types.PgxArray(ids), + Ids: ids, ModifiedOn: time.Now().Unix(), }) } From 20187c095faa8fc614d44b4f3f769603694cc8a6 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Mon, 20 Mar 2023 17:15:08 +0800 Subject: [PATCH 20/23] optimize slonik data simple logic --- internal/dao/slonik/authority.go | 20 ++--- internal/dao/slonik/comments.go | 42 +++++----- internal/dao/slonik/contacts.go | 22 +++--- internal/dao/slonik/messages.go | 22 +++--- internal/dao/slonik/pgx.go | 18 ++--- internal/dao/slonik/security.go | 16 ++-- internal/dao/slonik/slonik.go | 30 +++++-- internal/dao/slonik/timeline.go | 64 +++++++-------- internal/dao/slonik/topics.go | 18 ++--- internal/dao/slonik/tweets.go | 130 +++++++++++++++---------------- internal/dao/slonik/user.go | 24 +++--- internal/dao/slonik/wallet.go | 22 +++--- 12 files changed, 223 insertions(+), 205 deletions(-) diff --git a/internal/dao/slonik/authority.go b/internal/dao/slonik/authority.go index cb08e465..0981489d 100644 --- a/internal/dao/slonik/authority.go +++ b/internal/dao/slonik/authority.go @@ -11,45 +11,45 @@ import ( ) var ( - _ core.AuthorizationManageService = (*authorizationManageServant)(nil) + _ core.AuthorizationManageService = (*authorizationManageSrv)(nil) ) -type authorizationManageServant struct { - *pgxServant +type authorizationManageSrv struct { + *pgxSrv } -func (s *authorizationManageServant) IsAllow(user *core.User, action *core.Action) bool { +func (s *authorizationManageSrv) IsAllow(user *core.User, action *core.Action) bool { // TODO debug.NotImplemented() return false } -func (s *authorizationManageServant) MyFriendSet(userId int64) core.FriendSet { +func (s *authorizationManageSrv) MyFriendSet(userId int64) core.FriendSet { // TODO debug.NotImplemented() return nil } -func (s *authorizationManageServant) BeFriendFilter(userId int64) core.FriendFilter { +func (s *authorizationManageSrv) BeFriendFilter(userId int64) core.FriendFilter { // TODO debug.NotImplemented() return nil } -func (s *authorizationManageServant) BeFriendIds(userId int64) ([]int64, error) { +func (s *authorizationManageSrv) BeFriendIds(userId int64) ([]int64, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *authorizationManageServant) isFriend(userId int64, friendId int64) bool { +func (s *authorizationManageSrv) isFriend(userId int64, friendId int64) bool { // TODO debug.NotImplemented() return false } func newAuthorizationManageService(db *pgx.Conn) core.AuthorizationManageService { - return &authorizationManageServant{ - pgxServant: newPgxServant(db), + return &authorizationManageSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/comments.go b/internal/dao/slonik/comments.go index d4c0ece8..25cff917 100644 --- a/internal/dao/slonik/comments.go +++ b/internal/dao/slonik/comments.go @@ -11,92 +11,92 @@ import ( ) var ( - _ core.CommentService = (*commentServant)(nil) - _ core.CommentManageService = (*commentManageServant)(nil) + _ core.CommentService = (*commentSrv)(nil) + _ core.CommentManageService = (*commentManageSrv)(nil) ) -type commentServant struct { - *pgxServant +type commentSrv struct { + *pgxSrv } -type commentManageServant struct { - *pgxServant +type commentManageSrv struct { + *pgxSrv } -func (s *commentServant) GetComments(conditions *core.ConditionsT, offset, limit int) ([]*core.Comment, error) { +func (s *commentSrv) GetComments(conditions *core.ConditionsT, offset, limit int) ([]*core.Comment, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentServant) GetCommentByID(id int64) (*core.Comment, error) { +func (s *commentSrv) GetCommentByID(id int64) (*core.Comment, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentServant) GetCommentReplyByID(id int64) (*core.CommentReply, error) { +func (s *commentSrv) GetCommentReplyByID(id int64) (*core.CommentReply, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentServant) GetCommentCount(conditions *core.ConditionsT) (int64, error) { +func (s *commentSrv) GetCommentCount(conditions *core.ConditionsT) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *commentServant) GetCommentContentsByIDs(ids []int64) ([]*core.CommentContent, error) { +func (s *commentSrv) GetCommentContentsByIDs(ids []int64) ([]*core.CommentContent, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentServant) GetCommentRepliesByID(ids []int64) ([]*core.CommentReplyFormated, error) { +func (s *commentSrv) GetCommentRepliesByID(ids []int64) ([]*core.CommentReplyFormated, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentManageServant) DeleteComment(comment *core.Comment) error { +func (s *commentManageSrv) DeleteComment(comment *core.Comment) error { // TODO debug.NotImplemented() return nil } -func (s *commentManageServant) CreateComment(comment *core.Comment) (*core.Comment, error) { +func (s *commentManageSrv) CreateComment(comment *core.Comment) (*core.Comment, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentManageServant) CreateCommentReply(reply *core.CommentReply) (*core.CommentReply, error) { +func (s *commentManageSrv) CreateCommentReply(reply *core.CommentReply) (*core.CommentReply, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *commentManageServant) DeleteCommentReply(reply *core.CommentReply) error { +func (s *commentManageSrv) DeleteCommentReply(reply *core.CommentReply) error { // TODO debug.NotImplemented() return nil } -func (s *commentManageServant) CreateCommentContent(content *core.CommentContent) (*core.CommentContent, error) { +func (s *commentManageSrv) CreateCommentContent(content *core.CommentContent) (*core.CommentContent, error) { // TODO debug.NotImplemented() return nil, nil } func newCommentService(db *pgx.Conn) core.CommentService { - return &commentServant{ - pgxServant: newPgxServant(db), + return &commentSrv{ + pgxSrv: newPgxSrv(db), } } func newCommentManageService(db *pgx.Conn) core.CommentManageService { - return &commentManageServant{ - pgxServant: newPgxServant(db), + return &commentManageSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/contacts.go b/internal/dao/slonik/contacts.go index a03a9519..393c9671 100644 --- a/internal/dao/slonik/contacts.go +++ b/internal/dao/slonik/contacts.go @@ -11,51 +11,51 @@ import ( ) var ( - _ core.ContactManageService = (*contactManageServant)(nil) + _ core.ContactManageService = (*contactManageSrv)(nil) ) -type contactManageServant struct { - *pgxServant +type contactManageSrv struct { + *pgxSrv } -func (s *contactManageServant) RequestingFriend(userId int64, friendId int64, greetings string) (err error) { +func (s *contactManageSrv) RequestingFriend(userId int64, friendId int64, greetings string) (err error) { // TODO debug.NotImplemented() return nil } -func (s *contactManageServant) AddFriend(userId int64, friendId int64) (err error) { +func (s *contactManageSrv) AddFriend(userId int64, friendId int64) (err error) { // TODO debug.NotImplemented() return nil } -func (s *contactManageServant) RejectFriend(userId int64, friendId int64) (err error) { +func (s *contactManageSrv) RejectFriend(userId int64, friendId int64) (err error) { // TODO debug.NotImplemented() return nil } -func (s *contactManageServant) DeleteFriend(userId int64, friendId int64) (err error) { +func (s *contactManageSrv) DeleteFriend(userId int64, friendId int64) (err error) { // TODO debug.NotImplemented() return nil } -func (s *contactManageServant) GetContacts(userId int64, offset int, limit int) (*core.ContactList, error) { +func (s *contactManageSrv) GetContacts(userId int64, offset int, limit int) (*core.ContactList, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *contactManageServant) IsFriend(userId int64, friendId int64) bool { +func (s *contactManageSrv) IsFriend(userId int64, friendId int64) bool { // TODO debug.NotImplemented() return false } func newContactManageService(db *pgx.Conn) core.ContactManageService { - return &contactManageServant{ - pgxServant: newPgxServant(db), + return &contactManageSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/messages.go b/internal/dao/slonik/messages.go index 51742aca..1aa2ca19 100644 --- a/internal/dao/slonik/messages.go +++ b/internal/dao/slonik/messages.go @@ -11,51 +11,51 @@ import ( ) var ( - _ core.MessageService = (*messageServant)(nil) + _ core.MessageService = (*messageSrv)(nil) ) -type messageServant struct { - *pgxServant +type messageSrv struct { + *pgxSrv } -func (s *messageServant) CreateMessage(msg *core.Message) (*core.Message, error) { +func (s *messageSrv) CreateMessage(msg *core.Message) (*core.Message, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *messageServant) GetUnreadCount(userID int64) (int64, error) { +func (s *messageSrv) GetUnreadCount(userID int64) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *messageServant) GetMessageByID(id int64) (*core.Message, error) { +func (s *messageSrv) GetMessageByID(id int64) (*core.Message, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *messageServant) ReadMessage(message *core.Message) error { +func (s *messageSrv) ReadMessage(message *core.Message) error { // TODO debug.NotImplemented() return nil } -func (s *messageServant) GetMessages(conditions *core.ConditionsT, offset, limit int) ([]*core.MessageFormated, error) { +func (s *messageSrv) GetMessages(conditions *core.ConditionsT, offset, limit int) ([]*core.MessageFormated, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *messageServant) GetMessageCount(conditions *core.ConditionsT) (int64, error) { +func (s *messageSrv) GetMessageCount(conditions *core.ConditionsT) (int64, error) { // TODO debug.NotImplemented() return 0, nil } func newMessageService(db *pgx.Conn) core.MessageService { - return &messageServant{ - pgxServant: newPgxServant(db), + return &messageSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go index 54ece04a..32dea035 100644 --- a/internal/dao/slonik/pgx.go +++ b/internal/dao/slonik/pgx.go @@ -18,12 +18,12 @@ var ( _oncePgx sync.Once ) -type pgxServant struct { +type pgxSrv struct { db *pgx.Conn q dbr.Querier } -func (s *pgxServant) begin(ctx context.Context) (pgx.Tx, dbr.Querier, error) { +func (s *pgxSrv) begin(ctx context.Context) (pgx.Tx, dbr.Querier, error) { tx, err := s.db.Begin(ctx) if err != nil { return nil, nil, err @@ -31,7 +31,7 @@ func (s *pgxServant) begin(ctx context.Context) (pgx.Tx, dbr.Querier, error) { return tx, dbr.New(tx), nil } -func (s *pgxServant) beingTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, dbr.Querier, error) { +func (s *pgxSrv) beingTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, dbr.Querier, error) { tx, err := s.db.BeginTx(ctx, txOptions) if err != nil { return nil, nil, err @@ -39,7 +39,7 @@ func (s *pgxServant) beingTx(ctx context.Context, txOptions pgx.TxOptions) (pgx. return tx, dbr.New(tx), nil } -func (s *pgxServant) with(handle func(c context.Context, q dbr.Querier) error) error { +func (s *pgxSrv) with(handle func(c context.Context, q dbr.Querier) error) error { ctx := context.Background() tx, err := s.db.Begin(ctx) if err != nil { @@ -52,7 +52,7 @@ func (s *pgxServant) with(handle func(c context.Context, q dbr.Querier) error) e return tx.Commit(ctx) } -func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(ctx context.Context, q dbr.Querier) error) error { +func (s *pgxSrv) withTx(txOptions pgx.TxOptions, handle func(ctx context.Context, q dbr.Querier) error) error { ctx := context.Background() tx, err := s.db.BeginTx(ctx, txOptions) if err != nil { @@ -65,7 +65,7 @@ func (s *pgxServant) withTx(txOptions pgx.TxOptions, handle func(ctx context.Con return tx.Commit(ctx) } -func (s *pgxServant) withCtx(ctx context.Context, handle func(dbr.Querier) error) error { +func (s *pgxSrv) withCtx(ctx context.Context, handle func(dbr.Querier) error) error { tx, err := s.db.Begin(ctx) if err != nil { return err @@ -77,7 +77,7 @@ func (s *pgxServant) withCtx(ctx context.Context, handle func(dbr.Querier) error return tx.Commit(ctx) } -func (s *pgxServant) withTxCtx(ctx context.Context, txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { +func (s *pgxSrv) withTxCtx(ctx context.Context, txOptions pgx.TxOptions, handle func(dbr.Querier) error) error { tx, err := s.db.BeginTx(ctx, txOptions) if err != nil { return err @@ -89,8 +89,8 @@ func (s *pgxServant) withTxCtx(ctx context.Context, txOptions pgx.TxOptions, han return tx.Commit(ctx) } -func newPgxServant(db *pgx.Conn) *pgxServant { - return &pgxServant{ +func newPgxSrv(db *pgx.Conn) *pgxSrv { + return &pgxSrv{ db: db, q: dbr.New(db), } diff --git a/internal/dao/slonik/security.go b/internal/dao/slonik/security.go index 00281421..8d3aff80 100644 --- a/internal/dao/slonik/security.go +++ b/internal/dao/slonik/security.go @@ -11,36 +11,36 @@ import ( ) var ( - _ core.SecurityService = (*securityServant)(nil) + _ core.SecurityService = (*securitySrv)(nil) ) -type securityServant struct { - *pgxServant +type securitySrv struct { + *pgxSrv } // GetLatestPhoneCaptcha 获取最新短信验证码 -func (s *securityServant) GetLatestPhoneCaptcha(phone string) (*core.Captcha, error) { +func (s *securitySrv) GetLatestPhoneCaptcha(phone string) (*core.Captcha, error) { // TODO debug.NotImplemented() return nil, nil } // UsePhoneCaptcha 更新短信验证码 -func (s *securityServant) UsePhoneCaptcha(captcha *core.Captcha) error { +func (s *securitySrv) UsePhoneCaptcha(captcha *core.Captcha) error { // TODO debug.NotImplemented() return nil } // SendPhoneCaptcha 发送短信验证码 -func (s *securityServant) SendPhoneCaptcha(phone string) error { +func (s *securitySrv) SendPhoneCaptcha(phone string) error { // TODO debug.NotImplemented() return nil } func newSecurityService(db *pgx.Conn, phoneVerify core.PhoneVerifyService) core.SecurityService { - return &securityServant{ - pgxServant: newPgxServant(db), + return &securitySrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/slonik.go b/internal/dao/slonik/slonik.go index aa0aef65..b3b27e53 100644 --- a/internal/dao/slonik/slonik.go +++ b/internal/dao/slonik/slonik.go @@ -14,11 +14,14 @@ import ( ) var ( - _ core.DataService = (*dataServant)(nil) - _ core.VersionInfo = (*dataServant)(nil) + _ core.DataService = (*dataSrv)(nil) + _ core.VersionInfo = (*dataSrv)(nil) + + _ core.DataServantA = (*dataSrvA)(nil) + _ core.VersionInfo = (*dataSrvA)(nil) ) -type dataServant struct { +type dataSrv struct { core.IndexPostsService core.WalletService core.MessageService @@ -34,6 +37,13 @@ type dataServant struct { core.AttachmentCheckService } +type dataSrvA struct { + core.TopicServantA + core.TweetServantA + core.TweetManageServantA + core.TweetHelpServantA +} + func NewDataService() (core.DataService, core.VersionInfo) { var ( v core.VersionInfo @@ -70,7 +80,7 @@ func NewDataService() (core.DataService, core.VersionInfo) { } logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version()) - ds := &dataServant{ + ds := &dataSrv{ IndexPostsService: cis, WalletService: newWalletService(db), MessageService: newMessageService(db), @@ -97,10 +107,18 @@ func NewAuthorizationManageService() core.AuthorizationManageService { return newAuthorizationManageService(pgxDB()) } -func (s *dataServant) Name() string { +func (s *dataSrv) Name() string { + return "sqlc/pgx" +} + +func (s *dataSrv) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *dataSrvA) Name() string { return "sqlc/pgx" } -func (s *dataServant) Version() *semver.Version { +func (s *dataSrvA) Version() *semver.Version { return semver.MustParse("v0.1.0") } diff --git a/internal/dao/slonik/timeline.go b/internal/dao/slonik/timeline.go index e6b9eeb6..f5c9fb3a 100644 --- a/internal/dao/slonik/timeline.go +++ b/internal/dao/slonik/timeline.go @@ -12,101 +12,101 @@ import ( ) var ( - _ core.IndexPostsService = (*friendIndexServant)(nil) - _ core.IndexPostsService = (*followIndexServant)(nil) - _ core.IndexPostsService = (*lightIndexServant)(nil) - _ core.IndexPostsService = (*simpleIndexPostsServant)(nil) + _ core.IndexPostsService = (*friendIndexSrv)(nil) + _ core.IndexPostsService = (*followIndexSrv)(nil) + _ core.IndexPostsService = (*lightIndexSrv)(nil) + _ core.IndexPostsService = (*simpleIndexPostsSrv)(nil) ) -type friendIndexServant struct { - *pgxServant +type friendIndexSrv struct { + *pgxSrv ams core.AuthorizationManageService ths core.TweetHelpService } -type followIndexServant struct { - *pgxServant +type followIndexSrv struct { + *pgxSrv ths core.TweetHelpService } -type lightIndexServant struct { - *pgxServant +type lightIndexSrv struct { + *pgxSrv ths core.TweetHelpService } -type simpleIndexPostsServant struct { - *pgxServant +type simpleIndexPostsSrv struct { + *pgxSrv ths core.TweetHelpService } // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; -func (s *friendIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { +func (s *friendIndexSrv) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *friendIndexServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { +func (s *friendIndexSrv) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { // TODO return nil, debug.ErrNotImplemented } // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; -func (s *followIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { +func (s *followIndexSrv) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *followIndexServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { +func (s *followIndexSrv) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { // TODO return nil, debug.ErrNotImplemented } // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; -func (s *lightIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { +func (s *lightIndexSrv) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *lightIndexServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { +func (s *lightIndexSrv) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { // TODO return nil, debug.ErrNotImplemented } // simpleCacheIndexGetPosts simpleCacheIndex 专属获取广场推文列表函数 -func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit int) (*core.IndexTweetList, error) { +func (s *simpleIndexPostsSrv) IndexPosts(_user *core.User, offset int, limit int) (*core.IndexTweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *simpleIndexPostsServant) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { +func (s *simpleIndexPostsSrv) TweetTimeline(userId int64, offset int, limit int) (*cs.TweetBox, error) { // TODO return nil, debug.ErrNotImplemented } func newFriendIndexService(db *pgx.Conn, ams core.AuthorizationManageService, ths core.TweetHelpService) core.IndexPostsService { - return &friendIndexServant{ - ams: ams, - pgxServant: newPgxServant(db), + return &friendIndexSrv{ + ams: ams, + pgxSrv: newPgxSrv(db), } } func newFollowIndexService(db *pgx.Conn, ths core.TweetHelpService) core.IndexPostsService { - return &followIndexServant{ - ths: ths, - pgxServant: newPgxServant(db), + return &followIndexSrv{ + ths: ths, + pgxSrv: newPgxSrv(db), } } func newLightIndexService(db *pgx.Conn, ths core.TweetHelpService) core.IndexPostsService { - return &lightIndexServant{ - ths: ths, - pgxServant: newPgxServant(db), + return &lightIndexSrv{ + ths: ths, + pgxSrv: newPgxSrv(db), } } func newSimpleIndexPostsService(db *pgx.Conn, ths core.TweetHelpService) core.IndexPostsService { - return &simpleIndexPostsServant{ - ths: ths, - pgxServant: newPgxServant(db), + return &simpleIndexPostsSrv{ + ths: ths, + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index a1ce3d7d..e6640e09 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -16,16 +16,16 @@ import ( ) var ( - _ core.TopicService = (*topicServant)(nil) + _ core.TopicService = (*topicSrv)(nil) ) -type topicServant struct { - *pgxServant +type topicSrv struct { + *pgxSrv } // UpsertTags update/insert tags info. // Assume tags slice is distinct elements. -func (s *topicServant) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, err error) { +func (s *topicSrv) UpsertTags(userId int64, tags []string) (res cs.TagInfoList, err error) { err = s.with(func(c context.Context, q dbr.Querier) error { now := time.Now().Unix() upTags, err := q.IncrTags(c, &dbr.IncrTagsParams{ @@ -74,14 +74,14 @@ func (s *topicServant) UpsertTags(userId int64, tags []string) (res cs.TagInfoLi return } -func (s *topicServant) DecrTagsById(ids []int64) error { +func (s *topicSrv) DecrTagsById(ids []int64) error { return s.q.DecrTagsById(context.Background(), &dbr.DecrTagsByIdParams{ Ids: ids, ModifiedOn: time.Now().Unix(), }) } -func (s *topicServant) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagList, _ error) { +func (s *topicSrv) ListTags(typ cs.TagType, limit int, offset int) (res cs.TagList, _ error) { ctx := context.Background() switch typ { case cs.TagTypeHot: @@ -130,7 +130,7 @@ func (s *topicServant) ListTags(typ cs.TagType, limit int, offset int) (res cs.T return } -func (s *topicServant) TagsByKeyword(keyword string) (res cs.TagInfoList, _ error) { +func (s *topicSrv) TagsByKeyword(keyword string) (res cs.TagInfoList, _ error) { ctx := context.Background() keyword = "%" + strings.Trim(keyword, " ") + "%" if keyword == "%%" { @@ -164,7 +164,7 @@ func (s *topicServant) TagsByKeyword(keyword string) (res cs.TagInfoList, _ erro } func newTopicService(db *pgx.Conn) core.TopicService { - return &topicServant{ - pgxServant: newPgxServant(db), + return &topicSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/tweets.go b/internal/dao/slonik/tweets.go index 4cdd2526..fe3a535f 100644 --- a/internal/dao/slonik/tweets.go +++ b/internal/dao/slonik/tweets.go @@ -13,319 +13,319 @@ import ( ) var ( - _ core.TweetService = (*tweetServant)(nil) - _ core.TweetManageService = (*tweetManageServant)(nil) - _ core.TweetHelpService = (*tweetHelpServant)(nil) + _ core.TweetService = (*tweetSrv)(nil) + _ core.TweetManageService = (*tweetManageSrv)(nil) + _ core.TweetHelpService = (*tweetHelpSrv)(nil) ) -type tweetServant struct { - *pgxServant +type tweetSrv struct { + *pgxSrv } -type tweetManageServant struct { - *pgxServant +type tweetManageSrv struct { + *pgxSrv } -type tweetHelpServant struct { - *pgxServant +type tweetHelpSrv struct { + *pgxSrv } // MergePosts post数据整合 -func (s *tweetHelpServant) MergePosts(posts []*core.Post) ([]*core.PostFormated, error) { +func (s *tweetHelpSrv) MergePosts(posts []*core.Post) ([]*core.PostFormated, error) { // TODO debug.NotImplemented() return nil, nil } // RevampPosts post数据整形修复 -func (s *tweetHelpServant) RevampPosts(posts []*core.PostFormated) ([]*core.PostFormated, error) { +func (s *tweetHelpSrv) RevampPosts(posts []*core.PostFormated) ([]*core.PostFormated, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetHelpServant) RevampTweets(tweets cs.TweetList) (cs.TweetList, error) { +func (s *tweetHelpSrv) RevampTweets(tweets cs.TweetList) (cs.TweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetHelpServant) MergeTweets(tweets cs.TweetInfo) (cs.TweetList, error) { +func (s *tweetHelpSrv) MergeTweets(tweets cs.TweetInfo) (cs.TweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetHelpServant) getPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { +func (s *tweetHelpSrv) getPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetHelpServant) getUsersByIDs(ids []int64) ([]*core.User, error) { +func (s *tweetHelpSrv) getUsersByIDs(ids []int64) ([]*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) CreatePostCollection(postID, userID int64) (*core.PostCollection, error) { +func (s *tweetManageSrv) CreatePostCollection(postID, userID int64) (*core.PostCollection, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) DeletePostCollection(p *core.PostCollection) error { +func (s *tweetManageSrv) DeletePostCollection(p *core.PostCollection) error { // TODO debug.NotImplemented() return nil } -func (s *tweetManageServant) CreatePostContent(content *core.PostContent) (*core.PostContent, error) { +func (s *tweetManageSrv) CreatePostContent(content *core.PostContent) (*core.PostContent, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) CreatePost(post *core.Post) (*core.Post, error) { +func (s *tweetManageSrv) CreatePost(post *core.Post) (*core.Post, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) DeletePost(post *core.Post) ([]string, error) { +func (s *tweetManageSrv) DeletePost(post *core.Post) ([]string, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) deleteCommentByPostId(db *gorm.DB, postId int64) ([]string, error) { +func (s *tweetManageSrv) deleteCommentByPostId(db *gorm.DB, postId int64) ([]string, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) LockPost(post *core.Post) error { +func (s *tweetManageSrv) LockPost(post *core.Post) error { // TODO debug.NotImplemented() return nil } -func (s *tweetManageServant) StickPost(post *core.Post) error { +func (s *tweetManageSrv) StickPost(post *core.Post) error { // TODO debug.NotImplemented() return nil } -func (s *tweetManageServant) VisiblePost(post *core.Post, visibility core.PostVisibleT) error { +func (s *tweetManageSrv) VisiblePost(post *core.Post, visibility core.PostVisibleT) error { // TODO debug.NotImplemented() return nil } -func (s *tweetManageServant) UpdatePost(post *core.Post) error { +func (s *tweetManageSrv) UpdatePost(post *core.Post) error { // TODO debug.NotImplemented() return nil } -func (s *tweetManageServant) CreatePostStar(postID, userID int64) (*core.PostStar, error) { +func (s *tweetManageSrv) CreatePostStar(postID, userID int64) (*core.PostStar, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetManageServant) DeletePostStar(p *core.PostStar) error { +func (s *tweetManageSrv) DeletePostStar(p *core.PostStar) error { // TODO debug.NotImplemented() return nil } -func (s *tweetManageServant) CreateAttachment(obj *cs.Attachment) (int64, error) { +func (s *tweetManageSrv) CreateAttachment(obj *cs.Attachment) (int64, error) { // TODO return 0, debug.ErrNotImplemented } -func (s *tweetManageServant) CreateTweet(userId int64, req *cs.NewTweetReq) (*cs.TweetItem, error) { +func (s *tweetManageSrv) CreateTweet(userId int64, req *cs.NewTweetReq) (*cs.TweetItem, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetManageServant) DeleteTweet(userId int64, tweetId int64) ([]string, error) { +func (s *tweetManageSrv) DeleteTweet(userId int64, tweetId int64) ([]string, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetManageServant) LockTweet(userId int64, tweetId int64) error { +func (s *tweetManageSrv) LockTweet(userId int64, tweetId int64) error { // TODO return debug.ErrNotImplemented } -func (s *tweetManageServant) StickTweet(userId int64, tweetId int64) error { +func (s *tweetManageSrv) StickTweet(userId int64, tweetId int64) error { // TODO return debug.ErrNotImplemented } -func (s *tweetManageServant) VisibleTweet(userId int64, visibility cs.TweetVisibleType) error { +func (s *tweetManageSrv) VisibleTweet(userId int64, visibility cs.TweetVisibleType) error { // TODO return debug.ErrNotImplemented } -func (s *tweetManageServant) CreateReaction(userId int64, tweetId int64) error { +func (s *tweetManageSrv) CreateReaction(userId int64, tweetId int64) error { // TODO return debug.ErrNotImplemented } -func (s *tweetManageServant) DeleteReaction(userId int64, reactionId int64) error { +func (s *tweetManageSrv) DeleteReaction(userId int64, reactionId int64) error { // TODO return debug.ErrNotImplemented } -func (s *tweetManageServant) CreateFavorite(userId int64, tweetId int64) error { +func (s *tweetManageSrv) CreateFavorite(userId int64, tweetId int64) error { // TODO return debug.ErrNotImplemented } -func (s *tweetManageServant) DeleteFavorite(userId int64, favoriteId int64) error { +func (s *tweetManageSrv) DeleteFavorite(userId int64, favoriteId int64) error { // TODO return debug.ErrNotImplemented } -func (s *tweetServant) GetPostByID(id int64) (*core.Post, error) { +func (s *tweetSrv) GetPostByID(id int64) (*core.Post, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetPosts(conditions *core.ConditionsT, limit int, offset int) ([]*core.Post, error) { +func (s *tweetSrv) GetPosts(conditions *core.ConditionsT, limit int, offset int) ([]*core.Post, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetPostCount(conditions *core.ConditionsT) (int64, error) { +func (s *tweetSrv) GetPostCount(conditions *core.ConditionsT) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *tweetServant) GetUserPostStar(postID, userID int64) (*core.PostStar, error) { +func (s *tweetSrv) GetUserPostStar(postID, userID int64) (*core.PostStar, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetUserPostStars(userID int64, limit int, offset int) ([]*core.PostStar, error) { +func (s *tweetSrv) GetUserPostStars(userID int64, limit int, offset int) ([]*core.PostStar, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetUserPostStarCount(userID int64) (int64, error) { +func (s *tweetSrv) GetUserPostStarCount(userID int64) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *tweetServant) GetUserPostCollection(postID, userID int64) (*core.PostCollection, error) { +func (s *tweetSrv) GetUserPostCollection(postID, userID int64) (*core.PostCollection, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetUserPostCollections(userID int64, limit int, offset int) ([]*core.PostCollection, error) { +func (s *tweetSrv) GetUserPostCollections(userID int64, limit int, offset int) ([]*core.PostCollection, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetUserPostCollectionCount(userID int64) (int64, error) { +func (s *tweetSrv) GetUserPostCollectionCount(userID int64) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *tweetServant) GetUserWalletBills(userID int64, limit int, offset int) ([]*core.WalletStatement, error) { +func (s *tweetSrv) GetUserWalletBills(userID int64, limit int, offset int) ([]*core.WalletStatement, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetUserWalletBillCount(userID int64) (int64, error) { +func (s *tweetSrv) GetUserWalletBillCount(userID int64) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *tweetServant) GetPostAttatchmentBill(postID, userID int64) (*core.PostAttachmentBill, error) { +func (s *tweetSrv) GetPostAttatchmentBill(postID, userID int64) (*core.PostAttachmentBill, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { +func (s *tweetSrv) GetPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) GetPostContentByID(id int64) (*core.PostContent, error) { +func (s *tweetSrv) GetPostContentByID(id int64) (*core.PostContent, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *tweetServant) TweetInfoById(id int64) (*cs.TweetInfo, error) { +func (s *tweetSrv) TweetInfoById(id int64) (*cs.TweetInfo, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) TweetItemById(id int64) (*cs.TweetItem, error) { +func (s *tweetSrv) TweetItemById(id int64) (*cs.TweetItem, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) UserTweets(visitorId, userId int64) (cs.TweetList, error) { +func (s *tweetSrv) UserTweets(visitorId, userId int64) (cs.TweetList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) ReactionByTweetId(userId int64, tweetId int64) (*cs.ReactionItem, error) { +func (s *tweetSrv) ReactionByTweetId(userId int64, tweetId int64) (*cs.ReactionItem, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) UserReactions(userId int64, limit int, offset int) (cs.ReactionList, error) { +func (s *tweetSrv) UserReactions(userId int64, limit int, offset int) (cs.ReactionList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) FavoriteByTweetId(userId int64, tweetId int64) (*cs.FavoriteItem, error) { +func (s *tweetSrv) FavoriteByTweetId(userId int64, tweetId int64) (*cs.FavoriteItem, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) UserFavorites(userId int64, limit int, offset int) (cs.FavoriteList, error) { +func (s *tweetSrv) UserFavorites(userId int64, limit int, offset int) (cs.FavoriteList, error) { // TODO return nil, debug.ErrNotImplemented } -func (s *tweetServant) AttachmentByTweetId(userId int64, tweetId int64) (*cs.AttachmentBill, error) { +func (s *tweetSrv) AttachmentByTweetId(userId int64, tweetId int64) (*cs.AttachmentBill, error) { // TODO return nil, debug.ErrNotImplemented } func newTweetService(db *pgx.Conn) core.TweetService { - return &tweetServant{ - pgxServant: newPgxServant(db), + return &tweetSrv{ + pgxSrv: newPgxSrv(db), } } func newTweetManageService(db *pgx.Conn, cacheIndex core.CacheIndexService) core.TweetManageService { - return &tweetManageServant{ - pgxServant: newPgxServant(db), + return &tweetManageSrv{ + pgxSrv: newPgxSrv(db), } } func newTweetHelpService(db *pgx.Conn) core.TweetHelpService { - return &tweetHelpServant{ - pgxServant: newPgxServant(db), + return &tweetHelpSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/user.go b/internal/dao/slonik/user.go index 382a971e..0e3d0532 100644 --- a/internal/dao/slonik/user.go +++ b/internal/dao/slonik/user.go @@ -11,57 +11,57 @@ import ( ) var ( - _ core.UserManageService = (*userManageServant)(nil) + _ core.UserManageService = (*userManageSrv)(nil) ) -type userManageServant struct { - *pgxServant +type userManageSrv struct { + *pgxSrv } -func (s *userManageServant) GetUserByID(id int64) (*core.User, error) { +func (s *userManageSrv) GetUserByID(id int64) (*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *userManageServant) GetUserByUsername(username string) (*core.User, error) { +func (s *userManageSrv) GetUserByUsername(username string) (*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *userManageServant) GetUserByPhone(phone string) (*core.User, error) { +func (s *userManageSrv) GetUserByPhone(phone string) (*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *userManageServant) GetUsersByIDs(ids []int64) ([]*core.User, error) { +func (s *userManageSrv) GetUsersByIDs(ids []int64) ([]*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *userManageServant) GetUsersByKeyword(keyword string) ([]*core.User, error) { +func (s *userManageSrv) GetUsersByKeyword(keyword string) ([]*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *userManageServant) CreateUser(user *core.User) (*core.User, error) { +func (s *userManageSrv) CreateUser(user *core.User) (*core.User, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *userManageServant) UpdateUser(user *core.User) error { +func (s *userManageSrv) UpdateUser(user *core.User) error { // TODO debug.NotImplemented() return nil } func newUserManageService(db *pgx.Conn) core.UserManageService { - return &userManageServant{ - pgxServant: newPgxServant(db), + return &userManageSrv{ + pgxSrv: newPgxSrv(db), } } diff --git a/internal/dao/slonik/wallet.go b/internal/dao/slonik/wallet.go index 1ef38375..8b4f15ca 100644 --- a/internal/dao/slonik/wallet.go +++ b/internal/dao/slonik/wallet.go @@ -11,50 +11,50 @@ import ( ) var ( - _ core.WalletService = (*walletServant)(nil) + _ core.WalletService = (*walletSrv)(nil) ) -type walletServant struct { - *pgxServant +type walletSrv struct { + *pgxSrv } -func (s *walletServant) GetRechargeByID(id int64) (*core.WalletRecharge, error) { +func (s *walletSrv) GetRechargeByID(id int64) (*core.WalletRecharge, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *walletServant) CreateRecharge(userId, amount int64) (*core.WalletRecharge, error) { +func (s *walletSrv) CreateRecharge(userId, amount int64) (*core.WalletRecharge, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *walletServant) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { +func (s *walletSrv) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { // TODO debug.NotImplemented() return nil, nil } -func (s *walletServant) GetUserWalletBillCount(userID int64) (int64, error) { +func (s *walletSrv) GetUserWalletBillCount(userID int64) (int64, error) { // TODO debug.NotImplemented() return 0, nil } -func (s *walletServant) HandleRechargeSuccess(recharge *core.WalletRecharge, tradeNo string) error { +func (s *walletSrv) HandleRechargeSuccess(recharge *core.WalletRecharge, tradeNo string) error { // TODO debug.NotImplemented() return nil } -func (s *walletServant) HandlePostAttachmentBought(post *core.Post, user *core.User) error { +func (s *walletSrv) HandlePostAttachmentBought(post *core.Post, user *core.User) error { // TODO debug.NotImplemented() return nil } func newWalletService(db *pgx.Conn) core.WalletService { - return &walletServant{ - pgxServant: newPgxServant(db), + return &walletSrv{ + pgxSrv: newPgxSrv(db), } } From 9a81eef797ed97482ba5246ba2935b379d5c6f72 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Mon, 20 Mar 2023 23:47:44 +0800 Subject: [PATCH 21/23] sqlc: just fixed error in dao/slonik package --- internal/dao/slonik/slonik.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/dao/slonik/slonik.go b/internal/dao/slonik/slonik.go index c23b8916..71b87451 100644 --- a/internal/dao/slonik/slonik.go +++ b/internal/dao/slonik/slonik.go @@ -17,8 +17,8 @@ var ( _ core.DataService = (*dataSrv)(nil) _ core.VersionInfo = (*dataSrv)(nil) - _ core.DataServantA = (*dataSrvA)(nil) - _ core.VersionInfo = (*dataSrvA)(nil) + _ core.WebDataServantA = (*webDataSrvA)(nil) + _ core.VersionInfo = (*webDataSrvA)(nil) ) type dataSrv struct { @@ -37,7 +37,7 @@ type dataSrv struct { core.AttachmentCheckService } -type dataSrvA struct { +type webDataSrvA struct { core.TopicServantA core.TweetServantA core.TweetManageServantA @@ -115,10 +115,10 @@ func (s *dataSrv) Version() *semver.Version { return semver.MustParse("v0.1.0") } -func (s *dataSrvA) Name() string { +func (s *webDataSrvA) Name() string { return "sqlc/pgx" } -func (s *dataSrvA) Version() *semver.Version { +func (s *webDataSrvA) Version() *semver.Version { return semver.MustParse("v0.1.0") } From a5eb148ee9adefb9c85e3bb452976f9cab7ff237 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 1 Apr 2023 08:21:24 +0800 Subject: [PATCH 22/23] just rename internal/dao/slonik/ce => internal/dao/slonik/sqlc --- Makefile | 6 +++--- go.mod | 2 +- go.sum | 4 ++-- internal/dao/slonik/embed.go | 2 +- internal/dao/slonik/pgx.go | 2 +- internal/dao/slonik/{ce => sqlc}/gen.go | 0 internal/dao/slonik/{ce => sqlc}/postgres/db.go | 0 internal/dao/slonik/{ce => sqlc}/postgres/models.go | 0 internal/dao/slonik/{ce => sqlc}/postgres/querier.go | 0 internal/dao/slonik/{ce => sqlc}/postgres/query/topic.sql | 0 .../postgres/schema/0001_initialize_schema.down.sql | 0 .../postgres/schema/0001_initialize_schema.up.sql | 0 .../postgres/schema/0002_post_visibility.down.sql | 0 .../postgres/schema/0002_post_visibility.up.sql | 0 .../postgres/schema/0003_feature_contact.down.sql | 0 .../postgres/schema/0003_feature_contact.up.sql | 0 internal/dao/slonik/{ce => sqlc}/postgres/topic.sql.go | 0 internal/dao/slonik/{ce => sqlc}/sqlc.yaml | 0 internal/dao/slonik/topics.go | 2 +- internal/migration/migration_embed.go | 2 +- 20 files changed, 10 insertions(+), 10 deletions(-) rename internal/dao/slonik/{ce => sqlc}/gen.go (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/db.go (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/models.go (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/querier.go (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/query/topic.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/schema/0001_initialize_schema.down.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/schema/0001_initialize_schema.up.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/schema/0002_post_visibility.down.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/schema/0002_post_visibility.up.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/schema/0003_feature_contact.down.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/schema/0003_feature_contact.up.sql (100%) rename internal/dao/slonik/{ce => sqlc}/postgres/topic.sql.go (100%) rename internal/dao/slonik/{ce => sqlc}/sqlc.yaml (100%) diff --git a/Makefile b/Makefile index 75437c3e..59bcbe70 100644 --- a/Makefile +++ b/Makefile @@ -84,9 +84,9 @@ gen-grpc: .PHONY: gen-sqlc gen-sqlc: - @find internal/dao/slonik/ce/postgres -name '*.go' -exec rm -f {} + - @go generate internal/dao/slonik/ce/gen.go - @go fmt ./internal/dao/slonik/ce/... + @find internal/dao/slonik/sqlc/postgres -name '*.go' -exec rm -f {} + + @go generate internal/dao/slonik/sqlc/gen.go + @go fmt ./internal/dao/slonik/sqlc/... .PHONY: proto-mod proto-mod: diff --git a/go.mod b/go.mod index 04ee96c6..1d431f7b 100644 --- a/go.mod +++ b/go.mod @@ -122,7 +122,7 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d // indirect go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect + go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.21.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect golang.org/x/crypto v0.6.0 // indirect diff --git a/go.sum b/go.sum index e3ca01ba..16fd720a 100644 --- a/go.sum +++ b/go.sum @@ -1356,8 +1356,8 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= diff --git a/internal/dao/slonik/embed.go b/internal/dao/slonik/embed.go index 70703133..813a478a 100644 --- a/internal/dao/slonik/embed.go +++ b/internal/dao/slonik/embed.go @@ -11,5 +11,5 @@ import ( "embed" ) -//go:embed ce/postgres/schema +//go:embed sqlc/postgres/schema var Files embed.FS diff --git a/internal/dao/slonik/pgx.go b/internal/dao/slonik/pgx.go index 32dea035..90bb2f9d 100644 --- a/internal/dao/slonik/pgx.go +++ b/internal/dao/slonik/pgx.go @@ -10,7 +10,7 @@ import ( "github.com/jackc/pgx/v5" "github.com/rocboss/paopao-ce/internal/conf" - dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/ce/postgres" + dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/sqlc/postgres" ) var ( diff --git a/internal/dao/slonik/ce/gen.go b/internal/dao/slonik/sqlc/gen.go similarity index 100% rename from internal/dao/slonik/ce/gen.go rename to internal/dao/slonik/sqlc/gen.go diff --git a/internal/dao/slonik/ce/postgres/db.go b/internal/dao/slonik/sqlc/postgres/db.go similarity index 100% rename from internal/dao/slonik/ce/postgres/db.go rename to internal/dao/slonik/sqlc/postgres/db.go diff --git a/internal/dao/slonik/ce/postgres/models.go b/internal/dao/slonik/sqlc/postgres/models.go similarity index 100% rename from internal/dao/slonik/ce/postgres/models.go rename to internal/dao/slonik/sqlc/postgres/models.go diff --git a/internal/dao/slonik/ce/postgres/querier.go b/internal/dao/slonik/sqlc/postgres/querier.go similarity index 100% rename from internal/dao/slonik/ce/postgres/querier.go rename to internal/dao/slonik/sqlc/postgres/querier.go diff --git a/internal/dao/slonik/ce/postgres/query/topic.sql b/internal/dao/slonik/sqlc/postgres/query/topic.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/query/topic.sql rename to internal/dao/slonik/sqlc/postgres/query/topic.sql diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql b/internal/dao/slonik/sqlc/postgres/schema/0001_initialize_schema.down.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.down.sql rename to internal/dao/slonik/sqlc/postgres/schema/0001_initialize_schema.down.sql diff --git a/internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql b/internal/dao/slonik/sqlc/postgres/schema/0001_initialize_schema.up.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/schema/0001_initialize_schema.up.sql rename to internal/dao/slonik/sqlc/postgres/schema/0001_initialize_schema.up.sql diff --git a/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.down.sql b/internal/dao/slonik/sqlc/postgres/schema/0002_post_visibility.down.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/schema/0002_post_visibility.down.sql rename to internal/dao/slonik/sqlc/postgres/schema/0002_post_visibility.down.sql diff --git a/internal/dao/slonik/ce/postgres/schema/0002_post_visibility.up.sql b/internal/dao/slonik/sqlc/postgres/schema/0002_post_visibility.up.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/schema/0002_post_visibility.up.sql rename to internal/dao/slonik/sqlc/postgres/schema/0002_post_visibility.up.sql diff --git a/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.down.sql b/internal/dao/slonik/sqlc/postgres/schema/0003_feature_contact.down.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/schema/0003_feature_contact.down.sql rename to internal/dao/slonik/sqlc/postgres/schema/0003_feature_contact.down.sql diff --git a/internal/dao/slonik/ce/postgres/schema/0003_feature_contact.up.sql b/internal/dao/slonik/sqlc/postgres/schema/0003_feature_contact.up.sql similarity index 100% rename from internal/dao/slonik/ce/postgres/schema/0003_feature_contact.up.sql rename to internal/dao/slonik/sqlc/postgres/schema/0003_feature_contact.up.sql diff --git a/internal/dao/slonik/ce/postgres/topic.sql.go b/internal/dao/slonik/sqlc/postgres/topic.sql.go similarity index 100% rename from internal/dao/slonik/ce/postgres/topic.sql.go rename to internal/dao/slonik/sqlc/postgres/topic.sql.go diff --git a/internal/dao/slonik/ce/sqlc.yaml b/internal/dao/slonik/sqlc/sqlc.yaml similarity index 100% rename from internal/dao/slonik/ce/sqlc.yaml rename to internal/dao/slonik/sqlc/sqlc.yaml diff --git a/internal/dao/slonik/topics.go b/internal/dao/slonik/topics.go index e6640e09..b38ade46 100644 --- a/internal/dao/slonik/topics.go +++ b/internal/dao/slonik/topics.go @@ -12,7 +12,7 @@ import ( "github.com/jackc/pgx/v5" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/core/cs" - dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/ce/postgres" + dbr "github.com/rocboss/paopao-ce/internal/dao/slonik/sqlc/postgres" ) var ( diff --git a/internal/migration/migration_embed.go b/internal/migration/migration_embed.go index 14b4c1d3..72c9b35d 100644 --- a/internal/migration/migration_embed.go +++ b/internal/migration/migration_embed.go @@ -72,7 +72,7 @@ func Run() { } } else if cfg.If("Sqlc") { if cfg.If("PostgreSQL") || cfg.If("Postgres") { - srcDriver, err = iofs.New(slonik.Files, "ce/postgres/schema") + srcDriver, err = iofs.New(slonik.Files, "sqlc/postgres/schema") dbDriver, err2 = postgres.WithInstance(db, &postgres.Config{MigrationsTable: migrationsTable}) } } From d81b05b46d0350e752eacd48a63498a68088ea36 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Mon, 3 Apr 2023 08:03:48 +0800 Subject: [PATCH 23/23] sqlc: fixed CacheIndexService initial logic --- internal/dao/slonik/slonik.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/internal/dao/slonik/slonik.go b/internal/dao/slonik/slonik.go index 71b87451..ae48ff88 100644 --- a/internal/dao/slonik/slonik.go +++ b/internal/dao/slonik/slonik.go @@ -68,16 +68,23 @@ func NewDataService() (core.DataService, core.VersionInfo) { } // initialize core.CacheIndexService - if cfg.If("SimpleCacheIndex") { - // simpleCache use special post index service - ips = newSimpleIndexPostsService(db, ths) - cis, v = cache.NewSimpleCacheIndexService(ips) - } else if cfg.If("BigCacheIndex") { - // TODO: make cache index post in different scence like friendship/followship/lightship - cis, v = cache.NewBigCacheIndexService(ips, ams) - } else { + cfg.On(cfg.Actions{ + "SimpleCacheIndex": func() { + // simpleCache use special post index service + ips = newSimpleIndexPostsService(db, ths) + cis, v = cache.NewSimpleCacheIndexService(ips) + }, + "BigCacheIndex": func() { + // TODO: make cache index post in different scence like friendship/followship/lightship + cis, v = cache.NewBigCacheIndexService(ips, ams) + }, + "RedisCacheIndex": func() { + cis, v = cache.NewRedisCacheIndexService(ips, ams) + }, + }, func() { + // defualt no cache cis, v = cache.NewNoneCacheIndexService(ips) - } + }) logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version()) ds := &dataSrv{