diff --git a/backend/app/http/auth.go b/backend/app/http/auth.go index d6349aa..48f7ed0 100644 --- a/backend/app/http/auth.go +++ b/backend/app/http/auth.go @@ -12,7 +12,6 @@ import ( "quyun/providers/jwt" "quyun/providers/wechat" - "github.com/go-jet/jet/v2/qrm" "github.com/gofiber/fiber/v3" gonanoid "github.com/matoous/go-nanoid/v2" "github.com/pkg/errors" @@ -51,24 +50,31 @@ func (ctl *auth) Login(ctx fiber.Ctx, code, state, redirect string) error { log.Debugf("Auth User Info: %+v", authUserInfo) - user, err := models.Users.GetUserByOpenID(ctx.Context(), token.Openid) + userModel := &model.Users{ + Status: fields.UserStatusOk, + OpenID: token.GetOpenID(), + Username: fmt.Sprintf("u_%s", gonanoid.MustGenerate(salt, 8)), + Avatar: nil, + Metas: fields.ToJson(fields.UserMetas{ + City: authUserInfo.City, + Country: authUserInfo.Country, + HeadImageUrl: authUserInfo.Headimgurl, + Nickname: authUserInfo.Nickname, + Privilege: authUserInfo.Privilege, + Province: authUserInfo.Province, + Sex: authUserInfo.Sex, + }), + AuthToken: fields.ToJson(fields.UserAuthToken{ + AccessToken: token.AccessToken, + ExpiresAt: time.Now().Add(time.Second * time.Duration(token.ExpiresIn)), + IsSnapshotuser: token.IsSnapshotuser, + RefreshToken: token.RefreshToken, + Scope: token.Scope, + }), + } + user, err := models.Users.GetUserByOpenIDOrCreate(ctx.Context(), token.Openid, userModel) if err != nil { - if errors.Is(err, qrm.ErrNoRows) { - // Create User - model := &model.Users{ - Status: fields.UserStatusOk, - OpenID: token.GetOpenID(), - Username: fmt.Sprintf("u_%s", gonanoid.MustGenerate(salt, 8)), - Avatar: nil, - } - - user, err = models.Users.Create(ctx.Context(), model) - if err != nil { - return errors.Wrap(err, "failed to create user") - } - } else { - return errors.Wrap(err, "failed to get user") - } + return errors.Wrap(err, "failed to get user by openid") } jwtToken, err := ctl.jwt.CreateToken(ctl.jwt.CreateClaims(jwt.BaseClaims{UserID: user.ID})) diff --git a/backend/app/models/users.go b/backend/app/models/users.go index e51347e..04bf924 100644 --- a/backend/app/models/users.go +++ b/backend/app/models/users.go @@ -2,7 +2,6 @@ package models import ( "context" - "errors" "time" "quyun/app/requests" @@ -11,6 +10,7 @@ import ( . "github.com/go-jet/jet/v2/postgres" "github.com/go-jet/jet/v2/qrm" + "github.com/pkg/errors" "github.com/samber/lo" "github.com/sirupsen/logrus" ) @@ -272,6 +272,24 @@ func (m *usersModel) GetUserByOpenID(ctx context.Context, openID string) (*model return &user, nil } +// GetUserByOpenIDOrCreate +func (m *usersModel) GetUserByOpenIDOrCreate(ctx context.Context, openID string, userModel *model.Users) (*model.Users, error) { + user, err := m.GetUserByOpenID(ctx, openID) + if err != nil { + if errors.Is(err, qrm.ErrNoRows) { + // Create User + + user, err = m.Create(ctx, userModel) + if err != nil { + return nil, errors.Wrap(err, "failed to create user") + } + } else { + return nil, errors.Wrap(err, "failed to get user") + } + } + return user, nil +} + // GetUsersMapByIDs func (m *usersModel) GetUsersMapByIDs(ctx context.Context, ids []int64) (map[int64]model.Users, error) { if len(ids) == 0 { diff --git a/backend/config.toml b/backend/config.toml index fa78af0..1a78244 100644 --- a/backend/config.toml +++ b/backend/config.toml @@ -2,8 +2,8 @@ Mode = "development" BaseURI = "baseURI" StoragePath = "/Users/rogee/Projects/self/quyun/fixtures" -DistAdmin = "/app/dist/admin" -DistWeChat = "/app/dist/wechat" +DistAdmin = "frontend/wechat/admin" +DistWeChat = "frontend/wechat/dist" [Http] Port = 8088 diff --git a/backend/database/fields/users.go b/backend/database/fields/users.go index 331f71c..1c3bf2f 100644 --- a/backend/database/fields/users.go +++ b/backend/database/fields/users.go @@ -1,5 +1,25 @@ package fields +import "time" + // swagger:enum PostStatus // ENUM( ok, banned, blocked) type UserStatus int16 + +type UserMetas struct { + City string `json:"city,omitempty"` + Country string `json:"country,omitempty"` + HeadImageUrl string `json:"head_image_url,omitempty"` + Nickname string `json:"nickname,omitempty"` + Privilege []string `json:"privilege,omitempty"` + Province string `json:"province,omitempty"` + Sex int64 `json:"sex,omitempty"` +} + +type UserAuthToken struct { + AccessToken string `json:"access_token,omitempty"` + ExpiresAt time.Time `json:"expires_at,omitempty"` + IsSnapshotuser int64 `json:"is_snapshotuser,omitempty"` + RefreshToken string `json:"refresh_token,omitempty"` + Scope string `json:"scope,omitempty"` +} diff --git a/backend/database/migrations/20250430014015_alter_user.sql b/backend/database/migrations/20250430014015_alter_user.sql new file mode 100644 index 0000000..c7dbbee --- /dev/null +++ b/backend/database/migrations/20250430014015_alter_user.sql @@ -0,0 +1,18 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE public.users + ADD metas jsonb DEFAULT '{}'::jsonb NOT NULL; + +ALTER TABLE public.users + ADD auth_token jsonb DEFAULT '{}'::jsonb NOT NULL; + +-- +goose StatementEnd +-- +goose Down +-- +goose StatementBegin +ALTER TABLE public.users + DROP COLUMN metas; + +ALTER TABLE public.users + DROP COLUMN auth_token; + +-- +goose StatementEnd diff --git a/backend/database/schemas/public/model/users.go b/backend/database/schemas/public/model/users.go index c1f732f..dacce39 100644 --- a/backend/database/schemas/public/model/users.go +++ b/backend/database/schemas/public/model/users.go @@ -13,12 +13,14 @@ import ( ) type Users struct { - ID int64 `sql:"primary_key" json:"id"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - DeletedAt *time.Time `json:"deleted_at"` - Status fields.UserStatus `json:"status"` - OpenID string `json:"open_id"` - Username string `json:"username"` - Avatar *string `json:"avatar"` + ID int64 `sql:"primary_key" json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt *time.Time `json:"deleted_at"` + Status fields.UserStatus `json:"status"` + OpenID string `json:"open_id"` + Username string `json:"username"` + Avatar *string `json:"avatar"` + Metas fields.Json[fields.UserMetas] `json:"metas"` + AuthToken fields.Json[fields.UserAuthToken] `json:"auth_token"` } diff --git a/backend/database/schemas/public/table/users.go b/backend/database/schemas/public/table/users.go index 974843c..bdfb361 100644 --- a/backend/database/schemas/public/table/users.go +++ b/backend/database/schemas/public/table/users.go @@ -25,6 +25,8 @@ type usersTable struct { OpenID postgres.ColumnString Username postgres.ColumnString Avatar postgres.ColumnString + Metas postgres.ColumnString + AuthToken postgres.ColumnString AllColumns postgres.ColumnList MutableColumns postgres.ColumnList @@ -73,8 +75,10 @@ func newUsersTableImpl(schemaName, tableName, alias string) usersTable { OpenIDColumn = postgres.StringColumn("open_id") UsernameColumn = postgres.StringColumn("username") AvatarColumn = postgres.StringColumn("avatar") - allColumns = postgres.ColumnList{IDColumn, CreatedAtColumn, UpdatedAtColumn, DeletedAtColumn, StatusColumn, OpenIDColumn, UsernameColumn, AvatarColumn} - mutableColumns = postgres.ColumnList{CreatedAtColumn, UpdatedAtColumn, DeletedAtColumn, StatusColumn, OpenIDColumn, UsernameColumn, AvatarColumn} + MetasColumn = postgres.StringColumn("metas") + AuthTokenColumn = postgres.StringColumn("auth_token") + allColumns = postgres.ColumnList{IDColumn, CreatedAtColumn, UpdatedAtColumn, DeletedAtColumn, StatusColumn, OpenIDColumn, UsernameColumn, AvatarColumn, MetasColumn, AuthTokenColumn} + mutableColumns = postgres.ColumnList{CreatedAtColumn, UpdatedAtColumn, DeletedAtColumn, StatusColumn, OpenIDColumn, UsernameColumn, AvatarColumn, MetasColumn, AuthTokenColumn} ) return usersTable{ @@ -89,6 +93,8 @@ func newUsersTableImpl(schemaName, tableName, alias string) usersTable { OpenID: OpenIDColumn, Username: UsernameColumn, Avatar: AvatarColumn, + Metas: MetasColumn, + AuthToken: AuthTokenColumn, AllColumns: allColumns, MutableColumns: mutableColumns, diff --git a/backend/database/transform.yaml b/backend/database/transform.yaml index 7b5aa6a..bf332a0 100644 --- a/backend/database/transform.yaml +++ b/backend/database/transform.yaml @@ -21,6 +21,8 @@ types: users: status: UserStatus + metas: Json[UserMetas] + auth_token: Json[UserAuthToken] orders: status: OrderStatus diff --git a/frontend/wechat/index.html b/frontend/wechat/index.html index 8aee65c..da7b223 100644 --- a/frontend/wechat/index.html +++ b/frontend/wechat/index.html @@ -3,9 +3,8 @@ - - Hello + 动态曲谱 diff --git a/frontend/wechat/src/assets/backdrop.jpg b/frontend/wechat/public/backdrop.jpg similarity index 100% rename from frontend/wechat/src/assets/backdrop.jpg rename to frontend/wechat/public/backdrop.jpg diff --git a/frontend/wechat/public/vite.svg b/frontend/wechat/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/wechat/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/wechat/src/assets/vue.svg b/frontend/wechat/src/assets/vue.svg deleted file mode 100644 index 770e9d3..0000000 --- a/frontend/wechat/src/assets/vue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file