u
This commit is contained in:
1 parent
1b1a54f7dd
commit
fc005e0fb4
22 files changed
+300
-193
No files matched your search
@@ -1,10 +0,0 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v3"
|
||||
)
|
||||
|
||||
// Hello handle api status
|
||||
func Hello(c fiber.Ctx) error {
|
||||
panic("测试 panic")
|
||||
}
|
||||
@@ -53,11 +53,24 @@ func CreateSpace(c fiber.Ctx) error {
|
||||
spaceId := uniqueid.NextId()
|
||||
|
||||
err := db.WithTx(c.Context(), func(q *repo.Queries) error {
|
||||
// 查询是否存在空间
|
||||
countSpaces, err3 := q.CountUserSpaces(c.Context(), userID)
|
||||
if err3 != nil {
|
||||
return err3
|
||||
}
|
||||
|
||||
isDefault := 0
|
||||
|
||||
if countSpaces == 0 {
|
||||
isDefault = 1
|
||||
}
|
||||
|
||||
// 创建空间
|
||||
params := repo.InsertSpaceParams{
|
||||
ID: spaceId,
|
||||
Name: dto.Name,
|
||||
InviteCode: inviteCode,
|
||||
OwnerID: userID,
|
||||
}
|
||||
|
||||
err := q.InsertSpace(c.Context(), params)
|
||||
@@ -68,10 +81,13 @@ func CreateSpace(c fiber.Ctx) error {
|
||||
|
||||
// 将创建用户默认添加到该空间内
|
||||
spaceMemberParams := repo.InsertSpaceMemberParams{
|
||||
ID: uniqueid.NextId(),
|
||||
SpaceID: spaceId,
|
||||
UserID: userID,
|
||||
Role: 0,
|
||||
ID: uniqueid.NextId(),
|
||||
SpaceID: spaceId,
|
||||
UserID: userID,
|
||||
Role: 0,
|
||||
IsDefault: int16(isDefault),
|
||||
UserName: dto.UserName,
|
||||
SortNumber: dto.SortNumber,
|
||||
}
|
||||
|
||||
err = q.InsertSpaceMember(c.Context(), spaceMemberParams)
|
||||
@@ -98,6 +114,41 @@ func CreateSpace(c fiber.Ctx) error {
|
||||
return responsex.OK(c, vo)
|
||||
}
|
||||
|
||||
func ListUserSpaces(c fiber.Ctx) error {
|
||||
vo := new(types.ListSpacesVO)
|
||||
|
||||
userID, err := middleware.GetUserID(c)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rows, err := db.Queries.ListSpacesByUserId(c.Context(), userID)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
userSpaces := make([]types.UserSpace, 0, len(rows))
|
||||
|
||||
for _, row := range rows {
|
||||
userSpaces = append(userSpaces, types.UserSpace{
|
||||
Id: row.ID,
|
||||
OwnerId: row.OwnerID,
|
||||
Name: row.Name,
|
||||
Role: row.Role,
|
||||
MemberCount: row.MemberCount,
|
||||
IsDefault: row.IsDefault,
|
||||
UserName: row.UserName,
|
||||
SortNumber: row.SortNumber,
|
||||
})
|
||||
}
|
||||
|
||||
vo.Spaces = userSpaces
|
||||
|
||||
return responsex.OK(c, vo)
|
||||
}
|
||||
|
||||
func initFinanceCategory(ctx context.Context, q *repo.Queries, spaceId int64, userId int64) error {
|
||||
categoryDefaults, err := q.ListFinanceCategoryDefault(ctx)
|
||||
if err != nil {
|
||||
|
||||
@@ -12,23 +12,18 @@ import (
|
||||
func SetupRouters(app *fiber.App) {
|
||||
api := app.Group(config.GetConf().Server.BaseUrl)
|
||||
|
||||
// 1️⃣ 公开接口(无需登录)
|
||||
publicGroup := api.Group("")
|
||||
|
||||
// 2️⃣ 需要登录
|
||||
authGroup := api.Group("", middleware.Auth())
|
||||
//
|
||||
//// 3️⃣ 需要登录 + 需要空间
|
||||
//spaceGroup := api.Group("", middleware.Auth(), middleware.SpaceGuard())
|
||||
|
||||
// --------------------
|
||||
// auth
|
||||
authRouter := publicGroup.Group("/auth")
|
||||
authRouter := api.Group("/auth")
|
||||
authRouter.Post("/login/qq", auth.LoginQq)
|
||||
authRouter.Post("/login/wechat", auth.LoginWechat)
|
||||
|
||||
// 空间操作
|
||||
authGroup.Post("/space/create", space.CreateSpace)
|
||||
spaceRouter := api.Group("/space").Use(middleware.Auth())
|
||||
|
||||
spaceRouter.Post("/create", space.CreateSpace)
|
||||
spaceRouter.Post("/list", space.ListUserSpaces)
|
||||
|
||||
// authGroup.Get("/user/profile", user.GetProfile)
|
||||
// spaceGroup.Get("/space/info", space.GetInfo)
|
||||
}
|
||||
@@ -1,10 +1,28 @@
|
||||
package types
|
||||
|
||||
type CreateSpaceDTO struct {
|
||||
Name string `json:"name" validate:"required"`
|
||||
Name string `json:"name" validate:"required"`
|
||||
UserName string `json:"user_name" validate:"required"`
|
||||
SortNumber int32 `json:"sort_number" validate:"required"`
|
||||
}
|
||||
|
||||
type CreateSpaceVO struct {
|
||||
SpaceId int64 `json:"space_id"`
|
||||
InviteCode string `json:"invite_code"`
|
||||
SortNumber int32 `json:"sort_number"`
|
||||
}
|
||||
|
||||
type UserSpace struct {
|
||||
Id int64 `json:"id"`
|
||||
OwnerId int64 `json:"owner_id"`
|
||||
Name string `json:"name"`
|
||||
Role int16 `json:"role"`
|
||||
MemberCount int64 `json:"member_count"`
|
||||
IsDefault int16 `json:"is_default"`
|
||||
UserName string `json:"user_name"`
|
||||
SortNumber int32 `json:"sort_number"`
|
||||
}
|
||||
|
||||
type ListSpacesVO struct {
|
||||
Spaces []UserSpace `json:"spaces"`
|
||||
}
|
||||
@@ -6,8 +6,8 @@ SELECT * FROM space WHERE id = $1;
|
||||
-- 创建空间
|
||||
-- name: InsertSpace :exec
|
||||
INSERT INTO space (
|
||||
id,name,invite_code,create_time,update_time
|
||||
) VALUES ($1,$2,$3,NOW(),NOW());
|
||||
id,name,invite_code,owner_id,create_time,update_time
|
||||
) VALUES ($1,$2,$3,$4,NOW(),NOW());
|
||||
|
||||
-- 删除空间
|
||||
-- name: DeleteSpace :exec
|
||||
@@ -16,3 +16,25 @@ DELETE FROM space WHERE id = $1;
|
||||
-- 根据邀请码获取
|
||||
-- name: GetSpaceByInviteCode :one
|
||||
SELECT * FROM space WHERE invite_code = $1;
|
||||
|
||||
-- name: ListSpacesByUserId :many
|
||||
SELECT
|
||||
s.id,
|
||||
s.owner_id,
|
||||
s.name,
|
||||
sm.role,
|
||||
COALESCE(mc.member_count, 0) AS member_count,
|
||||
sm.is_default,
|
||||
sm.user_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
|
||||
ORDER BY sm.is_default DESC, sm.sort_number ASC;
|
||||
@@ -6,8 +6,8 @@ WHERE user_id = $1
|
||||
AND space_id = $2;
|
||||
|
||||
-- name: InsertSpaceMember :exec
|
||||
INSERT INTO space_member(id,space_id,user_id,role,is_default,join_time,update_time)
|
||||
VALUES ($1,$2,$3,$4,$5,NOW(),NOW());
|
||||
INSERT INTO space_member(id,space_id,user_id,role,is_default,user_name,sort_number,join_time,update_time)
|
||||
VALUES ($1,$2,$3,$4,$5,$6,$7,NOW(),NOW());
|
||||
|
||||
-- name: CountUserSpaces :one
|
||||
SELECT COUNT(1)
|
||||
|
||||
@@ -35,6 +35,7 @@ type Space struct {
|
||||
ID int64
|
||||
Name string
|
||||
InviteCode string
|
||||
OwnerID int64
|
||||
CreateTime pgtype.Timestamptz
|
||||
UpdateTime pgtype.Timestamptz
|
||||
}
|
||||
@@ -45,6 +46,8 @@ type SpaceMember struct {
|
||||
UserID int64
|
||||
Role int16
|
||||
IsDefault int16
|
||||
UserName string
|
||||
SortNumber int32
|
||||
JoinTime pgtype.Timestamptz
|
||||
UpdateTime pgtype.Timestamptz
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ func (q *Queries) DeleteSpace(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
const getSpaceById = `-- name: GetSpaceById :one
|
||||
SELECT id, name, invite_code, create_time, update_time FROM space WHERE id = $1
|
||||
SELECT id, name, invite_code, owner_id, create_time, update_time FROM space WHERE id = $1
|
||||
`
|
||||
|
||||
// 根据id获取分享空间信息
|
||||
@@ -31,6 +31,7 @@ func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) {
|
||||
&i.ID,
|
||||
&i.Name,
|
||||
&i.InviteCode,
|
||||
&i.OwnerID,
|
||||
&i.CreateTime,
|
||||
&i.UpdateTime,
|
||||
)
|
||||
@@ -38,7 +39,7 @@ func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) {
|
||||
}
|
||||
|
||||
const getSpaceByInviteCode = `-- name: GetSpaceByInviteCode :one
|
||||
SELECT id, name, invite_code, create_time, update_time FROM space WHERE invite_code = $1
|
||||
SELECT id, name, invite_code, owner_id, create_time, update_time FROM space WHERE invite_code = $1
|
||||
`
|
||||
|
||||
// 根据邀请码获取
|
||||
@@ -49,6 +50,7 @@ func (q *Queries) GetSpaceByInviteCode(ctx context.Context, inviteCode string) (
|
||||
&i.ID,
|
||||
&i.Name,
|
||||
&i.InviteCode,
|
||||
&i.OwnerID,
|
||||
&i.CreateTime,
|
||||
&i.UpdateTime,
|
||||
)
|
||||
@@ -57,18 +59,87 @@ func (q *Queries) GetSpaceByInviteCode(ctx context.Context, inviteCode string) (
|
||||
|
||||
const insertSpace = `-- name: InsertSpace :exec
|
||||
INSERT INTO space (
|
||||
id,name,invite_code,create_time,update_time
|
||||
) VALUES ($1,$2,$3,NOW(),NOW())
|
||||
id,name,invite_code,owner_id,create_time,update_time
|
||||
) VALUES ($1,$2,$3,$4,NOW(),NOW())
|
||||
`
|
||||
|
||||
type InsertSpaceParams struct {
|
||||
ID int64
|
||||
Name string
|
||||
InviteCode string
|
||||
OwnerID int64
|
||||
}
|
||||
|
||||
// 创建空间
|
||||
func (q *Queries) InsertSpace(ctx context.Context, arg InsertSpaceParams) error {
|
||||
_, err := q.db.Exec(ctx, insertSpace, arg.ID, arg.Name, arg.InviteCode)
|
||||
_, err := q.db.Exec(ctx, insertSpace,
|
||||
arg.ID,
|
||||
arg.Name,
|
||||
arg.InviteCode,
|
||||
arg.OwnerID,
|
||||
)
|
||||
return err
|
||||
}
|
||||
|
||||
const listSpacesByUserId = `-- name: ListSpacesByUserId :many
|
||||
SELECT
|
||||
s.id,
|
||||
s.owner_id,
|
||||
s.name,
|
||||
sm.role,
|
||||
COALESCE(mc.member_count, 0) AS member_count,
|
||||
sm.is_default,
|
||||
sm.user_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
|
||||
ORDER BY sm.is_default DESC, sm.sort_number ASC
|
||||
`
|
||||
|
||||
type ListSpacesByUserIdRow struct {
|
||||
ID int64
|
||||
OwnerID int64
|
||||
Name string
|
||||
Role int16
|
||||
MemberCount int64
|
||||
IsDefault int16
|
||||
UserName string
|
||||
SortNumber int32
|
||||
}
|
||||
|
||||
func (q *Queries) ListSpacesByUserId(ctx context.Context, userID int64) ([]ListSpacesByUserIdRow, error) {
|
||||
rows, err := q.db.Query(ctx, listSpacesByUserId, userID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []ListSpacesByUserIdRow
|
||||
for rows.Next() {
|
||||
var i ListSpacesByUserIdRow
|
||||
if err := rows.Scan(
|
||||
&i.ID,
|
||||
&i.OwnerID,
|
||||
&i.Name,
|
||||
&i.Role,
|
||||
&i.MemberCount,
|
||||
&i.IsDefault,
|
||||
&i.UserName,
|
||||
&i.SortNumber,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
@@ -43,16 +43,18 @@ func (q *Queries) GetUserSpaceRole(ctx context.Context, arg GetUserSpaceRolePara
|
||||
}
|
||||
|
||||
const insertSpaceMember = `-- name: InsertSpaceMember :exec
|
||||
INSERT INTO space_member(id,space_id,user_id,role,is_default,join_time,update_time)
|
||||
VALUES ($1,$2,$3,$4,$5,NOW(),NOW())
|
||||
INSERT INTO space_member(id,space_id,user_id,role,is_default,user_name,sort_number,join_time,update_time)
|
||||
VALUES ($1,$2,$3,$4,$5,$6,$7,NOW(),NOW())
|
||||
`
|
||||
|
||||
type InsertSpaceMemberParams struct {
|
||||
ID int64
|
||||
SpaceID int64
|
||||
UserID int64
|
||||
Role int16
|
||||
IsDefault int16
|
||||
ID int64
|
||||
SpaceID int64
|
||||
UserID int64
|
||||
Role int16
|
||||
IsDefault int16
|
||||
UserName string
|
||||
SortNumber int32
|
||||
}
|
||||
|
||||
func (q *Queries) InsertSpaceMember(ctx context.Context, arg InsertSpaceMemberParams) error {
|
||||
@@ -62,6 +64,8 @@ func (q *Queries) InsertSpaceMember(ctx context.Context, arg InsertSpaceMemberPa
|
||||
arg.UserID,
|
||||
arg.Role,
|
||||
arg.IsDefault,
|
||||
arg.UserName,
|
||||
arg.SortNumber,
|
||||
)
|
||||
return err
|
||||
}
|
||||
@@ -27,6 +27,7 @@ create table space
|
||||
primary key,
|
||||
name varchar(255) not null,
|
||||
invite_code varchar(30) not null,
|
||||
owner_id bigint not null,
|
||||
create_time timestamp with time zone default now(),
|
||||
update_time timestamp with time zone default now()
|
||||
);
|
||||
@@ -39,6 +40,8 @@ create table space_member
|
||||
user_id bigint not null,
|
||||
role smallint default 2 not null,
|
||||
is_default smallint default 0 not null,
|
||||
user_name varchar(255) not null,
|
||||
sort_number integer default 0 not null,
|
||||
join_time timestamp with time zone default now(),
|
||||
update_time timestamp with time zone default now()
|
||||
);
|
||||
|
||||
@@ -46,12 +46,14 @@ func CreateToken(ctx context.Context, userID int64) (string, error) {
|
||||
|
||||
// VerifyToken 校验 token 并返回 claims
|
||||
func VerifyToken(ctx context.Context, tokenString string) (*CustomClaims, bool) {
|
||||
if tokenString == "" || manager == nil {
|
||||
if tokenString == "" {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
m := getManager()
|
||||
|
||||
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(manager.secret), nil
|
||||
return []byte(m.secret), nil
|
||||
})
|
||||
|
||||
if err != nil || !token.Valid {
|
||||
|
||||
Reference in new issue
Block a user