refact!: project structure
Some checks failed
Build and Deploy Go App / build (push) Failing after 4m35s
Build and Deploy Go App / deploy (push) Has been skipped

This commit is contained in:
nihonium 2025-10-25 21:05:16 +03:00
parent fd0ca4411b
commit db53ae04e3
Signed by: nihonium
GPG key ID: 0251623741027CFC
26 changed files with 971 additions and 6395 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,32 +0,0 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
package db
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,
}
}

View file

@ -1,266 +0,0 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
package db
import (
"database/sql/driver"
"fmt"
"github.com/jackc/pgx/v5/pgtype"
)
type ReleaseSeasonT string
const (
ReleaseSeasonTWinter ReleaseSeasonT = "winter"
ReleaseSeasonTSpring ReleaseSeasonT = "spring"
ReleaseSeasonTSummer ReleaseSeasonT = "summer"
ReleaseSeasonTFall ReleaseSeasonT = "fall"
)
func (e *ReleaseSeasonT) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = ReleaseSeasonT(s)
case string:
*e = ReleaseSeasonT(s)
default:
return fmt.Errorf("unsupported scan type for ReleaseSeasonT: %T", src)
}
return nil
}
type NullReleaseSeasonT struct {
ReleaseSeasonT ReleaseSeasonT `json:"release_season_t"`
Valid bool `json:"valid"` // Valid is true if ReleaseSeasonT is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullReleaseSeasonT) Scan(value interface{}) error {
if value == nil {
ns.ReleaseSeasonT, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.ReleaseSeasonT.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullReleaseSeasonT) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.ReleaseSeasonT), nil
}
type StorageTypeT string
const (
StorageTypeTLocal StorageTypeT = "local"
StorageTypeTS3 StorageTypeT = "s3"
)
func (e *StorageTypeT) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = StorageTypeT(s)
case string:
*e = StorageTypeT(s)
default:
return fmt.Errorf("unsupported scan type for StorageTypeT: %T", src)
}
return nil
}
type NullStorageTypeT struct {
StorageTypeT StorageTypeT `json:"storage_type_t"`
Valid bool `json:"valid"` // Valid is true if StorageTypeT is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullStorageTypeT) Scan(value interface{}) error {
if value == nil {
ns.StorageTypeT, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.StorageTypeT.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullStorageTypeT) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.StorageTypeT), nil
}
type TitleStatusT string
const (
TitleStatusTFinished TitleStatusT = "finished"
TitleStatusTOngoing TitleStatusT = "ongoing"
TitleStatusTPlanned TitleStatusT = "planned"
)
func (e *TitleStatusT) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = TitleStatusT(s)
case string:
*e = TitleStatusT(s)
default:
return fmt.Errorf("unsupported scan type for TitleStatusT: %T", src)
}
return nil
}
type NullTitleStatusT struct {
TitleStatusT TitleStatusT `json:"title_status_t"`
Valid bool `json:"valid"` // Valid is true if TitleStatusT is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullTitleStatusT) Scan(value interface{}) error {
if value == nil {
ns.TitleStatusT, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.TitleStatusT.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullTitleStatusT) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.TitleStatusT), nil
}
type UsertitleStatusT string
const (
UsertitleStatusTFinished UsertitleStatusT = "finished"
UsertitleStatusTPlanned UsertitleStatusT = "planned"
UsertitleStatusTDropped UsertitleStatusT = "dropped"
UsertitleStatusTInProgress UsertitleStatusT = "in-progress"
)
func (e *UsertitleStatusT) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = UsertitleStatusT(s)
case string:
*e = UsertitleStatusT(s)
default:
return fmt.Errorf("unsupported scan type for UsertitleStatusT: %T", src)
}
return nil
}
type NullUsertitleStatusT struct {
UsertitleStatusT UsertitleStatusT `json:"usertitle_status_t"`
Valid bool `json:"valid"` // Valid is true if UsertitleStatusT is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullUsertitleStatusT) Scan(value interface{}) error {
if value == nil {
ns.UsertitleStatusT, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.UsertitleStatusT.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullUsertitleStatusT) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.UsertitleStatusT), nil
}
type Images struct {
ImageID int32 `db:"image_id" json:"image_id"`
StorageType StorageTypeT `db:"storage_type" json:"storage_type"`
ImagePath string `db:"image_path" json:"image_path"`
}
type Providers struct {
ProviderID int32 `db:"provider_id" json:"provider_id"`
ProviderName string `db:"provider_name" json:"provider_name"`
}
type Reviews struct {
ReviewID int32 `db:"review_id" json:"review_id"`
UserID int32 `db:"user_id" json:"user_id"`
TitleID int32 `db:"title_id" json:"title_id"`
ImageIds []int32 `db:"image_ids" json:"image_ids"`
ReviewText string `db:"review_text" json:"review_text"`
CreationDate pgtype.Timestamp `db:"creation_date" json:"creation_date"`
}
type Signals struct {
SignalID int32 `db:"signal_id" json:"signal_id"`
RawData []byte `db:"raw_data" json:"raw_data"`
ProviderID int32 `db:"provider_id" json:"provider_id"`
Dirty bool `db:"dirty" json:"dirty"`
}
type Studios struct {
StudioID int32 `db:"studio_id" json:"studio_id"`
StudioName pgtype.Text `db:"studio_name" json:"studio_name"`
IllustID pgtype.Int4 `db:"illust_id" json:"illust_id"`
StudioDesc pgtype.Text `db:"studio_desc" json:"studio_desc"`
}
type Tags struct {
TagID int32 `db:"tag_id" json:"tag_id"`
TagNames []byte `db:"tag_names" json:"tag_names"`
}
type TitleTags struct {
TitleID int32 `db:"title_id" json:"title_id"`
TagID int32 `db:"tag_id" json:"tag_id"`
}
type Titles struct {
TitleID int32 `db:"title_id" json:"title_id"`
TitleNames []byte `db:"title_names" json:"title_names"`
StudioID int32 `db:"studio_id" json:"studio_id"`
PosterID pgtype.Int4 `db:"poster_id" json:"poster_id"`
SignalIds []int32 `db:"signal_ids" json:"signal_ids"`
TitleStatus TitleStatusT `db:"title_status" json:"title_status"`
Rating pgtype.Float8 `db:"rating" json:"rating"`
RatingCount pgtype.Int4 `db:"rating_count" json:"rating_count"`
ReleaseYear pgtype.Int4 `db:"release_year" json:"release_year"`
ReleaseSeason NullReleaseSeasonT `db:"release_season" json:"release_season"`
Season pgtype.Int4 `db:"season" json:"season"`
EpisodesAired pgtype.Int4 `db:"episodes_aired" json:"episodes_aired"`
EpisodesAll pgtype.Int4 `db:"episodes_all" json:"episodes_all"`
EpisodesLen []byte `db:"episodes_len" json:"episodes_len"`
}
type Users struct {
UserID int32 `db:"user_id" json:"user_id"`
AvatarID pgtype.Int4 `db:"avatar_id" json:"avatar_id"`
Passhash string `db:"passhash" json:"passhash"`
Mail pgtype.Text `db:"mail" json:"mail"`
Nickname string `db:"nickname" json:"nickname"`
DispName pgtype.Text `db:"disp_name" json:"disp_name"`
UserDesc pgtype.Text `db:"user_desc" json:"user_desc"`
CreationDate pgtype.Timestamp `db:"creation_date" json:"creation_date"`
}
type Usertitles struct {
UsertitleID int32 `db:"usertitle_id" json:"usertitle_id"`
UserID int32 `db:"user_id" json:"user_id"`
TitleID int32 `db:"title_id" json:"title_id"`
Status UsertitleStatusT `db:"status" json:"status"`
Rate pgtype.Int4 `db:"rate" json:"rate"`
ReviewID pgtype.Int4 `db:"review_id" json:"review_id"`
}

