This commit is contained in:
oneao committed 2026-03-02 17:29:51 +08:00
1 parent ab3eaed7ce
commit cf23acdabc
28 files changed
+1292 -486

No files matched your search

-1
View File
@@ -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)
+13
View File
@@ -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;
+72
View File
@@ -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()
}
+1
View File
@@ -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