This commit is contained in:
@@ -22,12 +22,12 @@ type medias struct {
|
||||
// @Produce json
|
||||
// @Param pagination query requests.Pagination false "分页参数"
|
||||
// @Param query query ListQuery false "筛选条件"
|
||||
// @Success 200 {object} requests.Pager{items=models.Media} "成功"
|
||||
// @Success 200 {object} requests.Pager{items=models.Medium} "成功"
|
||||
// @Router /admin/medias [get]
|
||||
// @Bind pagination query
|
||||
// @Bind query query
|
||||
func (ctl *medias) List(ctx fiber.Ctx, pagination *requests.Pagination, query *ListQuery) (*requests.Pager, error) {
|
||||
return services.Media.List(ctx, pagination, models.MediaQuery.Name.Like(database.WrapLike(*query.Keyword)))
|
||||
return services.Media.List(ctx, pagination, models.MediumQuery.Name.Like(database.WrapLike(*query.Keyword)))
|
||||
}
|
||||
|
||||
// Show media
|
||||
@@ -38,7 +38,7 @@ func (ctl *medias) List(ctx fiber.Ctx, pagination *requests.Pagination, query *L
|
||||
// @Success 302 {string} string "跳转"
|
||||
// @Router /admin/medias/:id [get]
|
||||
// @Bind media path key(id) model(id)
|
||||
func (ctl *medias) Show(ctx fiber.Ctx, media *models.Media) error {
|
||||
func (ctl *medias) Show(ctx fiber.Ctx, media *models.Medium) error {
|
||||
url, err := ctl.oss.GetSignedUrl(ctx, media.Path)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -56,7 +56,7 @@ func (ctl *medias) Show(ctx fiber.Ctx, media *models.Media) error {
|
||||
// @Success 204 {object} any "成功"
|
||||
// @Router /admin/medias/:id [delete]
|
||||
// @Bind media path key(id) model(id)
|
||||
func (ctl *medias) Delete(ctx fiber.Ctx, media *models.Media) error {
|
||||
func (ctl *medias) Delete(ctx fiber.Ctx, media *models.Medium) error {
|
||||
if err := ctl.oss.Delete(ctx, media.Path); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ func (ctl *posts) Create(ctx fiber.Ctx, form *PostForm) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
assets := lo.Map(medias, func(media *models.Media, _ int) fields.MediaAsset {
|
||||
assets := lo.Map(medias, func(media *models.Medium, _ int) fields.MediaAsset {
|
||||
return fields.MediaAsset{
|
||||
Type: media.MimeType,
|
||||
Media: media.ID,
|
||||
@@ -144,7 +144,7 @@ func (ctl *posts) Update(ctx fiber.Ctx, post *models.Post, form *PostForm) error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
assets := lo.Map(medias, func(media *models.Media, _ int) fields.MediaAsset {
|
||||
assets := lo.Map(medias, func(media *models.Medium, _ int) fields.MediaAsset {
|
||||
return fields.MediaAsset{
|
||||
Type: media.MimeType,
|
||||
Media: media.ID,
|
||||
@@ -178,7 +178,7 @@ func (ctl *posts) Delete(ctx fiber.Ctx, post *models.Post) error {
|
||||
|
||||
type PostItem struct {
|
||||
*models.Post
|
||||
Medias []*models.Media `json:"medias"`
|
||||
Medias []*models.Medium `json:"medias"`
|
||||
BoughtCount int64 `json:"bought_count"`
|
||||
}
|
||||
|
||||
|
||||
@@ -5,11 +5,12 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"go.ipao.vip/gen/field"
|
||||
"quyun/v2/app/middlewares"
|
||||
"quyun/v2/app/requests"
|
||||
"quyun/v2/database/models"
|
||||
|
||||
"go.ipao.vip/gen/field"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
log "github.com/sirupsen/logrus"
|
||||
_ "go.ipao.vip/atom"
|
||||
@@ -59,9 +60,9 @@ func (r *Routes) Register(router fiber.Router) {
|
||||
r.log.Debugf("Registering route: Delete /admin/medias/:id -> medias.Delete")
|
||||
router.Delete("/admin/medias/:id"[len(r.Path()):], Func1(
|
||||
r.medias.Delete,
|
||||
func(ctx fiber.Ctx) (*models.Media, error) {
|
||||
func(ctx fiber.Ctx) (*models.Medium, error) {
|
||||
v := fiber.Params[int](ctx, "id")
|
||||
return models.MediaQuery.WithContext(ctx).Where(field.NewUnsafeFieldRaw("id = ?", v)).First()
|
||||
return models.MediumQuery.WithContext(ctx).Where(field.NewUnsafeFieldRaw("id = ?", v)).First()
|
||||
},
|
||||
))
|
||||
r.log.Debugf("Registering route: Get /admin/medias -> medias.List")
|
||||
@@ -73,9 +74,9 @@ func (r *Routes) Register(router fiber.Router) {
|
||||
r.log.Debugf("Registering route: Get /admin/medias/:id -> medias.Show")
|
||||
router.Get("/admin/medias/:id"[len(r.Path()):], Func1(
|
||||
r.medias.Show,
|
||||
func(ctx fiber.Ctx) (*models.Media, error) {
|
||||
func(ctx fiber.Ctx) (*models.Medium, error) {
|
||||
v := fiber.Params[int](ctx, "id")
|
||||
return models.MediaQuery.WithContext(ctx).Where(field.NewUnsafeFieldRaw("id = ?", v)).First()
|
||||
return models.MediumQuery.WithContext(ctx).Where(field.NewUnsafeFieldRaw("id = ?", v)).First()
|
||||
},
|
||||
))
|
||||
// Register routes for controller: orders
|
||||
|
||||
@@ -82,7 +82,7 @@ func (up *uploads) PostUploadedAction(ctx fiber.Ctx, body *PostUploadedForm) err
|
||||
return err
|
||||
}
|
||||
|
||||
m = &models.Media{
|
||||
m = &models.Medium{
|
||||
Name: body.OriginalName,
|
||||
MimeType: body.MimeType,
|
||||
Size: body.Size,
|
||||
|
||||
34
backend_v1/app/http/auth.go
Normal file
34
backend_v1/app/http/auth.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"errors"
|
||||
|
||||
"quyun/v2/app/services"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// @provider
|
||||
type auth struct{}
|
||||
|
||||
// Phone
|
||||
//
|
||||
// @Summary 手机验证
|
||||
// @Tags Auth
|
||||
// @Produce json
|
||||
// @Success 200 {object} requests.Pager{items=PostItem} "成功"
|
||||
// @Router /v1/auth/:phone [post]
|
||||
// @Bind phone path
|
||||
func (ctl *posts) Phone(ctx fiber.Ctx, phone string) error {
|
||||
_, err := services.Users.FindByPhone(ctx, phone)
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return errors.New("手机号未注册,请联系管理员开通")
|
||||
}
|
||||
return err
|
||||
}
|
||||
// TODO: send sms
|
||||
return nil
|
||||
}
|
||||
@@ -81,7 +81,7 @@ func (ctl *posts) List(
|
||||
log.Errorf("GetMediaByIds err: %v", err)
|
||||
return PostItem{}, false
|
||||
}
|
||||
mediaUrls := lo.FilterMap(medias, func(item *models.Media, _ int) (string, bool) {
|
||||
mediaUrls := lo.FilterMap(medias, func(item *models.Medium, _ int) (string, bool) {
|
||||
url, err := ctl.oss.GetSignedUrl(ctx, item.Path)
|
||||
if err != nil {
|
||||
log.WithError(err).Errorf("head image GetSignedUrl err: %v", err)
|
||||
@@ -155,7 +155,7 @@ func (ctl *posts) Show(ctx fiber.Ctx, post *models.Post, user *models.User) (*Po
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mediaUrls := lo.FilterMap(medias, func(item *models.Media, _ int) (string, bool) {
|
||||
mediaUrls := lo.FilterMap(medias, func(item *models.Medium, _ int) (string, bool) {
|
||||
url, err := ctl.oss.GetSignedUrl(ctx, item.Path)
|
||||
if err != nil {
|
||||
return "", false
|
||||
@@ -278,7 +278,7 @@ func (ctl *posts) Mine(
|
||||
log.Errorf("GetMediaByIds err: %v", err)
|
||||
return PostItem{}, false
|
||||
}
|
||||
mediaUrls := lo.FilterMap(medias, func(item *models.Media, _ int) (string, bool) {
|
||||
mediaUrls := lo.FilterMap(medias, func(item *models.Medium, _ int) (string, bool) {
|
||||
url, err := ctl.oss.GetSignedUrl(ctx, item.Path)
|
||||
if err != nil {
|
||||
log.WithError(err).Errorf("head image GetSignedUrl err: %v", err)
|
||||
|
||||
@@ -5,11 +5,12 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"go.ipao.vip/gen/field"
|
||||
"quyun/v2/app/middlewares"
|
||||
"quyun/v2/app/requests"
|
||||
"quyun/v2/database/models"
|
||||
|
||||
"go.ipao.vip/gen/field"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
log "github.com/sirupsen/logrus"
|
||||
_ "go.ipao.vip/atom"
|
||||
|
||||
@@ -70,7 +70,7 @@ func (w *PublishDraftPostsWorker) Work(ctx context.Context, job *Job[PublishDraf
|
||||
return JobCancel(err)
|
||||
}
|
||||
|
||||
assets := lo.FilterMap(relationMedias, func(media *models.Media, _ int) (fields.MediaAsset, bool) {
|
||||
assets := lo.FilterMap(relationMedias, func(media *models.Medium, _ int) (fields.MediaAsset, bool) {
|
||||
return fields.MediaAsset{
|
||||
Type: media.MimeType,
|
||||
Media: media.ID,
|
||||
@@ -95,7 +95,7 @@ func (w *PublishDraftPostsWorker) Work(ctx context.Context, job *Job[PublishDraf
|
||||
Likes: 0,
|
||||
Tags: types.NewJSONType([]string{}),
|
||||
Assets: types.NewJSONType(assets),
|
||||
HeadImages: types.NewJSONType(lo.FilterMap(relationMedias, func(media *models.Media, _ int) (int64, bool) {
|
||||
HeadImages: types.NewJSONType(lo.FilterMap(relationMedias, func(media *models.Medium, _ int) (int64, bool) {
|
||||
return media.ID, media.MimeType == "image/jpeg"
|
||||
})),
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ func (w *VideoExtractHeadImageWorker) Work(ctx context.Context, job *Job[VideoEx
|
||||
name := "[展示图]" + media.Name + ".jpg"
|
||||
|
||||
// create a new media record for the image
|
||||
imageMedia := &models.Media{
|
||||
imageMedia := &models.Medium{
|
||||
Name: name,
|
||||
MimeType: "image/jpeg",
|
||||
Size: fileSize,
|
||||
|
||||
@@ -92,7 +92,7 @@ func (w *VideoStoreShortWorker) Work(ctx context.Context, job *Job[VideoStoreSho
|
||||
log.Infof("got file size %s %d", job.Args.FilePath, fileSize)
|
||||
|
||||
// save to db and relate to master
|
||||
mediaModel := &models.Media{
|
||||
mediaModel := &models.Medium{
|
||||
Name: "[试听] " + media.Name,
|
||||
MimeType: media.MimeType,
|
||||
Size: fileSize,
|
||||
|
||||
@@ -16,7 +16,7 @@ func (f *Middlewares) AuthFrontend(ctx fiber.Ctx) error {
|
||||
return ctx.Next()
|
||||
}
|
||||
|
||||
if f.app.IsDevMode() && true {
|
||||
if f.app.IsDevMode() && false {
|
||||
user, err := services.Users.FindByID(ctx.Context(), 1001)
|
||||
if err != nil {
|
||||
return ctx.Send([]byte("User not found"))
|
||||
@@ -33,7 +33,7 @@ func (f *Middlewares) AuthFrontend(ctx fiber.Ctx) error {
|
||||
query := u.Query()
|
||||
query.Set("redirect", fullUrl)
|
||||
u.RawQuery = query.Encode()
|
||||
u.Path = "/v1/auth/wechat" // TODO: use phone validation
|
||||
u.Path = "/v1/auth/phone"
|
||||
fullUrl = u.String()
|
||||
|
||||
// check cookie exists
|
||||
@@ -21,7 +21,7 @@ func (m *media) List(
|
||||
) (*requests.Pager, error) {
|
||||
pagination.Format()
|
||||
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
|
||||
items, cnt, err := query.
|
||||
Where(conds...).
|
||||
@@ -39,12 +39,12 @@ func (m *media) List(
|
||||
}
|
||||
|
||||
// GetByIds
|
||||
func (m *media) GetByIds(ctx context.Context, ids []int64) ([]*models.Media, error) {
|
||||
func (m *media) GetByIds(ctx context.Context, ids []int64) ([]*models.Medium, error) {
|
||||
if len(ids) == 0 {
|
||||
return []*models.Media{}, nil
|
||||
return []*models.Medium{}, nil
|
||||
}
|
||||
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
|
||||
items, err := query.
|
||||
Where(tbl.ID.In(ids...)).
|
||||
@@ -57,8 +57,8 @@ func (m *media) GetByIds(ctx context.Context, ids []int64) ([]*models.Media, err
|
||||
}
|
||||
|
||||
// GetByHash
|
||||
func (m *media) GetByHash(ctx context.Context, hash string) (*models.Media, error) {
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
func (m *media) GetByHash(ctx context.Context, hash string) (*models.Medium, error) {
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
item, err := query.
|
||||
Where(tbl.Hash.Eq(hash)).
|
||||
First()
|
||||
@@ -70,7 +70,7 @@ func (m *media) GetByHash(ctx context.Context, hash string) (*models.Media, erro
|
||||
|
||||
// UpdateMetas
|
||||
func (m *media) UpdateMetas(ctx context.Context, id int64, metas fields.MediaMetas) error {
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
_, err := query.
|
||||
Where(tbl.ID.Eq(id)).
|
||||
Update(tbl.Metas, metas)
|
||||
@@ -82,14 +82,14 @@ func (m *media) UpdateMetas(ctx context.Context, id int64, metas fields.MediaMet
|
||||
|
||||
// GetRelationMedias
|
||||
|
||||
func (m *media) GetRelations(ctx context.Context, hash string) ([]*models.Media, error) {
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
func (m *media) GetRelations(ctx context.Context, hash string) ([]*models.Medium, error) {
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
return query.Where(tbl.Metas.KeyEq("parent_hash", hash)).Find()
|
||||
}
|
||||
|
||||
// FindByID
|
||||
func (m *media) FindByID(ctx context.Context, id int64) (*models.Media, error) {
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
func (m *media) FindByID(ctx context.Context, id int64) (*models.Medium, error) {
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
item, err := query.Where(tbl.ID.Eq(id)).First()
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to find media by id: %d", id)
|
||||
@@ -99,7 +99,7 @@ func (m *media) FindByID(ctx context.Context, id int64) (*models.Media, error) {
|
||||
|
||||
// Count
|
||||
func (m *media) Count(ctx context.Context, conds ...gen.Condition) (int64, error) {
|
||||
_, query := models.MediaQuery.QueryContext(ctx)
|
||||
_, query := models.MediumQuery.QueryContext(ctx)
|
||||
if len(conds) > 0 {
|
||||
query = query.Where(conds...)
|
||||
}
|
||||
|
||||
@@ -142,11 +142,11 @@ func (m *posts) GetPostsMapByIDs(ctx context.Context, ids []int64) (map[int64]*m
|
||||
}
|
||||
|
||||
// GetMediaByIds
|
||||
func (m *posts) GetMediasByIds(ctx context.Context, ids []int64) ([]*models.Media, error) {
|
||||
func (m *posts) GetMediasByIds(ctx context.Context, ids []int64) ([]*models.Medium, error) {
|
||||
if len(ids) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
tbl, query := models.MediaQuery.QueryContext(ctx)
|
||||
tbl, query := models.MediumQuery.QueryContext(ctx)
|
||||
return query.Where(tbl.ID.In(ids...)).Find()
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,6 @@ func (m *users) PostList(
|
||||
pagePosts, cnt, err := query.Select(tbl.PostID).
|
||||
Where(tbl.UserID.Eq(userId)).
|
||||
FindByPage(int(pagination.Offset()), int(pagination.Limit))
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -211,3 +210,9 @@ func (m *users) Count(ctx context.Context, conds ...gen.Condition) (int64, error
|
||||
}
|
||||
return query.Count()
|
||||
}
|
||||
|
||||
// FindByPhone
|
||||
func (m *users) FindByPhone(ctx context.Context, phone string) (*models.User, error) {
|
||||
tbl, query := models.UserQuery.QueryContext(ctx)
|
||||
return query.Where(tbl.Phone.Eq(phone)).First()
|
||||
}
|
||||
|
||||
@@ -26,6 +26,6 @@ field_type:
|
||||
status: fields.OrderStatus
|
||||
meta: types.JSONType[fields.OrderMeta]
|
||||
|
||||
medias:
|
||||
media:
|
||||
metas: types.JSONType[fields.MediaMetas]
|
||||
field_relate:
|
||||
|
||||
13
backend_v1/database/migrations/20251220033752_alter_user.sql
Normal file
13
backend_v1/database/migrations/20251220033752_alter_user.sql
Normal file
@@ -0,0 +1,13 @@
|
||||
-- +goose Up
|
||||
-- +goose StatementBegin
|
||||
-- add phone field to users table
|
||||
ALTER TABLE public.users
|
||||
ADD phone varchar(15) DEFAULT '' NOT NULL;
|
||||
|
||||
-- +goose StatementEnd
|
||||
-- +goose Down
|
||||
-- +goose StatementBegin
|
||||
ALTER TABLE public.users
|
||||
DROP COLUMN phone;
|
||||
|
||||
-- +goose StatementEnd
|
||||
@@ -14,10 +14,10 @@ import (
|
||||
"go.ipao.vip/gen/types"
|
||||
)
|
||||
|
||||
const TableNameMedia = "medias"
|
||||
const TableNameMedium = "media"
|
||||
|
||||
// Media mapped from table <medias>
|
||||
type Media struct {
|
||||
// Medium mapped from table <media>
|
||||
type Medium struct {
|
||||
ID int64 `gorm:"column:id;type:bigint;primaryKey;autoIncrement:true" json:"id"`
|
||||
CreatedAt time.Time `gorm:"column:created_at;type:timestamp without time zone;not null;default:now()" json:"created_at"`
|
||||
Name string `gorm:"column:name;type:character varying(255);not null" json:"name"`
|
||||
@@ -30,29 +30,29 @@ type Media struct {
|
||||
|
||||
// Quick operations without importing query package
|
||||
// Update applies changed fields to the database using the default DB.
|
||||
func (m *Media) Update(ctx context.Context) (gen.ResultInfo, error) {
|
||||
return Q.Media.WithContext(ctx).Updates(m)
|
||||
func (m *Medium) Update(ctx context.Context) (gen.ResultInfo, error) {
|
||||
return Q.Medium.WithContext(ctx).Updates(m)
|
||||
}
|
||||
|
||||
// Save upserts the model using the default DB.
|
||||
func (m *Media) Save(ctx context.Context) error { return Q.Media.WithContext(ctx).Save(m) }
|
||||
func (m *Medium) Save(ctx context.Context) error { return Q.Medium.WithContext(ctx).Save(m) }
|
||||
|
||||
// Create inserts the model using the default DB.
|
||||
func (m *Media) Create(ctx context.Context) error { return Q.Media.WithContext(ctx).Create(m) }
|
||||
func (m *Medium) Create(ctx context.Context) error { return Q.Medium.WithContext(ctx).Create(m) }
|
||||
|
||||
// Delete removes the row represented by the model using the default DB.
|
||||
func (m *Media) Delete(ctx context.Context) (gen.ResultInfo, error) {
|
||||
return Q.Media.WithContext(ctx).Delete(m)
|
||||
func (m *Medium) Delete(ctx context.Context) (gen.ResultInfo, error) {
|
||||
return Q.Medium.WithContext(ctx).Delete(m)
|
||||
}
|
||||
|
||||
// ForceDelete permanently deletes the row (ignores soft delete) using the default DB.
|
||||
func (m *Media) ForceDelete(ctx context.Context) (gen.ResultInfo, error) {
|
||||
return Q.Media.WithContext(ctx).Unscoped().Delete(m)
|
||||
func (m *Medium) ForceDelete(ctx context.Context) (gen.ResultInfo, error) {
|
||||
return Q.Medium.WithContext(ctx).Unscoped().Delete(m)
|
||||
}
|
||||
|
||||
// Reload reloads the model from database by its primary key and overwrites current fields.
|
||||
func (m *Media) Reload(ctx context.Context) error {
|
||||
fresh, err := Q.Media.WithContext(ctx).GetByID(m.ID)
|
||||
func (m *Medium) Reload(ctx context.Context) error {
|
||||
fresh, err := Q.Medium.WithContext(ctx).GetByID(m.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -17,30 +17,30 @@ import (
|
||||
"gorm.io/plugin/dbresolver"
|
||||
)
|
||||
|
||||
func newMedia(db *gorm.DB, opts ...gen.DOOption) mediaQuery {
|
||||
_mediaQuery := mediaQuery{}
|
||||
func newMedium(db *gorm.DB, opts ...gen.DOOption) mediumQuery {
|
||||
_mediumQuery := mediumQuery{}
|
||||
|
||||
_mediaQuery.mediaQueryDo.UseDB(db, opts...)
|
||||
_mediaQuery.mediaQueryDo.UseModel(&Media{})
|
||||
_mediumQuery.mediumQueryDo.UseDB(db, opts...)
|
||||
_mediumQuery.mediumQueryDo.UseModel(&Medium{})
|
||||
|
||||
tableName := _mediaQuery.mediaQueryDo.TableName()
|
||||
_mediaQuery.ALL = field.NewAsterisk(tableName)
|
||||
_mediaQuery.ID = field.NewInt64(tableName, "id")
|
||||
_mediaQuery.CreatedAt = field.NewTime(tableName, "created_at")
|
||||
_mediaQuery.Name = field.NewString(tableName, "name")
|
||||
_mediaQuery.MimeType = field.NewString(tableName, "mime_type")
|
||||
_mediaQuery.Size = field.NewInt64(tableName, "size")
|
||||
_mediaQuery.Path = field.NewString(tableName, "path")
|
||||
_mediaQuery.Metas = field.NewJSONB(tableName, "metas")
|
||||
_mediaQuery.Hash = field.NewString(tableName, "hash")
|
||||
tableName := _mediumQuery.mediumQueryDo.TableName()
|
||||
_mediumQuery.ALL = field.NewAsterisk(tableName)
|
||||
_mediumQuery.ID = field.NewInt64(tableName, "id")
|
||||
_mediumQuery.CreatedAt = field.NewTime(tableName, "created_at")
|
||||
_mediumQuery.Name = field.NewString(tableName, "name")
|
||||
_mediumQuery.MimeType = field.NewString(tableName, "mime_type")
|
||||
_mediumQuery.Size = field.NewInt64(tableName, "size")
|
||||
_mediumQuery.Path = field.NewString(tableName, "path")
|
||||
_mediumQuery.Metas = field.NewJSONB(tableName, "metas")
|
||||
_mediumQuery.Hash = field.NewString(tableName, "hash")
|
||||
|
||||
_mediaQuery.fillFieldMap()
|
||||
_mediumQuery.fillFieldMap()
|
||||
|
||||
return _mediaQuery
|
||||
return _mediumQuery
|
||||
}
|
||||
|
||||
type mediaQuery struct {
|
||||
mediaQueryDo mediaQueryDo
|
||||
type mediumQuery struct {
|
||||
mediumQueryDo mediumQueryDo
|
||||
|
||||
ALL field.Asterisk
|
||||
ID field.Int64
|
||||
@@ -55,17 +55,17 @@ type mediaQuery struct {
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
|
||||
func (m mediaQuery) Table(newTableName string) *mediaQuery {
|
||||
m.mediaQueryDo.UseTable(newTableName)
|
||||
func (m mediumQuery) Table(newTableName string) *mediumQuery {
|
||||
m.mediumQueryDo.UseTable(newTableName)
|
||||
return m.updateTableName(newTableName)
|
||||
}
|
||||
|
||||
func (m mediaQuery) As(alias string) *mediaQuery {
|
||||
m.mediaQueryDo.DO = *(m.mediaQueryDo.As(alias).(*gen.DO))
|
||||
func (m mediumQuery) As(alias string) *mediumQuery {
|
||||
m.mediumQueryDo.DO = *(m.mediumQueryDo.As(alias).(*gen.DO))
|
||||
return m.updateTableName(alias)
|
||||
}
|
||||
|
||||
func (m *mediaQuery) updateTableName(table string) *mediaQuery {
|
||||
func (m *mediumQuery) updateTableName(table string) *mediumQuery {
|
||||
m.ALL = field.NewAsterisk(table)
|
||||
m.ID = field.NewInt64(table, "id")
|
||||
m.CreatedAt = field.NewTime(table, "created_at")
|
||||
@@ -81,21 +81,21 @@ func (m *mediaQuery) updateTableName(table string) *mediaQuery {
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *mediaQuery) QueryContext(ctx context.Context) (*mediaQuery, *mediaQueryDo) {
|
||||
return m, m.mediaQueryDo.WithContext(ctx)
|
||||
func (m *mediumQuery) QueryContext(ctx context.Context) (*mediumQuery, *mediumQueryDo) {
|
||||
return m, m.mediumQueryDo.WithContext(ctx)
|
||||
}
|
||||
|
||||
func (m *mediaQuery) WithContext(ctx context.Context) *mediaQueryDo {
|
||||
return m.mediaQueryDo.WithContext(ctx)
|
||||
func (m *mediumQuery) WithContext(ctx context.Context) *mediumQueryDo {
|
||||
return m.mediumQueryDo.WithContext(ctx)
|
||||
}
|
||||
|
||||
func (m mediaQuery) TableName() string { return m.mediaQueryDo.TableName() }
|
||||
func (m mediumQuery) TableName() string { return m.mediumQueryDo.TableName() }
|
||||
|
||||
func (m mediaQuery) Alias() string { return m.mediaQueryDo.Alias() }
|
||||
func (m mediumQuery) Alias() string { return m.mediumQueryDo.Alias() }
|
||||
|
||||
func (m mediaQuery) Columns(cols ...field.Expr) gen.Columns { return m.mediaQueryDo.Columns(cols...) }
|
||||
func (m mediumQuery) Columns(cols ...field.Expr) gen.Columns { return m.mediumQueryDo.Columns(cols...) }
|
||||
|
||||
func (m *mediaQuery) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
func (m *mediumQuery) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
_f, ok := m.fieldMap[fieldName]
|
||||
if !ok || _f == nil {
|
||||
return nil, false
|
||||
@@ -104,7 +104,7 @@ func (m *mediaQuery) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
return _oe, ok
|
||||
}
|
||||
|
||||
func (m *mediaQuery) fillFieldMap() {
|
||||
func (m *mediumQuery) fillFieldMap() {
|
||||
m.fieldMap = make(map[string]field.Expr, 8)
|
||||
m.fieldMap["id"] = m.ID
|
||||
m.fieldMap["created_at"] = m.CreatedAt
|
||||
@@ -116,161 +116,161 @@ func (m *mediaQuery) fillFieldMap() {
|
||||
m.fieldMap["hash"] = m.Hash
|
||||
}
|
||||
|
||||
func (m mediaQuery) clone(db *gorm.DB) mediaQuery {
|
||||
m.mediaQueryDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
func (m mediumQuery) clone(db *gorm.DB) mediumQuery {
|
||||
m.mediumQueryDo.ReplaceConnPool(db.Statement.ConnPool)
|
||||
return m
|
||||
}
|
||||
|
||||
func (m mediaQuery) replaceDB(db *gorm.DB) mediaQuery {
|
||||
m.mediaQueryDo.ReplaceDB(db)
|
||||
func (m mediumQuery) replaceDB(db *gorm.DB) mediumQuery {
|
||||
m.mediumQueryDo.ReplaceDB(db)
|
||||
return m
|
||||
}
|
||||
|
||||
type mediaQueryDo struct{ gen.DO }
|
||||
type mediumQueryDo struct{ gen.DO }
|
||||
|
||||
func (m mediaQueryDo) Debug() *mediaQueryDo {
|
||||
func (m mediumQueryDo) Debug() *mediumQueryDo {
|
||||
return m.withDO(m.DO.Debug())
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) WithContext(ctx context.Context) *mediaQueryDo {
|
||||
func (m mediumQueryDo) WithContext(ctx context.Context) *mediumQueryDo {
|
||||
return m.withDO(m.DO.WithContext(ctx))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) ReadDB() *mediaQueryDo {
|
||||
func (m mediumQueryDo) ReadDB() *mediumQueryDo {
|
||||
return m.Clauses(dbresolver.Read)
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) WriteDB() *mediaQueryDo {
|
||||
func (m mediumQueryDo) WriteDB() *mediumQueryDo {
|
||||
return m.Clauses(dbresolver.Write)
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Session(config *gorm.Session) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Session(config *gorm.Session) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Session(config))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Clauses(conds ...clause.Expression) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Clauses(conds ...clause.Expression) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Clauses(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Returning(value interface{}, columns ...string) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Returning(value interface{}, columns ...string) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Returning(value, columns...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Not(conds ...gen.Condition) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Not(conds ...gen.Condition) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Not(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Or(conds ...gen.Condition) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Or(conds ...gen.Condition) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Or(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Select(conds ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Select(conds ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Select(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Where(conds ...gen.Condition) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Where(conds ...gen.Condition) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Where(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Order(conds ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Order(conds ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Order(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Distinct(cols ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Distinct(cols ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Distinct(cols...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Omit(cols ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Omit(cols ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Omit(cols...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Join(table schema.Tabler, on ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Join(table schema.Tabler, on ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Join(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) LeftJoin(table schema.Tabler, on ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) LeftJoin(table schema.Tabler, on ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.LeftJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) RightJoin(table schema.Tabler, on ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) RightJoin(table schema.Tabler, on ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.RightJoin(table, on...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Group(cols ...field.Expr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Group(cols ...field.Expr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Group(cols...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Having(conds ...gen.Condition) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Having(conds ...gen.Condition) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Having(conds...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Limit(limit int) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Limit(limit int) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Limit(limit))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Offset(offset int) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Offset(offset int) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Offset(offset))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Scopes(funcs...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Unscoped() *mediaQueryDo {
|
||||
func (m mediumQueryDo) Unscoped() *mediumQueryDo {
|
||||
return m.withDO(m.DO.Unscoped())
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Create(values ...*Media) error {
|
||||
func (m mediumQueryDo) Create(values ...*Medium) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Create(values)
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) CreateInBatches(values []*Media, batchSize int) error {
|
||||
func (m mediumQueryDo) CreateInBatches(values []*Medium, batchSize int) error {
|
||||
return m.DO.CreateInBatches(values, batchSize)
|
||||
}
|
||||
|
||||
// Save : !!! underlying implementation is different with GORM
|
||||
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
|
||||
func (m mediaQueryDo) Save(values ...*Media) error {
|
||||
func (m mediumQueryDo) Save(values ...*Medium) error {
|
||||
if len(values) == 0 {
|
||||
return nil
|
||||
}
|
||||
return m.DO.Save(values)
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) First() (*Media, error) {
|
||||
func (m mediumQueryDo) First() (*Medium, error) {
|
||||
if result, err := m.DO.First(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*Media), nil
|
||||
return result.(*Medium), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Take() (*Media, error) {
|
||||
func (m mediumQueryDo) Take() (*Medium, error) {
|
||||
if result, err := m.DO.Take(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*Media), nil
|
||||
return result.(*Medium), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Last() (*Media, error) {
|
||||
func (m mediumQueryDo) Last() (*Medium, error) {
|
||||
if result, err := m.DO.Last(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*Media), nil
|
||||
return result.(*Medium), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Find() ([]*Media, error) {
|
||||
func (m mediumQueryDo) Find() ([]*Medium, error) {
|
||||
result, err := m.DO.Find()
|
||||
return result.([]*Media), err
|
||||
return result.([]*Medium), err
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*Media, err error) {
|
||||
buf := make([]*Media, 0, batchSize)
|
||||
func (m mediumQueryDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*Medium, err error) {
|
||||
buf := make([]*Medium, 0, batchSize)
|
||||
err = m.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
|
||||
defer func() { results = append(results, buf...) }()
|
||||
return fc(tx, batch)
|
||||
@@ -278,49 +278,49 @@ func (m mediaQueryDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int)
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) FindInBatches(result *[]*Media, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
func (m mediumQueryDo) FindInBatches(result *[]*Medium, batchSize int, fc func(tx gen.Dao, batch int) error) error {
|
||||
return m.DO.FindInBatches(result, batchSize, fc)
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Attrs(attrs ...field.AssignExpr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Attrs(attrs ...field.AssignExpr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Attrs(attrs...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Assign(attrs ...field.AssignExpr) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Assign(attrs ...field.AssignExpr) *mediumQueryDo {
|
||||
return m.withDO(m.DO.Assign(attrs...))
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Joins(fields ...field.RelationField) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Joins(fields ...field.RelationField) *mediumQueryDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Joins(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Preload(fields ...field.RelationField) *mediaQueryDo {
|
||||
func (m mediumQueryDo) Preload(fields ...field.RelationField) *mediumQueryDo {
|
||||
for _, _f := range fields {
|
||||
m = *m.withDO(m.DO.Preload(_f))
|
||||
}
|
||||
return &m
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) FirstOrInit() (*Media, error) {
|
||||
func (m mediumQueryDo) FirstOrInit() (*Medium, error) {
|
||||
if result, err := m.DO.FirstOrInit(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*Media), nil
|
||||
return result.(*Medium), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) FirstOrCreate() (*Media, error) {
|
||||
func (m mediumQueryDo) FirstOrCreate() (*Medium, error) {
|
||||
if result, err := m.DO.FirstOrCreate(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*Media), nil
|
||||
return result.(*Medium), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) FindByPage(offset int, limit int) (result []*Media, count int64, err error) {
|
||||
func (m mediumQueryDo) FindByPage(offset int, limit int) (result []*Medium, count int64, err error) {
|
||||
result, err = m.Offset(offset).Limit(limit).Find()
|
||||
if err != nil {
|
||||
return
|
||||
@@ -335,7 +335,7 @@ func (m mediaQueryDo) FindByPage(offset int, limit int) (result []*Media, count
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
func (m mediumQueryDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
|
||||
count, err = m.Count()
|
||||
if err != nil {
|
||||
return
|
||||
@@ -345,35 +345,35 @@ func (m mediaQueryDo) ScanByPage(result interface{}, offset int, limit int) (cou
|
||||
return
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Scan(result interface{}) (err error) {
|
||||
func (m mediumQueryDo) Scan(result interface{}) (err error) {
|
||||
return m.DO.Scan(result)
|
||||
}
|
||||
|
||||
func (m mediaQueryDo) Delete(models ...*Media) (result gen.ResultInfo, err error) {
|
||||
func (m mediumQueryDo) Delete(models ...*Medium) (result gen.ResultInfo, err error) {
|
||||
return m.DO.Delete(models)
|
||||
}
|
||||
|
||||
// ForceDelete performs a permanent delete (ignores soft-delete) for current scope.
|
||||
func (m mediaQueryDo) ForceDelete() (gen.ResultInfo, error) {
|
||||
func (m mediumQueryDo) ForceDelete() (gen.ResultInfo, error) {
|
||||
return m.Unscoped().Delete()
|
||||
}
|
||||
|
||||
// Inc increases the given column by step for current scope.
|
||||
func (m mediaQueryDo) Inc(column field.Expr, step int64) (gen.ResultInfo, error) {
|
||||
func (m mediumQueryDo) Inc(column field.Expr, step int64) (gen.ResultInfo, error) {
|
||||
// column = column + step
|
||||
e := field.NewUnsafeFieldRaw("?+?", column.RawExpr(), step)
|
||||
return m.DO.UpdateColumn(column, e)
|
||||
}
|
||||
|
||||
// Dec decreases the given column by step for current scope.
|
||||
func (m mediaQueryDo) Dec(column field.Expr, step int64) (gen.ResultInfo, error) {
|
||||
func (m mediumQueryDo) Dec(column field.Expr, step int64) (gen.ResultInfo, error) {
|
||||
// column = column - step
|
||||
e := field.NewUnsafeFieldRaw("?-?", column.RawExpr(), step)
|
||||
return m.DO.UpdateColumn(column, e)
|
||||
}
|
||||
|
||||
// Sum returns SUM(column) for current scope.
|
||||
func (m mediaQueryDo) Sum(column field.Expr) (float64, error) {
|
||||
func (m mediumQueryDo) Sum(column field.Expr) (float64, error) {
|
||||
var _v float64
|
||||
agg := field.NewUnsafeFieldRaw("SUM(?)", column.RawExpr())
|
||||
if err := m.Select(agg).Scan(&_v); err != nil {
|
||||
@@ -383,7 +383,7 @@ func (m mediaQueryDo) Sum(column field.Expr) (float64, error) {
|
||||
}
|
||||
|
||||
// Avg returns AVG(column) for current scope.
|
||||
func (m mediaQueryDo) Avg(column field.Expr) (float64, error) {
|
||||
func (m mediumQueryDo) Avg(column field.Expr) (float64, error) {
|
||||
var _v float64
|
||||
agg := field.NewUnsafeFieldRaw("AVG(?)", column.RawExpr())
|
||||
if err := m.Select(agg).Scan(&_v); err != nil {
|
||||
@@ -393,7 +393,7 @@ func (m mediaQueryDo) Avg(column field.Expr) (float64, error) {
|
||||
}
|
||||
|
||||
// Min returns MIN(column) for current scope.
|
||||
func (m mediaQueryDo) Min(column field.Expr) (float64, error) {
|
||||
func (m mediumQueryDo) Min(column field.Expr) (float64, error) {
|
||||
var _v float64
|
||||
agg := field.NewUnsafeFieldRaw("MIN(?)", column.RawExpr())
|
||||
if err := m.Select(agg).Scan(&_v); err != nil {
|
||||
@@ -403,7 +403,7 @@ func (m mediaQueryDo) Min(column field.Expr) (float64, error) {
|
||||
}
|
||||
|
||||
// Max returns MAX(column) for current scope.
|
||||
func (m mediaQueryDo) Max(column field.Expr) (float64, error) {
|
||||
func (m mediumQueryDo) Max(column field.Expr) (float64, error) {
|
||||
var _v float64
|
||||
agg := field.NewUnsafeFieldRaw("MAX(?)", column.RawExpr())
|
||||
if err := m.Select(agg).Scan(&_v); err != nil {
|
||||
@@ -413,7 +413,7 @@ func (m mediaQueryDo) Max(column field.Expr) (float64, error) {
|
||||
}
|
||||
|
||||
// PluckMap returns a map[key]value for selected key/value expressions within current scope.
|
||||
func (m mediaQueryDo) PluckMap(key, val field.Expr) (map[interface{}]interface{}, error) {
|
||||
func (m mediumQueryDo) PluckMap(key, val field.Expr) (map[interface{}]interface{}, error) {
|
||||
do := m.Select(key, val)
|
||||
rows, err := do.DO.Rows()
|
||||
if err != nil {
|
||||
@@ -433,7 +433,7 @@ func (m mediaQueryDo) PluckMap(key, val field.Expr) (map[interface{}]interface{}
|
||||
}
|
||||
|
||||
// Exists returns true if any record matches the given conditions.
|
||||
func (m mediaQueryDo) Exists(conds ...gen.Condition) (bool, error) {
|
||||
func (m mediumQueryDo) Exists(conds ...gen.Condition) (bool, error) {
|
||||
cnt, err := m.Where(conds...).Count()
|
||||
if err != nil {
|
||||
return false, err
|
||||
@@ -442,7 +442,7 @@ func (m mediaQueryDo) Exists(conds ...gen.Condition) (bool, error) {
|
||||
}
|
||||
|
||||
// PluckIDs returns all primary key values under current scope.
|
||||
func (m mediaQueryDo) PluckIDs() ([]int64, error) {
|
||||
func (m mediumQueryDo) PluckIDs() ([]int64, error) {
|
||||
ids := make([]int64, 0, 16)
|
||||
pk := field.NewInt64(m.TableName(), "id")
|
||||
if err := m.DO.Pluck(pk, &ids); err != nil {
|
||||
@@ -452,28 +452,28 @@ func (m mediaQueryDo) PluckIDs() ([]int64, error) {
|
||||
}
|
||||
|
||||
// GetByID finds a single record by primary key.
|
||||
func (m mediaQueryDo) GetByID(id int64) (*Media, error) {
|
||||
func (m mediumQueryDo) GetByID(id int64) (*Medium, error) {
|
||||
pk := field.NewInt64(m.TableName(), "id")
|
||||
return m.Where(pk.Eq(id)).First()
|
||||
}
|
||||
|
||||
// GetByIDs finds records by primary key list.
|
||||
func (m mediaQueryDo) GetByIDs(ids ...int64) ([]*Media, error) {
|
||||
func (m mediumQueryDo) GetByIDs(ids ...int64) ([]*Medium, error) {
|
||||
if len(ids) == 0 {
|
||||
return []*Media{}, nil
|
||||
return []*Medium{}, nil
|
||||
}
|
||||
pk := field.NewInt64(m.TableName(), "id")
|
||||
return m.Where(pk.In(ids...)).Find()
|
||||
}
|
||||
|
||||
// DeleteByID deletes records by primary key.
|
||||
func (m mediaQueryDo) DeleteByID(id int64) (gen.ResultInfo, error) {
|
||||
func (m mediumQueryDo) DeleteByID(id int64) (gen.ResultInfo, error) {
|
||||
pk := field.NewInt64(m.TableName(), "id")
|
||||
return m.Where(pk.Eq(id)).Delete()
|
||||
}
|
||||
|
||||
// DeleteByIDs deletes records by a list of primary keys.
|
||||
func (m mediaQueryDo) DeleteByIDs(ids ...int64) (gen.ResultInfo, error) {
|
||||
func (m mediumQueryDo) DeleteByIDs(ids ...int64) (gen.ResultInfo, error) {
|
||||
if len(ids) == 0 {
|
||||
return gen.ResultInfo{RowsAffected: 0, Error: nil}, nil
|
||||
}
|
||||
@@ -481,7 +481,7 @@ func (m mediaQueryDo) DeleteByIDs(ids ...int64) (gen.ResultInfo, error) {
|
||||
return m.Where(pk.In(ids...)).Delete()
|
||||
}
|
||||
|
||||
func (m *mediaQueryDo) withDO(do gen.Dao) *mediaQueryDo {
|
||||
func (m *mediumQueryDo) withDO(do gen.Dao) *mediumQueryDo {
|
||||
m.DO = *do.(*gen.DO)
|
||||
return m
|
||||
}
|
||||
@@ -17,7 +17,7 @@ import (
|
||||
|
||||
var (
|
||||
Q = new(Query)
|
||||
MediaQuery *mediaQuery
|
||||
MediumQuery *mediumQuery
|
||||
OrderQuery *orderQuery
|
||||
PostQuery *postQuery
|
||||
UserQuery *userQuery
|
||||
@@ -26,7 +26,7 @@ var (
|
||||
|
||||
func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
|
||||
*Q = *Use(db, opts...)
|
||||
MediaQuery = &Q.Media
|
||||
MediumQuery = &Q.Medium
|
||||
OrderQuery = &Q.Order
|
||||
PostQuery = &Q.Post
|
||||
UserQuery = &Q.User
|
||||
@@ -36,7 +36,7 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
|
||||
func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
|
||||
return &Query{
|
||||
db: db,
|
||||
Media: newMedia(db, opts...),
|
||||
Medium: newMedium(db, opts...),
|
||||
Order: newOrder(db, opts...),
|
||||
Post: newPost(db, opts...),
|
||||
User: newUser(db, opts...),
|
||||
@@ -47,7 +47,7 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
|
||||
type Query struct {
|
||||
db *gorm.DB
|
||||
|
||||
Media mediaQuery
|
||||
Medium mediumQuery
|
||||
Order orderQuery
|
||||
Post postQuery
|
||||
User userQuery
|
||||
@@ -59,7 +59,7 @@ func (q *Query) Available() bool { return q.db != nil }
|
||||
func (q *Query) clone(db *gorm.DB) *Query {
|
||||
return &Query{
|
||||
db: db,
|
||||
Media: q.Media.clone(db),
|
||||
Medium: q.Medium.clone(db),
|
||||
Order: q.Order.clone(db),
|
||||
Post: q.Post.clone(db),
|
||||
User: q.User.clone(db),
|
||||
@@ -78,7 +78,7 @@ func (q *Query) WriteDB() *Query {
|
||||
func (q *Query) ReplaceDB(db *gorm.DB) *Query {
|
||||
return &Query{
|
||||
db: db,
|
||||
Media: q.Media.replaceDB(db),
|
||||
Medium: q.Medium.replaceDB(db),
|
||||
Order: q.Order.replaceDB(db),
|
||||
Post: q.Post.replaceDB(db),
|
||||
User: q.User.replaceDB(db),
|
||||
@@ -87,7 +87,7 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query {
|
||||
}
|
||||
|
||||
type queryCtx struct {
|
||||
Media *mediaQueryDo
|
||||
Medium *mediumQueryDo
|
||||
Order *orderQueryDo
|
||||
Post *postQueryDo
|
||||
User *userQueryDo
|
||||
@@ -96,7 +96,7 @@ type queryCtx struct {
|
||||
|
||||
func (q *Query) WithContext(ctx context.Context) *queryCtx {
|
||||
return &queryCtx{
|
||||
Media: q.Media.WithContext(ctx),
|
||||
Medium: q.Medium.WithContext(ctx),
|
||||
Order: q.Order.WithContext(ctx),
|
||||
Post: q.Post.WithContext(ctx),
|
||||
User: q.User.WithContext(ctx),
|
||||
|
||||
@@ -30,6 +30,7 @@ type User struct {
|
||||
Metas types.JSONType[fields.UserMetas] `gorm:"column:metas;type:jsonb;not null;default:{}" json:"metas"`
|
||||
AuthToken types.JSONType[fields.UserAuthToken] `gorm:"column:auth_token;type:jsonb;not null;default:{}" json:"auth_token"`
|
||||
Balance int64 `gorm:"column:balance;type:bigint;not null" json:"balance"`
|
||||
Phone string `gorm:"column:phone;type:character varying(15);not null" json:"phone"`
|
||||
}
|
||||
|
||||
// Quick operations without importing query package
|
||||
|
||||
@@ -36,6 +36,7 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) userQuery {
|
||||
_userQuery.Metas = field.NewJSONB(tableName, "metas")
|
||||
_userQuery.AuthToken = field.NewJSONB(tableName, "auth_token")
|
||||
_userQuery.Balance = field.NewInt64(tableName, "balance")
|
||||
_userQuery.Phone = field.NewString(tableName, "phone")
|
||||
|
||||
_userQuery.fillFieldMap()
|
||||
|
||||
@@ -57,6 +58,7 @@ type userQuery struct {
|
||||
Metas field.JSONB
|
||||
AuthToken field.JSONB
|
||||
Balance field.Int64
|
||||
Phone field.String
|
||||
|
||||
fieldMap map[string]field.Expr
|
||||
}
|
||||
@@ -84,6 +86,7 @@ func (u *userQuery) updateTableName(table string) *userQuery {
|
||||
u.Metas = field.NewJSONB(table, "metas")
|
||||
u.AuthToken = field.NewJSONB(table, "auth_token")
|
||||
u.Balance = field.NewInt64(table, "balance")
|
||||
u.Phone = field.NewString(table, "phone")
|
||||
|
||||
u.fillFieldMap()
|
||||
|
||||
@@ -114,7 +117,7 @@ func (u *userQuery) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
||||
}
|
||||
|
||||
func (u *userQuery) fillFieldMap() {
|
||||
u.fieldMap = make(map[string]field.Expr, 11)
|
||||
u.fieldMap = make(map[string]field.Expr, 12)
|
||||
u.fieldMap["id"] = u.ID
|
||||
u.fieldMap["created_at"] = u.CreatedAt
|
||||
u.fieldMap["updated_at"] = u.UpdatedAt
|
||||
@@ -126,6 +129,7 @@ func (u *userQuery) fillFieldMap() {
|
||||
u.fieldMap["metas"] = u.Metas
|
||||
u.fieldMap["auth_token"] = u.AuthToken
|
||||
u.fieldMap["balance"] = u.Balance
|
||||
u.fieldMap["phone"] = u.Phone
|
||||
}
|
||||
|
||||
func (u userQuery) clone(db *gorm.DB) userQuery {
|
||||
|
||||
@@ -95,7 +95,7 @@ const docTemplate = `{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/models.Media"
|
||||
"$ref": "#/definitions/models.Medium"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -698,235 +698,33 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品列表",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/mine": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "我的已购作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/{id}/buy": {
|
||||
"/v1/auth/{phone}": {
|
||||
"post": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "购买作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功(余额支付返回 AppId=balance)",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/wechat.JSAPIPayParams"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/{id}/play": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "获取播放地址",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
"Auth"
|
||||
],
|
||||
"summary": "手机验证",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.PlayUrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/{id}/show": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品详情",
|
||||
"parameters": [
|
||||
"allOf": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"/users/profile": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "获取个人信息",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.UserInfo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/users/username": {
|
||||
"put": {
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "修改用户名",
|
||||
"parameters": [
|
||||
{
|
||||
"description": "请求体",
|
||||
"name": "form",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.ProfileForm"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1008,6 +806,239 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品列表",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/mine": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "我的已购作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/{id}/buy": {
|
||||
"post": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "购买作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功(余额支付返回 AppId=balance)",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/wechat.JSAPIPayParams"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/{id}/play": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "获取播放地址",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.PlayUrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/{id}/show": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品详情",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/users/profile": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "获取个人信息",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.UserInfo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/users/username": {
|
||||
"put": {
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "修改用户名",
|
||||
"parameters": [
|
||||
{
|
||||
"description": "请求体",
|
||||
"name": "form",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.ProfileForm"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"definitions": {
|
||||
@@ -1097,7 +1128,7 @@ const docTemplate = `{
|
||||
"medias": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/models.Media"
|
||||
"$ref": "#/definitions/models.Medium"
|
||||
}
|
||||
},
|
||||
"price": {
|
||||
@@ -1335,7 +1366,7 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"models.Media": {
|
||||
"models.Medium": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"created_at": {
|
||||
@@ -1348,7 +1379,10 @@ const docTemplate = `{
|
||||
"type": "integer"
|
||||
},
|
||||
"metas": {
|
||||
"$ref": "#/definitions/types.JSONType-fields_MediaMetas"
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"mime_type": {
|
||||
"type": "string"
|
||||
@@ -1441,6 +1475,9 @@ const docTemplate = `{
|
||||
"open_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"phone": {
|
||||
"type": "string"
|
||||
},
|
||||
"status": {
|
||||
"$ref": "#/definitions/fields.UserStatus"
|
||||
},
|
||||
@@ -1552,9 +1589,6 @@ const docTemplate = `{
|
||||
"types.JSONType-array_string": {
|
||||
"type": "object"
|
||||
},
|
||||
"types.JSONType-fields_MediaMetas": {
|
||||
"type": "object"
|
||||
},
|
||||
"types.JSONType-fields_OrderMeta": {
|
||||
"type": "object"
|
||||
},
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/models.Media"
|
||||
"$ref": "#/definitions/models.Medium"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -692,235 +692,33 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品列表",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/mine": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "我的已购作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/{id}/buy": {
|
||||
"/v1/auth/{phone}": {
|
||||
"post": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "购买作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功(余额支付返回 AppId=balance)",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/wechat.JSAPIPayParams"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/{id}/play": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "获取播放地址",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
"Auth"
|
||||
],
|
||||
"summary": "手机验证",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.PlayUrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/posts/{id}/show": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品详情",
|
||||
"parameters": [
|
||||
"allOf": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"/users/profile": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "获取个人信息",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.UserInfo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/users/username": {
|
||||
"put": {
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "修改用户名",
|
||||
"parameters": [
|
||||
{
|
||||
"description": "请求体",
|
||||
"name": "form",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.ProfileForm"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1002,6 +800,239 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品列表",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/mine": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "我的已购作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "limit",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "integer",
|
||||
"name": "page",
|
||||
"in": "query"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"name": "keyword",
|
||||
"in": "query"
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/requests.Pager"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/{id}/buy": {
|
||||
"post": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "购买作品",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功(余额支付返回 AppId=balance)",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/wechat.JSAPIPayParams"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/{id}/play": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "获取播放地址",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.PlayUrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/posts/{id}/show": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Posts"
|
||||
],
|
||||
"summary": "作品详情",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "作品 ID",
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.PostItem"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/users/profile": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "获取个人信息",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.UserInfo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/users/username": {
|
||||
"put": {
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"Users"
|
||||
],
|
||||
"summary": "修改用户名",
|
||||
"parameters": [
|
||||
{
|
||||
"description": "请求体",
|
||||
"name": "form",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/http.ProfileForm"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "成功",
|
||||
"schema": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"definitions": {
|
||||
@@ -1091,7 +1122,7 @@
|
||||
"medias": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/models.Media"
|
||||
"$ref": "#/definitions/models.Medium"
|
||||
}
|
||||
},
|
||||
"price": {
|
||||
@@ -1329,7 +1360,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"models.Media": {
|
||||
"models.Medium": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"created_at": {
|
||||
@@ -1342,7 +1373,10 @@
|
||||
"type": "integer"
|
||||
},
|
||||
"metas": {
|
||||
"$ref": "#/definitions/types.JSONType-fields_MediaMetas"
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"mime_type": {
|
||||
"type": "string"
|
||||
@@ -1435,6 +1469,9 @@
|
||||
"open_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"phone": {
|
||||
"type": "string"
|
||||
},
|
||||
"status": {
|
||||
"$ref": "#/definitions/fields.UserStatus"
|
||||
},
|
||||
@@ -1546,9 +1583,6 @@
|
||||
"types.JSONType-array_string": {
|
||||
"type": "object"
|
||||
},
|
||||
"types.JSONType-fields_MediaMetas": {
|
||||
"type": "object"
|
||||
},
|
||||
"types.JSONType-fields_OrderMeta": {
|
||||
"type": "object"
|
||||
},
|
||||
|
||||
@@ -57,7 +57,7 @@ definitions:
|
||||
type: integer
|
||||
medias:
|
||||
items:
|
||||
$ref: '#/definitions/models.Media'
|
||||
$ref: '#/definitions/models.Medium'
|
||||
type: array
|
||||
price:
|
||||
type: integer
|
||||
@@ -220,7 +220,7 @@ definitions:
|
||||
username:
|
||||
type: string
|
||||
type: object
|
||||
models.Media:
|
||||
models.Medium:
|
||||
properties:
|
||||
created_at:
|
||||
type: string
|
||||
@@ -229,7 +229,9 @@ definitions:
|
||||
id:
|
||||
type: integer
|
||||
metas:
|
||||
$ref: '#/definitions/types.JSONType-fields_MediaMetas'
|
||||
items:
|
||||
type: integer
|
||||
type: array
|
||||
mime_type:
|
||||
type: string
|
||||
name:
|
||||
@@ -290,6 +292,8 @@ definitions:
|
||||
$ref: '#/definitions/types.JSONType-fields_UserMetas'
|
||||
open_id:
|
||||
type: string
|
||||
phone:
|
||||
type: string
|
||||
status:
|
||||
$ref: '#/definitions/fields.UserStatus'
|
||||
updated_at:
|
||||
@@ -363,8 +367,6 @@ definitions:
|
||||
type: object
|
||||
types.JSONType-array_string:
|
||||
type: object
|
||||
types.JSONType-fields_MediaMetas:
|
||||
type: object
|
||||
types.JSONType-fields_OrderMeta:
|
||||
type: object
|
||||
types.JSONType-fields_UserAuthToken:
|
||||
@@ -448,7 +450,7 @@ paths:
|
||||
- $ref: '#/definitions/requests.Pager'
|
||||
- properties:
|
||||
items:
|
||||
$ref: '#/definitions/models.Media'
|
||||
$ref: '#/definitions/models.Medium'
|
||||
type: object
|
||||
summary: 媒体列表
|
||||
tags:
|
||||
@@ -828,102 +830,8 @@ paths:
|
||||
summary: 调整用户余额
|
||||
tags:
|
||||
- Admin Users
|
||||
/posts:
|
||||
get:
|
||||
parameters:
|
||||
- in: query
|
||||
name: limit
|
||||
type: integer
|
||||
- in: query
|
||||
name: page
|
||||
type: integer
|
||||
- in: query
|
||||
name: keyword
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
allOf:
|
||||
- $ref: '#/definitions/requests.Pager'
|
||||
- properties:
|
||||
items:
|
||||
$ref: '#/definitions/http.PostItem'
|
||||
type: object
|
||||
summary: 作品列表
|
||||
tags:
|
||||
- Posts
|
||||
/posts/{id}/buy:
|
||||
/v1/auth/{phone}:
|
||||
post:
|
||||
parameters:
|
||||
- description: 作品 ID
|
||||
format: int64
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: integer
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功(余额支付返回 AppId=balance)
|
||||
schema:
|
||||
$ref: '#/definitions/wechat.JSAPIPayParams'
|
||||
summary: 购买作品
|
||||
tags:
|
||||
- Posts
|
||||
/posts/{id}/play:
|
||||
get:
|
||||
parameters:
|
||||
- description: 作品 ID
|
||||
format: int64
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: integer
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
$ref: '#/definitions/http.PlayUrl'
|
||||
summary: 获取播放地址
|
||||
tags:
|
||||
- Posts
|
||||
/posts/{id}/show:
|
||||
get:
|
||||
parameters:
|
||||
- description: 作品 ID
|
||||
format: int64
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: integer
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
$ref: '#/definitions/http.PostItem'
|
||||
summary: 作品详情
|
||||
tags:
|
||||
- Posts
|
||||
/posts/mine:
|
||||
get:
|
||||
parameters:
|
||||
- in: query
|
||||
name: limit
|
||||
type: integer
|
||||
- in: query
|
||||
name: page
|
||||
type: integer
|
||||
- in: query
|
||||
name: keyword
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
@@ -936,41 +844,9 @@ paths:
|
||||
items:
|
||||
$ref: '#/definitions/http.PostItem'
|
||||
type: object
|
||||
summary: 我的已购作品
|
||||
summary: 手机验证
|
||||
tags:
|
||||
- Posts
|
||||
/users/profile:
|
||||
get:
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
$ref: '#/definitions/http.UserInfo'
|
||||
summary: 获取个人信息
|
||||
tags:
|
||||
- Users
|
||||
/users/username:
|
||||
put:
|
||||
consumes:
|
||||
- application/json
|
||||
parameters:
|
||||
- description: 请求体
|
||||
in: body
|
||||
name: form
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/http.ProfileForm'
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema: {}
|
||||
summary: 修改用户名
|
||||
tags:
|
||||
- Users
|
||||
- Auth
|
||||
/v1/medias/{id}:
|
||||
post:
|
||||
consumes:
|
||||
@@ -1019,6 +895,149 @@ paths:
|
||||
summary: 演示接口
|
||||
tags:
|
||||
- Demo
|
||||
/v1/posts:
|
||||
get:
|
||||
parameters:
|
||||
- in: query
|
||||
name: limit
|
||||
type: integer
|
||||
- in: query
|
||||
name: page
|
||||
type: integer
|
||||
- in: query
|
||||
name: keyword
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
allOf:
|
||||
- $ref: '#/definitions/requests.Pager'
|
||||
- properties:
|
||||
items:
|
||||
$ref: '#/definitions/http.PostItem'
|
||||
type: object
|
||||
summary: 作品列表
|
||||
tags:
|
||||
- Posts
|
||||
/v1/posts/{id}/buy:
|
||||
post:
|
||||
parameters:
|
||||
- description: 作品 ID
|
||||
format: int64
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: integer
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功(余额支付返回 AppId=balance)
|
||||
schema:
|
||||
$ref: '#/definitions/wechat.JSAPIPayParams'
|
||||
summary: 购买作品
|
||||
tags:
|
||||
- Posts
|
||||
/v1/posts/{id}/play:
|
||||
get:
|
||||
parameters:
|
||||
- description: 作品 ID
|
||||
format: int64
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: integer
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
$ref: '#/definitions/http.PlayUrl'
|
||||
summary: 获取播放地址
|
||||
tags:
|
||||
- Posts
|
||||
/v1/posts/{id}/show:
|
||||
get:
|
||||
parameters:
|
||||
- description: 作品 ID
|
||||
format: int64
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: integer
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
$ref: '#/definitions/http.PostItem'
|
||||
summary: 作品详情
|
||||
tags:
|
||||
- Posts
|
||||
/v1/posts/mine:
|
||||
get:
|
||||
parameters:
|
||||
- in: query
|
||||
name: limit
|
||||
type: integer
|
||||
- in: query
|
||||
name: page
|
||||
type: integer
|
||||
- in: query
|
||||
name: keyword
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
allOf:
|
||||
- $ref: '#/definitions/requests.Pager'
|
||||
- properties:
|
||||
items:
|
||||
$ref: '#/definitions/http.PostItem'
|
||||
type: object
|
||||
summary: 我的已购作品
|
||||
tags:
|
||||
- Posts
|
||||
/v1/users/profile:
|
||||
get:
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema:
|
||||
$ref: '#/definitions/http.UserInfo'
|
||||
summary: 获取个人信息
|
||||
tags:
|
||||
- Users
|
||||
/v1/users/username:
|
||||
put:
|
||||
consumes:
|
||||
- application/json
|
||||
parameters:
|
||||
- description: 请求体
|
||||
in: body
|
||||
name: form
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/http.ProfileForm'
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: 成功
|
||||
schema: {}
|
||||
summary: 修改用户名
|
||||
tags:
|
||||
- Users
|
||||
securityDefinitions:
|
||||
BasicAuth:
|
||||
type: basic
|
||||
|
||||
Reference in New Issue
Block a user