View file

@ -1,712 +0,0 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
// source: query.sql
package db
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const createImage = `-- name: CreateImage :one
INSERT INTO images (storage_type, image_path)
VALUES ($1, $2)
RETURNING image_id, storage_type, image_path
`
type CreateImageParams struct {
StorageType StorageTypeT `db:"storage_type" json:"storage_type"`
ImagePath string `db:"image_path" json:"image_path"`
}
func (q *Queries) CreateImage(ctx context.Context, arg CreateImageParams) (Images, error) {
row := q.db.QueryRow(ctx, createImage, arg.StorageType, arg.ImagePath)
var i Images
err := row.Scan(&i.ImageID, &i.StorageType, &i.ImagePath)
return i, err
}
const createReview = `-- name: CreateReview :one
INSERT INTO reviews (user_id, title_id, image_ids, review_text, creation_date)
VALUES ($1, $2, $3, $4, $5)
RETURNING review_id, user_id, title_id, image_ids, review_text, creation_date
`
type CreateReviewParams struct {
UserID int32 `db:"user_id" json:"user_id"`
TitleID int32 `db:"title_id" json:"title_id"`
ImageIds []int32 `db:"image_ids" json:"image_ids"`
ReviewText string `db:"review_text" json:"review_text"`
CreationDate pgtype.Timestamp `db:"creation_date" json:"creation_date"`
}
func (q *Queries) CreateReview(ctx context.Context, arg CreateReviewParams) (Reviews, error) {
row := q.db.QueryRow(ctx, createReview,
arg.UserID,
arg.TitleID,
arg.ImageIds,
arg.ReviewText,
arg.CreationDate,
)
var i Reviews
err := row.Scan(
&i.ReviewID,
&i.UserID,
&i.TitleID,
&i.ImageIds,
&i.ReviewText,
&i.CreationDate,
)
return i, err
}
const createUser = `-- name: CreateUser :one
INSERT INTO users (avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date)
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date
`
type CreateUserParams struct {
AvatarID pgtype.Int4 `db:"avatar_id" json:"avatar_id"`
Passhash string `db:"passhash" json:"passhash"`
Mail pgtype.Text `db:"mail" json:"mail"`
Nickname string `db:"nickname" json:"nickname"`
DispName pgtype.Text `db:"disp_name" json:"disp_name"`
UserDesc pgtype.Text `db:"user_desc" json:"user_desc"`
CreationDate pgtype.Timestamp `db:"creation_date" json:"creation_date"`
}
type CreateUserRow struct {
UserID int32 `db:"user_id" json:"user_id"`
AvatarID pgtype.Int4 `db:"avatar_id" json:"avatar_id"`
Nickname string `db:"nickname" json:"nickname"`
DispName pgtype.Text `db:"disp_name" json:"disp_name"`
UserDesc pgtype.Text `db:"user_desc" json:"user_desc"`
CreationDate pgtype.Timestamp `db:"creation_date" json:"creation_date"`
}
func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (CreateUserRow, error) {
row := q.db.QueryRow(ctx, createUser,
arg.AvatarID,
arg.Passhash,
arg.Mail,
arg.Nickname,
arg.DispName,
arg.UserDesc,
arg.CreationDate,
)
var i CreateUserRow
err := row.Scan(
&i.UserID,
&i.AvatarID,
&i.Nickname,
&i.DispName,
&i.UserDesc,
&i.CreationDate,
)
return i, err
}
const createUserTitle = `-- name: CreateUserTitle :one
INSERT INTO usertitles (user_id, title_id, status, rate, review_id)
VALUES ($1, $2, $3, $4, $5)
RETURNING usertitle_id, user_id, title_id, status, rate, review_id
`
type CreateUserTitleParams struct {
UserID int32 `db:"user_id" json:"user_id"`
TitleID int32 `db:"title_id" json:"title_id"`
Status UsertitleStatusT `db:"status" json:"status"`
Rate pgtype.Int4 `db:"rate" json:"rate"`
ReviewID pgtype.Int4 `db:"review_id" json:"review_id"`
}
func (q *Queries) CreateUserTitle(ctx context.Context, arg CreateUserTitleParams) (Usertitles, error) {
row := q.db.QueryRow(ctx, createUserTitle,
arg.UserID,
arg.TitleID,
arg.Status,
arg.Rate,
arg.ReviewID,
)
var i Usertitles
err := row.Scan(
&i.UsertitleID,
&i.UserID,
&i.TitleID,
&i.Status,
&i.Rate,
&i.ReviewID,
)
return i, err
}
const deleteReview = `-- name: DeleteReview :exec
DELETE FROM reviews
WHERE review_id = $1
`
func (q *Queries) DeleteReview(ctx context.Context, reviewID int32) error {
_, err := q.db.Exec(ctx, deleteReview, reviewID)
return err
}
const deleteUser = `-- name: DeleteUser :exec
DELETE FROM users
WHERE user_id = $1
`
func (q *Queries) DeleteUser(ctx context.Context, userID int32) error {
_, err := q.db.Exec(ctx, deleteUser, userID)
return err
}
const deleteUserTitle = `-- name: DeleteUserTitle :exec
DELETE FROM usertitles
WHERE user_id = $1 AND ($2::int IS NULL OR title_id = $2)
`
type DeleteUserTitleParams struct {
UserID int32 `db:"user_id" json:"user_id"`
Column2 int32 `db:"column_2" json:"column_2"`
}
func (q *Queries) DeleteUserTitle(ctx context.Context, arg DeleteUserTitleParams) error {
_, err := q.db.Exec(ctx, deleteUserTitle, arg.UserID, arg.Column2)
return err
}
const getImageByID = `-- name: GetImageByID :one
SELECT image_id, storage_type, image_path
FROM images
WHERE image_id = $1
`
func (q *Queries) GetImageByID(ctx context.Context, imageID int32) (Images, error) {
row := q.db.QueryRow(ctx, getImageByID, imageID)
var i Images
err := row.Scan(&i.ImageID, &i.StorageType, &i.ImagePath)
return i, err
}
const getReviewByID = `-- name: GetReviewByID :one
SELECT review_id, user_id, title_id, image_ids, review_text, creation_date
FROM reviews
WHERE review_id = $1
`
func (q *Queries) GetReviewByID(ctx context.Context, reviewID int32) (Reviews, error) {
row := q.db.QueryRow(ctx, getReviewByID, reviewID)
var i Reviews
err := row.Scan(
&i.ReviewID,
&i.UserID,
&i.TitleID,
&i.ImageIds,
&i.ReviewText,
&i.CreationDate,
)
return i, err
}
const getTitleByID = `-- name: GetTitleByID :one
SELECT title_id, title_names, studio_id, poster_id, signal_ids,
title_status, rating, rating_count, release_year, release_season,
season, episodes_aired, episodes_all, episodes_len
FROM titles
WHERE title_id = $1
`
func (q *Queries) GetTitleByID(ctx context.Context, titleID int32) (Titles, error) {
row := q.db.QueryRow(ctx, getTitleByID, titleID)
var i Titles
err := row.Scan(
&i.TitleID,
&i.TitleNames,
&i.StudioID,
&i.PosterID,
&i.SignalIds,
&i.TitleStatus,
&i.Rating,
&i.RatingCount,
&i.ReleaseYear,
&i.ReleaseSeason,
&i.Season,
&i.EpisodesAired,
&i.EpisodesAll,
&i.EpisodesLen,
)
return i, err
}
const getUserByID = `-- name: GetUserByID :one
SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date
FROM users
WHERE user_id = $1
`
func (q *Queries) GetUserByID(ctx context.Context, userID int32) (Users, error) {
row := q.db.QueryRow(ctx, getUserByID, userID)
var i Users
err := row.Scan(
&i.UserID,
&i.AvatarID,
&i.Passhash,
&i.Mail,
&i.Nickname,
&i.DispName,
&i.UserDesc,
&i.CreationDate,
)
return i, err
}
const getUserTitle = `-- name: GetUserTitle :one
SELECT usertitle_id, user_id, title_id, status, rate, review_id
FROM usertitles
WHERE user_id = $1 AND title_id = $2
`
type GetUserTitleParams struct {
UserID int32 `db:"user_id" json:"user_id"`
TitleID int32 `db:"title_id" json:"title_id"`
}
func (q *Queries) GetUserTitle(ctx context.Context, arg GetUserTitleParams) (Usertitles, error) {
row := q.db.QueryRow(ctx, getUserTitle, arg.UserID, arg.TitleID)
var i Usertitles
err := row.Scan(
&i.UsertitleID,
&i.UserID,
&i.TitleID,
&i.Status,
&i.Rate,
&i.ReviewID,
)
return i, err
}
const listReviewsByTitle = `-- name: ListReviewsByTitle :many
SELECT review_id, user_id, title_id, image_ids, review_text, creation_date
FROM reviews
WHERE title_id = $1
ORDER BY creation_date DESC
LIMIT $2 OFFSET $3
`
type ListReviewsByTitleParams struct {
TitleID int32 `db:"title_id" json:"title_id"`
Limit int32 `db:"limit" json:"limit"`
Offset int32 `db:"offset" json:"offset"`
}
func (q *Queries) ListReviewsByTitle(ctx context.Context, arg ListReviewsByTitleParams) ([]Reviews, error) {
rows, err := q.db.Query(ctx, listReviewsByTitle, arg.TitleID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Reviews
for rows.Next() {
var i Reviews
if err := rows.Scan(
&i.ReviewID,
&i.UserID,
&i.TitleID,
&i.ImageIds,
&i.ReviewText,
&i.CreationDate,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listReviewsByUser = `-- name: ListReviewsByUser :many
SELECT review_id, user_id, title_id, image_ids, review_text, creation_date
FROM reviews
WHERE user_id = $1
ORDER BY creation_date DESC
LIMIT $2 OFFSET $3
`
type ListReviewsByUserParams struct {
UserID int32 `db:"user_id" json:"user_id"`
Limit int32 `db:"limit" json:"limit"`
Offset int32 `db:"offset" json:"offset"`
}
func (q *Queries) ListReviewsByUser(ctx context.Context, arg ListReviewsByUserParams) ([]Reviews, error) {
rows, err := q.db.Query(ctx, listReviewsByUser, arg.UserID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Reviews
for rows.Next() {
var i Reviews
if err := rows.Scan(
&i.ReviewID,
&i.UserID,
&i.TitleID,
&i.ImageIds,
&i.ReviewText,
&i.CreationDate,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listTags = `-- name: ListTags :many
SELECT tag_id, tag_names
FROM tags
ORDER BY tag_id
LIMIT $1 OFFSET $2
`
type ListTagsParams struct {
Limit int32 `db:"limit" json:"limit"`
Offset int32 `db:"offset" json:"offset"`
}
func (q *Queries) ListTags(ctx context.Context, arg ListTagsParams) ([]Tags, error) {
rows, err := q.db.Query(ctx, listTags, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Tags
for rows.Next() {
var i Tags
if err := rows.Scan(&i.TagID, &i.TagNames); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listTitles = `-- name: ListTitles :many
SELECT title_id, title_names, studio_id, poster_id, signal_ids,
title_status, rating, rating_count, release_year, release_season,
season, episodes_aired, episodes_all, episodes_len
FROM titles
ORDER BY title_id
LIMIT $1 OFFSET $2
`
type ListTitlesParams struct {
Limit int32 `db:"limit" json:"limit"`
Offset int32 `db:"offset" json:"offset"`
}
func (q *Queries) ListTitles(ctx context.Context, arg ListTitlesParams) ([]Titles, error) {
rows, err := q.db.Query(ctx, listTitles, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Titles
for rows.Next() {
var i Titles
if err := rows.Scan(
&i.TitleID,
&i.TitleNames,
&i.StudioID,
&i.PosterID,
&i.SignalIds,
&i.TitleStatus,
&i.Rating,
&i.RatingCount,
&i.ReleaseYear,
&i.ReleaseSeason,
&i.Season,
&i.EpisodesAired,
&i.EpisodesAll,
&i.EpisodesLen,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listUserTitles = `-- name: ListUserTitles :many
SELECT usertitle_id, user_id, title_id, status, rate, review_id
FROM usertitles
WHERE user_id = $1
ORDER BY usertitle_id
LIMIT $2 OFFSET $3
`
type ListUserTitlesParams struct {
UserID int32 `db:"user_id" json:"user_id"`
Limit int32 `db:"limit" json:"limit"`
Offset int32 `db:"offset" json:"offset"`
}
func (q *Queries) ListUserTitles(ctx context.Context, arg ListUserTitlesParams) ([]Usertitles, error) {
rows, err := q.db.Query(ctx, listUserTitles, arg.UserID, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Usertitles
for rows.Next() {
var i Usertitles
if err := rows.Scan(
&i.UsertitleID,
&i.UserID,
&i.TitleID,
&i.Status,
&i.Rate,
&i.ReviewID,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listUsers = `-- name: ListUsers :many
SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date
FROM users
ORDER BY user_id
LIMIT $1 OFFSET $2
`
type ListUsersParams struct {
Limit int32 `db:"limit" json:"limit"`
Offset int32 `db:"offset" json:"offset"`
}
func (q *Queries) ListUsers(ctx context.Context, arg ListUsersParams) ([]Users, error) {
rows, err := q.db.Query(ctx, listUsers, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Users
for rows.Next() {
var i Users
if err := rows.Scan(
&i.UserID,
&i.AvatarID,
&i.Passhash,
&i.Mail,
&i.Nickname,
&i.DispName,
&i.UserDesc,
&i.CreationDate,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const updateReview = `-- name: UpdateReview :one
UPDATE reviews
SET
image_ids = COALESCE($1, image_ids),
review_text = COALESCE($2, review_text)
WHERE review_id = $3
RETURNING review_id, user_id, title_id, image_ids, review_text, creation_date
`
type UpdateReviewParams struct {
ImageIds []int32 `db:"image_ids" json:"image_ids"`
ReviewText pgtype.Text `db:"review_text" json:"review_text"`
ReviewID int32 `db:"review_id" json:"review_id"`
}
func (q *Queries) UpdateReview(ctx context.Context, arg UpdateReviewParams) (Reviews, error) {
row := q.db.QueryRow(ctx, updateReview, arg.ImageIds, arg.ReviewText, arg.ReviewID)
var i Reviews
err := row.Scan(
&i.ReviewID,
&i.UserID,
&i.TitleID,
&i.ImageIds,
&i.ReviewText,
&i.CreationDate,
)
return i, err
}
const updateTitle = `-- name: UpdateTitle :one
UPDATE titles
SET
title_names = COALESCE($1, title_names),
studio_id = COALESCE($2, studio_id),
poster_id = COALESCE($3, poster_id),
signal_ids = COALESCE($4, signal_ids),
title_status = COALESCE($5, title_status),
release_year = COALESCE($6, release_year),
release_season = COALESCE($7, release_season),
episodes_aired = COALESCE($8, episodes_aired),
episodes_all = COALESCE($9, episodes_all),
episodes_len = COALESCE($10, episodes_len)
WHERE title_id = $11
RETURNING title_id, title_names, studio_id, poster_id, signal_ids, title_status, rating, rating_count, release_year, release_season, season, episodes_aired, episodes_all, episodes_len
`
type UpdateTitleParams struct {
TitleNames []byte `db:"title_names" json:"title_names"`
StudioID pgtype.Int4 `db:"studio_id" json:"studio_id"`
PosterID pgtype.Int4 `db:"poster_id" json:"poster_id"`
SignalIds []int32 `db:"signal_ids" json:"signal_ids"`
TitleStatus NullTitleStatusT `db:"title_status" json:"title_status"`
ReleaseYear pgtype.Int4 `db:"release_year" json:"release_year"`
ReleaseSeason NullReleaseSeasonT `db:"release_season" json:"release_season"`
EpisodesAired pgtype.Int4 `db:"episodes_aired" json:"episodes_aired"`
EpisodesAll pgtype.Int4 `db:"episodes_all" json:"episodes_all"`
EpisodesLen []byte `db:"episodes_len" json:"episodes_len"`
TitleID int32 `db:"title_id" json:"title_id"`
}
func (q *Queries) UpdateTitle(ctx context.Context, arg UpdateTitleParams) (Titles, error) {
row := q.db.QueryRow(ctx, updateTitle,
arg.TitleNames,
arg.StudioID,
arg.PosterID,
arg.SignalIds,
arg.TitleStatus,
arg.ReleaseYear,
arg.ReleaseSeason,
arg.EpisodesAired,
arg.EpisodesAll,
arg.EpisodesLen,
arg.TitleID,
)
var i Titles
err := row.Scan(
&i.TitleID,
&i.TitleNames,
&i.StudioID,
&i.PosterID,
&i.SignalIds,
&i.TitleStatus,
&i.Rating,
&i.RatingCount,
&i.ReleaseYear,
&i.ReleaseSeason,
&i.Season,
&i.EpisodesAired,
&i.EpisodesAll,
&i.EpisodesLen,
)
return i, err
}
const updateUser = `-- name: UpdateUser :one
UPDATE users
SET
avatar_id = COALESCE($1, avatar_id),
disp_name = COALESCE($2, disp_name),
user_desc = COALESCE($3, user_desc)
WHERE user_id = $4
RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date
`
type UpdateUserParams struct {
AvatarID pgtype.Int4 `db:"avatar_id" json:"avatar_id"`
DispName pgtype.Text `db:"disp_name" json:"disp_name"`
UserDesc pgtype.Text `db:"user_desc" json:"user_desc"`
UserID int32 `db:"user_id" json:"user_id"`
}
type UpdateUserRow struct {
UserID int32 `db:"user_id" json:"user_id"`
AvatarID pgtype.Int4 `db:"avatar_id" json:"avatar_id"`
Nickname string `db:"nickname" json:"nickname"`
DispName pgtype.Text `db:"disp_name" json:"disp_name"`
UserDesc pgtype.Text `db:"user_desc" json:"user_desc"`
CreationDate pgtype.Timestamp `db:"creation_date" json:"creation_date"`
}
func (q *Queries) UpdateUser(ctx context.Context, arg UpdateUserParams) (UpdateUserRow, error) {
row := q.db.QueryRow(ctx, updateUser,
arg.AvatarID,
arg.DispName,
arg.UserDesc,
arg.UserID,
)
var i UpdateUserRow
err := row.Scan(
&i.UserID,
&i.AvatarID,
&i.Nickname,
&i.DispName,
&i.UserDesc,
&i.CreationDate,
)
return i, err
}
const updateUserTitle = `-- name: UpdateUserTitle :one
UPDATE usertitles
SET
status = COALESCE($3, status),
rate = COALESCE($4, rate),
review_id = COALESCE($5, review_id)
WHERE user_id = $1 AND title_id = $2
RETURNING usertitle_id, user_id, title_id, status, rate, review_id
`
type UpdateUserTitleParams struct {
UserID int32 `db:"user_id" json:"user_id"`
TitleID int32 `db:"title_id" json:"title_id"`
Status NullUsertitleStatusT `db:"status" json:"status"`
Rate pgtype.Int4 `db:"rate" json:"rate"`
ReviewID pgtype.Int4 `db:"review_id" json:"review_id"`
}
func (q *Queries) UpdateUserTitle(ctx context.Context, arg UpdateUserTitleParams) (Usertitles, error) {
row := q.db.QueryRow(ctx, updateUserTitle,
arg.UserID,
arg.TitleID,
arg.Status,
arg.Rate,
arg.ReviewID,
)
var i Usertitles
err := row.Scan(
&i.UsertitleID,
&i.UserID,
&i.TitleID,
&i.Status,
&i.Rate,
&i.ReviewID,
)
return i, err
}

View file

@ -1,46 +0,0 @@
module nyanimedb-server
go 1.25.0
require (
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/bytedance/sonic v1.14.0 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cloudwego/base64x v0.1.6 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gin-contrib/cors v1.7.6 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
github.com/gin-gonic/gin v1.11.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.27.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/goccy/go-yaml v1.18.0 // indirect
github.com/google/uuid v1.5.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.7.6 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/oapi-codegen/runtime v1.1.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.54.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.0 // indirect
go.uber.org/mock v0.5.0 // indirect
golang.org/x/arch v0.20.0 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/tools v0.34.0 // indirect
google.golang.org/protobuf v1.36.9 // indirect
)

View file

@ -1,108 +0,0 @@
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gin-contrib/cors v1.7.6 h1:3gQ8GMzs1Ylpf70y8bMw4fVpycXIeX1ZemuSQIsnQQY=
github.com/gin-contrib/cors v1.7.6/go.mod h1:Ulcl+xN4jel9t1Ry8vqph23a60FwH9xVLd+3ykmTjOk=
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.7.6 h1:rWQc5FwZSPX58r1OQmkuaNicxdmExaEz5A2DO2hUuTk=
github.com/jackc/pgx/v5 v5.7.6/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQgXIyI=
github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View file

@ -1,9 +1,10 @@
package api
package main
import (
"context"
"encoding/json"
"nyanimedb-server/db"
"nyanimedb/modules/backend/db"
sqlc "nyanimedb/sql"
"strconv"
"time"
@ -13,7 +14,7 @@ import (
)
type Server struct {
db *db.Queries
db *sqlc.Queries
}
func NewServer(db *db.Queries) Server {

View file

@ -3,12 +3,13 @@ package main
import (
"context"
"fmt"
"nyanimedb-server/api"
"nyanimedb-server/db"
sqlc "nyanimedb/sql"
"os"
"reflect"
"time"
oapi "nyanimedb/api"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/jackc/pgx/v5"
@ -39,9 +40,9 @@ func main() {
r := gin.Default()
queries := db.New(conn)
queries := sqlc.New(conn)
server := api.NewServer(queries)
server := NewServer(queries)
// r.LoadHTMLGlob("templates/*")
r.Use(cors.New(cors.Config{
@ -53,10 +54,10 @@ func main() {
MaxAge: 12 * time.Hour,
}))
api.RegisterHandlers(r, api.NewStrictHandler(
oapi.RegisterHandlers(r, oapi.NewStrictHandler(
server,
// сюда можно добавить middlewares, если нужно
[]api.StrictMiddlewareFunc{},
[]oapi.StrictMiddlewareFunc{},
))
// r.GET("/", func(c *gin.Context) {
// c.HTML(http.StatusOK, "index.html", gin.H{

142
modules/backend/queries.sql Normal file
View file

@ -0,0 +1,142 @@
-- name: GetImageByID :one
SELECT image_id, storage_type, image_path
FROM images
WHERE image_id = $1;
-- -- name: CreateImage :one
-- INSERT INTO images (storage_type, image_path)
-- VALUES ($1, $2)
-- RETURNING image_id, storage_type, image_path;
-- -- name: GetUserByID :one
-- SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date
-- FROM users
-- WHERE user_id = $1;
-- -- name: ListUsers :many
-- SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date
-- FROM users
-- ORDER BY user_id
-- LIMIT $1 OFFSET $2;
-- -- name: CreateUser :one
-- INSERT INTO users (avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date)
-- VALUES ($1, $2, $3, $4, $5, $6, $7)
-- RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date;
-- -- name: UpdateUser :one
-- UPDATE users
-- SET
-- avatar_id = COALESCE(sqlc.narg('avatar_id'), avatar_id),
-- disp_name = COALESCE(sqlc.narg('disp_name'), disp_name),
-- user_desc = COALESCE(sqlc.narg('user_desc'), user_desc),
-- passhash = COALESCE(sqlc.narg('passhash'), passhash)
-- WHERE user_id = sqlc.arg('user_id')
-- RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date;
-- -- name: DeleteUser :exec
-- DELETE FROM users
-- WHERE user_id = $1;
-- -- name: GetTitleByID :one
-- SELECT title_id, title_names, studio_id, poster_id, signal_ids,
-- title_status, rating, rating_count, release_year, release_season,
-- season, episodes_aired, episodes_all, episodes_len
-- FROM titles
-- WHERE title_id = $1;
-- -- name: ListTitles :many
-- SELECT title_id, title_names, studio_id, poster_id, signal_ids,
-- title_status, rating, rating_count, release_year, release_season,
-- season, episodes_aired, episodes_all, episodes_len
-- FROM titles
-- ORDER BY title_id
-- LIMIT $1 OFFSET $2;
-- -- name: UpdateTitle :one
-- UPDATE titles
-- SET
-- title_names = COALESCE(sqlc.narg('title_names'), title_names),
-- studio_id = COALESCE(sqlc.narg('studio_id'), studio_id),
-- poster_id = COALESCE(sqlc.narg('poster_id'), poster_id),
-- signal_ids = COALESCE(sqlc.narg('signal_ids'), signal_ids),
-- title_status = COALESCE(sqlc.narg('title_status'), title_status),
-- release_year = COALESCE(sqlc.narg('release_year'), release_year),
-- release_season = COALESCE(sqlc.narg('release_season'), release_season),
-- episodes_aired = COALESCE(sqlc.narg('episodes_aired'), episodes_aired),
-- episodes_all = COALESCE(sqlc.narg('episodes_all'), episodes_all),
-- episodes_len = COALESCE(sqlc.narg('episodes_len'), episodes_len)
-- WHERE title_id = sqlc.arg('title_id')
-- RETURNING *;
-- -- name: GetReviewByID :one
-- SELECT review_id, user_id, title_id, image_ids, review_text, creation_date
-- FROM reviews
-- WHERE review_id = $1;
-- -- name: CreateReview :one
-- INSERT INTO reviews (user_id, title_id, image_ids, review_text, creation_date)
-- VALUES ($1, $2, $3, $4, $5)
-- RETURNING review_id, user_id, title_id, image_ids, review_text, creation_date;
-- -- name: UpdateReview :one
-- UPDATE reviews
-- SET
-- image_ids = COALESCE(sqlc.narg('image_ids'), image_ids),
-- review_text = COALESCE(sqlc.narg('review_text'), review_text)
-- WHERE review_id = sqlc.arg('review_id')
-- RETURNING *;
-- -- name: DeleteReview :exec
-- DELETE FROM reviews
-- WHERE review_id = $1;
-- -- name: ListReviewsByTitle :many
-- SELECT review_id, user_id, title_id, image_ids, review_text, creation_date
-- FROM reviews
-- WHERE title_id = $1
-- ORDER BY creation_date DESC
-- LIMIT $2 OFFSET $3;
-- -- name: ListReviewsByUser :many
-- SELECT review_id, user_id, title_id, image_ids, review_text, creation_date
-- FROM reviews
-- WHERE user_id = $1
-- ORDER BY creation_date DESC
-- LIMIT $2 OFFSET $3;
-- -- name: GetUserTitle :one
-- SELECT usertitle_id, user_id, title_id, status, rate, review_id
-- FROM usertitles
-- WHERE user_id = $1 AND title_id = $2;
-- -- name: ListUserTitles :many
-- SELECT usertitle_id, user_id, title_id, status, rate, review_id
-- FROM usertitles
-- WHERE user_id = $1
-- ORDER BY usertitle_id
-- LIMIT $2 OFFSET $3;
-- -- name: CreateUserTitle :one
-- INSERT INTO usertitles (user_id, title_id, status, rate, review_id)
-- VALUES ($1, $2, $3, $4, $5)
-- RETURNING usertitle_id, user_id, title_id, status, rate, review_id;
-- -- name: UpdateUserTitle :one
-- UPDATE usertitles
-- SET
-- status = COALESCE(sqlc.narg('status'), status),
-- rate = COALESCE(sqlc.narg('rate'), rate),
-- review_id = COALESCE(sqlc.narg('review_id'), review_id)
-- WHERE user_id = $1 AND title_id = $2
-- RETURNING *;
-- -- name: DeleteUserTitle :exec
-- DELETE FROM usertitles
-- WHERE user_id = $1 AND ($2::int IS NULL OR title_id = $2);
-- -- name: ListTags :many
-- SELECT tag_id, tag_names
-- FROM tags
-- ORDER BY tag_id
-- LIMIT $1 OFFSET $2;

View file

@ -1,10 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ .title }}</title>
</head>
<body>
<h1>{{ .message }}</h1>
</body>
</html>