u
This commit is contained in:
1 parent
ab3eaed7ce
commit
cf23acdabc
28 files changed
+1292
-486
No files matched your search
@@ -2,7 +2,6 @@
|
||||
<project version="4">
|
||||
<component name="DataSourcePerFileMappings">
|
||||
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d/console_1.sql" value="4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d" />
|
||||
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d/console_2.sql" value="4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d" />
|
||||
<file url="file://$PROJECT_DIR$/db/queries/finance_category_default.sql" value="4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d" />
|
||||
<file url="file://$PROJECT_DIR$/db/queries/finance_category_space.sql" value="4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d" />
|
||||
<file url="file://$PROJECT_DIR$/db/queries/space.sql" value="4db2dbd4-857e-4234-ba5e-f8cbf0ba6e5d" />
|
||||
|
||||
@@ -220,11 +220,36 @@ func UpdateSpaceDefault(c fiber.Ctx) error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = db.Queries.UpdateSpaceIsDefault(c.Context(), repo.UpdateSpaceIsDefaultParams{
|
||||
SpaceID: dto.SpaceId,
|
||||
UserID: userId,
|
||||
IsDefault: dto.IsDefault,
|
||||
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
|
||||
err = q.UpdateSpaceIsDefault(c.Context(), repo.UpdateSpaceIsDefaultParams{
|
||||
SpaceID: dto.SpaceId,
|
||||
UserID: userId,
|
||||
IsDefault: dto.IsDefault,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var otherDefault int16
|
||||
|
||||
if dto.IsDefault == 1 {
|
||||
otherDefault = 0
|
||||
}
|
||||
|
||||
err = q.UpdateOtherSpacesIsDefault(c.Context(), repo.UpdateOtherSpacesIsDefaultParams{
|
||||
IsDefault: otherDefault,
|
||||
UserID: userId,
|
||||
SpaceID: dto.SpaceId,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -270,6 +295,85 @@ func UpdateSpaceName(c fiber.Ctx) error {
|
||||
return responsex.OK(c, "更新成功")
|
||||
}
|
||||
|
||||
func GetSpaceSettings(c fiber.Ctx) error {
|
||||
dto := new(types.GetSpaceSettingDTO)
|
||||
if err := requestx.BindAndValidate(c, dto); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
userId, err := middleware.GetUserID(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
spaceId := dto.SpaceId
|
||||
|
||||
row, err := db.Queries.GetSpaceByUserIdAndSpaceId(c.Context(), repo.GetSpaceByUserIdAndSpaceIdParams{
|
||||
UserID: userId,
|
||||
ID: spaceId,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
if errorx.IsNotFound(err) {
|
||||
return responsex.SpaceError(c, "不在该空间或该空间已解散")
|
||||
}
|
||||
return err
|
||||
}
|
||||
vo := new(types.UserSpace)
|
||||
|
||||
vo.SpaceId = row.SpaceID
|
||||
vo.Name = row.Name
|
||||
vo.IsDefault = row.IsDefault
|
||||
vo.MemberName = row.MemberName
|
||||
vo.Role = row.Role
|
||||
vo.MemberCount = row.MemberCount
|
||||
vo.OwnerId = row.OwnerID
|
||||
vo.SortNumber = row.SortNumber
|
||||
|
||||
return responsex.OK(c, vo)
|
||||
}
|
||||
|
||||
// UpdateSpaceSortNumber 更新空间排序
|
||||
func UpdateSpaceSortNumber(c fiber.Ctx) error {
|
||||
dto := new(types.UpdateSpaceSortNumberDTO)
|
||||
if err := requestx.BindAndValidate(c, dto); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
userId, err := middleware.GetUserID(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 组装批量更新参数
|
||||
params := make([]repo.BatchUpdateSpaceSortNumberParams, 0, len(dto.Spaces))
|
||||
|
||||
for _, datum := range dto.Spaces {
|
||||
params = append(params, repo.BatchUpdateSpaceSortNumberParams{
|
||||
SortNumber: datum.SortNumber,
|
||||
SpaceID: datum.SpaceId,
|
||||
UserID: userId,
|
||||
})
|
||||
}
|
||||
|
||||
// 使用统一事务封装
|
||||
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
|
||||
batch := q.BatchUpdateSpaceSortNumber(c.Context(), params)
|
||||
|
||||
if err := db.RunBatch(c.Context(), batch); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return responsex.OK(c, "更新成功")
|
||||
}
|
||||
|
||||
// 初始化记账分类
|
||||
func initFinanceCategory(ctx context.Context, q *repo.Queries, spaceId int64, userId int64) error {
|
||||
categoryDefaults, err := q.ListFinanceCategoryDefault(ctx)
|
||||
|
||||
@@ -25,9 +25,11 @@ func SetupRouters(app *fiber.App) {
|
||||
spaceRouter.Post("/list", space.ListUserSpaces)
|
||||
spaceRouter.Post("/dissolve", space.DissolveSpace)
|
||||
spaceRouter.Post("/name", space.UpdateSpaceName)
|
||||
spaceRouter.Post("/settings", space.GetSpaceSettings)
|
||||
|
||||
spaceRouter.Post("/member/default", space.UpdateSpaceDefault)
|
||||
spaceRouter.Post("/member/name", space.UpdateMemberName)
|
||||
spaceRouter.Post("/member/sortNumber", space.UpdateSpaceSortNumber)
|
||||
|
||||
// authGroup.Get("/user/profile", user.GetProfile)
|
||||
// spaceGroup.Get("/space/info", space.GetInfo)
|
||||
|
||||
@@ -45,3 +45,16 @@ type UpdateSpaceNameDTO struct {
|
||||
SpaceId int64 `json:"space_id" validate:"required"`
|
||||
SpaceName string `json:"space_name" validate:"required"`
|
||||
}
|
||||
|
||||
type GetSpaceSettingDTO struct {
|
||||
SpaceId int64 `json:"space_id" validate:"required"`
|
||||
}
|
||||
|
||||
type SpaceSortNumber struct {
|
||||
SpaceId int64 `json:"space_id" validate:"required"`
|
||||
SortNumber int32 `json:"sort_number" validate:"required"`
|
||||
}
|
||||
|
||||
type UpdateSpaceSortNumberDTO struct {
|
||||
Spaces []SpaceSortNumber `json:"spaces"`
|
||||
}
|
||||
@@ -42,6 +42,28 @@ FROM space s
|
||||
WHERE sm.user_id = $1
|
||||
ORDER BY sm.is_default DESC, sm.sort_number ASC;
|
||||
|
||||
-- name: GetSpaceByUserIdAndSpaceId :one
|
||||
SELECT
|
||||
s.id AS space_id,
|
||||
s.owner_id,
|
||||
s.name,
|
||||
sm.role,
|
||||
COALESCE(mc.member_count, 0) AS member_count,
|
||||
sm.is_default,
|
||||
sm.member_name,
|
||||
sm.sort_number
|
||||
FROM space s
|
||||
JOIN space_member sm
|
||||
ON s.id = sm.space_id
|
||||
LEFT JOIN (
|
||||
SELECT space_id, COUNT(*) AS member_count
|
||||
FROM space_member
|
||||
GROUP BY space_id
|
||||
) mc
|
||||
ON s.id = mc.space_id
|
||||
WHERE sm.user_id = $1 AND s.id = $2
|
||||
ORDER BY sm.is_default DESC, sm.sort_number ASC;
|
||||
|
||||
-- name: UpdateSpaceName :exec
|
||||
UPDATE space SET name = $1
|
||||
WHERE id = $2;
|
||||
@@ -25,3 +25,17 @@ WHERE space_id = $2 AND user_id = $3;
|
||||
-- name: UpdateSpaceIsDefault :exec
|
||||
UPDATE space_member SET is_default = $1
|
||||
WHERE space_id = $2 AND user_id = $3;
|
||||
|
||||
-- 将用户的其它空间更新为非默认
|
||||
-- name: UpdateOtherSpacesIsDefault :exec
|
||||
UPDATE space_member
|
||||
SET is_default = $1
|
||||
WHERE user_id = $2
|
||||
AND space_id != $3;
|
||||
|
||||
-- 更新空间顺序
|
||||
-- name: BatchUpdateSpaceSortNumber :batchexec
|
||||
UPDATE space_member
|
||||
SET sort_number = $1
|
||||
WHERE user_id = $2
|
||||
AND space_id = $3;
|
||||
@@ -0,0 +1,72 @@
|
||||
// Code generated by sqlc. DO NOT EDIT.
|
||||
// versions:
|
||||
// sqlc v1.30.0
|
||||
// source: batch.go
|
||||
|
||||
package repo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrBatchAlreadyClosed = errors.New("batch already closed")
|
||||
)
|
||||
|
||||
const batchUpdateSpaceSortNumber = `-- name: BatchUpdateSpaceSortNumber :batchexec
|
||||
UPDATE space_member
|
||||
SET sort_number = $1
|
||||
WHERE user_id = $2
|
||||
AND space_id = $3
|
||||
`
|
||||
|
||||
type BatchUpdateSpaceSortNumberBatchResults struct {
|
||||
br pgx.BatchResults
|
||||
tot int
|
||||
closed bool
|
||||
}
|
||||
|
||||
type BatchUpdateSpaceSortNumberParams struct {
|
||||
SortNumber int32
|
||||
UserID int64
|
||||
SpaceID int64
|
||||
}
|
||||
|
||||
// 更新空间顺序
|
||||
func (q *Queries) BatchUpdateSpaceSortNumber(ctx context.Context, arg []BatchUpdateSpaceSortNumberParams) *BatchUpdateSpaceSortNumberBatchResults {
|
||||
batch := &pgx.Batch{}
|
||||
for _, a := range arg {
|
||||
vals := []interface{}{
|
||||
a.SortNumber,
|
||||
a.UserID,
|
||||
a.SpaceID,
|
||||
}
|
||||
batch.Queue(batchUpdateSpaceSortNumber, vals...)
|
||||
}
|
||||
br := q.db.SendBatch(ctx, batch)
|
||||
return &BatchUpdateSpaceSortNumberBatchResults{br, len(arg), false}
|
||||
}
|
||||
|
||||
func (b *BatchUpdateSpaceSortNumberBatchResults) Exec(f func(int, error)) {
|
||||
defer b.br.Close()
|
||||
for t := 0; t < b.tot; t++ {
|
||||
if b.closed {
|
||||
if f != nil {
|
||||
f(t, ErrBatchAlreadyClosed)
|
||||
}
|
||||
continue
|
||||
}
|
||||
_, err := b.br.Exec()
|
||||
if f != nil {
|
||||
f(t, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *BatchUpdateSpaceSortNumberBatchResults) Close() error {
|
||||
b.closed = true
|
||||
return b.br.Close()
|
||||
}
|
||||
@@ -16,6 +16,7 @@ type DBTX interface {
|
||||
Query(context.Context, string, ...interface{}) (pgx.Rows, error)
|
||||
QueryRow(context.Context, string, ...interface{}) pgx.Row
|
||||
CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error)
|
||||
SendBatch(context.Context, *pgx.Batch) pgx.BatchResults
|
||||
}
|
||||
|
||||
func New(db DBTX) *Queries {
|
||||
|
||||
@@ -66,6 +66,61 @@ func (q *Queries) GetSpaceByInviteCode(ctx context.Context, inviteCode string) (
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getSpaceByUserIdAndSpaceId = `-- name: GetSpaceByUserIdAndSpaceId :one
|
||||
SELECT
|
||||
s.id AS space_id,
|
||||
s.owner_id,
|
||||
s.name,
|
||||
sm.role,
|
||||
COALESCE(mc.member_count, 0) AS member_count,
|
||||
sm.is_default,
|
||||
sm.member_name,
|
||||
sm.sort_number
|
||||
FROM space s
|
||||
JOIN space_member sm
|
||||
ON s.id = sm.space_id
|
||||
LEFT JOIN (
|
||||
SELECT space_id, COUNT(*) AS member_count
|
||||
FROM space_member
|
||||
GROUP BY space_id
|
||||
) mc
|
||||
ON s.id = mc.space_id
|
||||
WHERE sm.user_id = $1 AND s.id = $2
|
||||
ORDER BY sm.is_default DESC, sm.sort_number ASC
|
||||
`
|
||||
|
||||
type GetSpaceByUserIdAndSpaceIdParams struct {
|
||||
UserID int64
|
||||
ID int64
|
||||
}
|
||||
|
||||
type GetSpaceByUserIdAndSpaceIdRow struct {
|
||||
SpaceID int64
|
||||
OwnerID int64
|
||||
Name string
|
||||
Role int16
|
||||
MemberCount int64
|
||||
IsDefault int16
|
||||
MemberName string
|
||||
SortNumber int32
|
||||
}
|
||||
|
||||
func (q *Queries) GetSpaceByUserIdAndSpaceId(ctx context.Context, arg GetSpaceByUserIdAndSpaceIdParams) (GetSpaceByUserIdAndSpaceIdRow, error) {
|
||||
row := q.db.QueryRow(ctx, getSpaceByUserIdAndSpaceId, arg.UserID, arg.ID)
|
||||
var i GetSpaceByUserIdAndSpaceIdRow
|
||||
err := row.Scan(
|
||||
&i.SpaceID,
|
||||
&i.OwnerID,
|
||||
&i.Name,
|
||||
&i.Role,
|
||||
&i.MemberCount,
|
||||
&i.IsDefault,
|
||||
&i.MemberName,
|
||||
&i.SortNumber,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const insertSpace = `-- name: InsertSpace :exec
|
||||
INSERT INTO space (
|
||||
id,name,invite_code,owner_id,create_time,update_time
|
||||
|
||||
@@ -15,6 +15,7 @@ FROM space_member
|
||||
WHERE user_id = $1
|
||||
`
|
||||
|
||||
// 合计某个用户的空间数量
|
||||
func (q *Queries) CountUserSpaces(ctx context.Context, userID int64) (int64, error) {
|
||||
row := q.db.QueryRow(ctx, countUserSpaces, userID)
|
||||
var count int64
|
||||
@@ -57,6 +58,7 @@ type InsertSpaceMemberParams struct {
|
||||
SortNumber int32
|
||||
}
|
||||
|
||||
// 插入空间用户
|
||||
func (q *Queries) InsertSpaceMember(ctx context.Context, arg InsertSpaceMemberParams) error {
|
||||
_, err := q.db.Exec(ctx, insertSpaceMember,
|
||||
arg.ID,
|
||||
@@ -70,6 +72,25 @@ func (q *Queries) InsertSpaceMember(ctx context.Context, arg InsertSpaceMemberPa
|
||||
return err
|
||||
}
|
||||
|
||||
const updateOtherSpacesIsDefault = `-- name: UpdateOtherSpacesIsDefault :exec
|
||||
UPDATE space_member
|
||||
SET is_default = $1
|
||||
WHERE user_id = $2
|
||||
AND space_id != $3
|
||||
`
|
||||
|
||||
type UpdateOtherSpacesIsDefaultParams struct {
|
||||
IsDefault int16
|
||||
UserID int64
|
||||
SpaceID int64
|
||||
}
|
||||
|
||||
// 将用户的其它空间更新为非默认
|
||||
func (q *Queries) UpdateOtherSpacesIsDefault(ctx context.Context, arg UpdateOtherSpacesIsDefaultParams) error {
|
||||
_, err := q.db.Exec(ctx, updateOtherSpacesIsDefault, arg.IsDefault, arg.UserID, arg.SpaceID)
|
||||
return err
|
||||
}
|
||||
|
||||
const updateSpaceIsDefault = `-- name: UpdateSpaceIsDefault :exec
|
||||
UPDATE space_member SET is_default = $1
|
||||
WHERE space_id = $2 AND user_id = $3
|
||||
@@ -81,6 +102,7 @@ type UpdateSpaceIsDefaultParams struct {
|
||||
UserID int64
|
||||
}
|
||||
|
||||
// 更新空间是否为默认
|
||||
func (q *Queries) UpdateSpaceIsDefault(ctx context.Context, arg UpdateSpaceIsDefaultParams) error {
|
||||
_, err := q.db.Exec(ctx, updateSpaceIsDefault, arg.IsDefault, arg.SpaceID, arg.UserID)
|
||||
return err
|
||||
@@ -97,6 +119,7 @@ type UpdateSpaceMemberNameParams struct {
|
||||
UserID int64
|
||||
}
|
||||
|
||||
// 更新用户在空间内的名称
|
||||
func (q *Queries) UpdateSpaceMemberName(ctx context.Context, arg UpdateSpaceMemberNameParams) error {
|
||||
_, err := q.db.Exec(ctx, updateSpaceMemberName, arg.MemberName, arg.SpaceID, arg.UserID)
|
||||
return err
|
||||
|
||||
Reference in new issue
Block a user