diff --git a/pkg/api/authorizations.go b/pkg/api/authorizations.go
index 9719c84c..0a4a9c7e 100644
--- a/pkg/api/authorizations.go
+++ b/pkg/api/authorizations.go
@@ -233,9 +233,8 @@ func (a *AuthorizationsApi) TwoFactorAuthorizeByRecoveryCodeHandler(c *core.Cont
func (a *AuthorizationsApi) getAuthResponse(token string, need2FA bool, user *models.User) *models.AuthResponse {
return &models.AuthResponse{
- Token: token,
- Need2FA: need2FA,
- NeedVerifyEmail: false,
- User: user.ToUserBasicInfo(),
+ Token: token,
+ Need2FA: need2FA,
+ User: user.ToUserBasicInfo(),
}
}
diff --git a/pkg/api/transaction_categories.go b/pkg/api/transaction_categories.go
index 82c03a64..c7cc9f79 100644
--- a/pkg/api/transaction_categories.go
+++ b/pkg/api/transaction_categories.go
@@ -3,6 +3,8 @@ package api
import (
"sort"
+ "github.com/gin-gonic/gin/binding"
+
"github.com/mayswind/ezbookkeeping/pkg/core"
"github.com/mayswind/ezbookkeeping/pkg/errs"
"github.com/mayswind/ezbookkeeping/pkg/log"
@@ -134,7 +136,7 @@ func (a *TransactionCategoriesApi) CategoryCreateHandler(c *core.Context) (inter
// CategoryCreateBatchHandler saves some new transaction category by request parameters for current user
func (a *TransactionCategoriesApi) CategoryCreateBatchHandler(c *core.Context) (interface{}, *errs.Error) {
var categoryCreateBatchReq models.TransactionCategoryCreateBatchRequest
- err := c.ShouldBindJSON(&categoryCreateBatchReq)
+ err := c.ShouldBindBodyWith(&categoryCreateBatchReq, binding.JSON)
if err != nil {
log.WarnfWithRequestId(c, "[transaction_categories.CategoryCreateBatchHandler] parse request failed, because %s", err.Error())
@@ -143,53 +145,12 @@ func (a *TransactionCategoriesApi) CategoryCreateBatchHandler(c *core.Context) (
uid := c.GetCurrentUid()
- categoryTypeMaxOrderMap := make(map[models.TransactionCategoryType]int32)
- categoriesMap := make(map[*models.TransactionCategory][]*models.TransactionCategory)
- categoriesMap[nil] = make([]*models.TransactionCategory, len(categoryCreateBatchReq.Categories))
- totalCount := 0
-
- for i := 0; i < len(categoryCreateBatchReq.Categories); i++ {
- categoryCreateReq := categoryCreateBatchReq.Categories[i]
- var maxOrderId, exists = categoryTypeMaxOrderMap[categoryCreateReq.Type]
-
- if !exists {
- maxOrderId, err = a.categories.GetMaxDisplayOrder(c, uid, categoryCreateReq.Type)
-
- if err != nil {
- log.ErrorfWithRequestId(c, "[transaction_categories.CategoryCreateBatchHandler] failed to get max display order for user \"uid:%d\", because %s", uid, err.Error())
- return nil, errs.Or(err, errs.ErrOperationFailed)
- }
- }
-
- category := a.createNewCategoryModel(uid, &models.TransactionCategoryCreateRequest{
- Name: categoryCreateReq.Name,
- Type: categoryCreateReq.Type,
- Icon: categoryCreateReq.Icon,
- Color: categoryCreateReq.Color,
- }, maxOrderId+1)
-
- categoriesMap[category] = make([]*models.TransactionCategory, len(categoryCreateReq.SubCategories))
-
- for j := int32(0); j < int32(len(categoryCreateReq.SubCategories)); j++ {
- subCategory := a.createNewCategoryModel(uid, categoryCreateReq.SubCategories[j], j+1)
- categoriesMap[category][j] = subCategory
- totalCount++
- }
-
- categoriesMap[nil][i] = category
- categoryTypeMaxOrderMap[categoryCreateReq.Type] = maxOrderId + 1
- totalCount++
- }
-
- categories, err := a.categories.CreateCategories(c, uid, categoriesMap)
+ categories, err := a.createBatchCategories(c, uid, &categoryCreateBatchReq)
if err != nil {
- log.ErrorfWithRequestId(c, "[transaction_categories.CategoryCreateBatchHandler] failed to create categories for user \"uid:%d\", because %s", uid, err.Error())
return nil, errs.Or(err, errs.ErrOperationFailed)
}
- log.InfofWithRequestId(c, "[transaction_categories.CategoryCreateBatchHandler] user \"uid:%d\" has created categoroies successfully", uid)
-
return a.getTransactionCategoryListByTypeResponse(categories, 0)
}
@@ -325,6 +286,58 @@ func (a *TransactionCategoriesApi) CategoryDeleteHandler(c *core.Context) (inter
return true, nil
}
+func (a *TransactionCategoriesApi) createBatchCategories(c *core.Context, uid int64, categoryCreateBatchReq *models.TransactionCategoryCreateBatchRequest) ([]*models.TransactionCategory, error) {
+ var err error
+ categoryTypeMaxOrderMap := make(map[models.TransactionCategoryType]int32)
+ categoriesMap := make(map[*models.TransactionCategory][]*models.TransactionCategory)
+ categoriesMap[nil] = make([]*models.TransactionCategory, len(categoryCreateBatchReq.Categories))
+ totalCount := 0
+
+ for i := 0; i < len(categoryCreateBatchReq.Categories); i++ {
+ categoryCreateReq := categoryCreateBatchReq.Categories[i]
+ var maxOrderId, exists = categoryTypeMaxOrderMap[categoryCreateReq.Type]
+
+ if !exists {
+ maxOrderId, err = a.categories.GetMaxDisplayOrder(c, uid, categoryCreateReq.Type)
+
+ if err != nil {
+ log.ErrorfWithRequestId(c, "[transaction_categories.CategoryCreateBatchHandler] failed to get max display order for user \"uid:%d\", because %s", uid, err.Error())
+ return nil, errs.Or(err, errs.ErrOperationFailed)
+ }
+ }
+
+ category := a.createNewCategoryModel(uid, &models.TransactionCategoryCreateRequest{
+ Name: categoryCreateReq.Name,
+ Type: categoryCreateReq.Type,
+ Icon: categoryCreateReq.Icon,
+ Color: categoryCreateReq.Color,
+ }, maxOrderId+1)
+
+ categoriesMap[category] = make([]*models.TransactionCategory, len(categoryCreateReq.SubCategories))
+
+ for j := int32(0); j < int32(len(categoryCreateReq.SubCategories)); j++ {
+ subCategory := a.createNewCategoryModel(uid, categoryCreateReq.SubCategories[j], j+1)
+ categoriesMap[category][j] = subCategory
+ totalCount++
+ }
+
+ categoriesMap[nil][i] = category
+ categoryTypeMaxOrderMap[categoryCreateReq.Type] = maxOrderId + 1
+ totalCount++
+ }
+
+ categories, err := a.categories.CreateCategories(c, uid, categoriesMap)
+
+ if err != nil {
+ log.ErrorfWithRequestId(c, "[transaction_categories.createBatchCategories] failed to create categories for user \"uid:%d\", because %s", uid, err.Error())
+ return nil, errs.Or(err, errs.ErrOperationFailed)
+ }
+
+ log.InfofWithRequestId(c, "[transaction_categories.createBatchCategories] user \"uid:%d\" has created categories successfully", uid)
+
+ return categories, nil
+}
+
func (a *TransactionCategoriesApi) createNewCategoryModel(uid int64, categoryCreateReq *models.TransactionCategoryCreateRequest, order int32) *models.TransactionCategory {
return &models.TransactionCategory{
Uid: uid,
diff --git a/pkg/api/users.go b/pkg/api/users.go
index 6c965415..66bcef9a 100644
--- a/pkg/api/users.go
+++ b/pkg/api/users.go
@@ -4,6 +4,8 @@ import (
"strings"
"time"
+ "github.com/gin-gonic/gin/binding"
+
"github.com/mayswind/ezbookkeeping/pkg/core"
"github.com/mayswind/ezbookkeeping/pkg/errs"
"github.com/mayswind/ezbookkeeping/pkg/log"
@@ -36,7 +38,7 @@ func (a *UsersApi) UserRegisterHandler(c *core.Context) (interface{}, *errs.Erro
}
var userRegisterReq models.UserRegisterRequest
- err := c.ShouldBindJSON(&userRegisterReq)
+ err := c.ShouldBindBodyWith(&userRegisterReq, binding.JSON)
if err != nil {
log.WarnfWithRequestId(c, "[users.UserRegisterHandler] parse request failed, because %s", err.Error())
@@ -72,10 +74,23 @@ func (a *UsersApi) UserRegisterHandler(c *core.Context) (interface{}, *errs.Erro
log.InfofWithRequestId(c, "[users.UserRegisterHandler] user \"%s\" has registered successfully, uid is %d", user.Username, user.Uid)
- authResp := &models.AuthResponse{
- Need2FA: false,
- NeedVerifyEmail: settings.Container.Current.EnableUserForceVerifyEmail,
- User: user.ToUserBasicInfo(),
+ presetCategoriesSaved := false
+
+ if len(userRegisterReq.Categories) > 0 {
+ _, err = TransactionCategories.createBatchCategories(c, user.Uid, &userRegisterReq.TransactionCategoryCreateBatchRequest)
+
+ if err == nil {
+ presetCategoriesSaved = true
+ }
+ }
+
+ authResp := &models.RegisterResponse{
+ AuthResponse: models.AuthResponse{
+ Need2FA: false,
+ User: user.ToUserBasicInfo(),
+ },
+ NeedVerifyEmail: settings.Container.Current.EnableUserForceVerifyEmail,
+ PresetCategoriesSaved: presetCategoriesSaved,
}
if settings.Container.Current.EnableUserVerifyEmail && settings.Container.Current.EnableSMTP {
diff --git a/pkg/models/auth_response.go b/pkg/models/auth_response.go
index 0d634cc9..ec959d91 100644
--- a/pkg/models/auth_response.go
+++ b/pkg/models/auth_response.go
@@ -2,8 +2,14 @@ package models
// AuthResponse returns a view-object of user authorization
type AuthResponse struct {
- Token string `json:"token"`
- Need2FA bool `json:"need2FA"`
- NeedVerifyEmail bool `json:"needVerifyEmail"`
- User *UserBasicInfo `json:"user"`
+ Token string `json:"token"`
+ Need2FA bool `json:"need2FA"`
+ User *UserBasicInfo `json:"user"`
+}
+
+// RegisterResponse returns a view-object of user register response
+type RegisterResponse struct {
+ AuthResponse
+ NeedVerifyEmail bool `json:"needVerifyEmail"`
+ PresetCategoriesSaved bool `json:"presetCategoriesSaved"`
}
diff --git a/pkg/models/user.go b/pkg/models/user.go
index 681d0ecc..5dc1d1fa 100644
--- a/pkg/models/user.go
+++ b/pkg/models/user.go
@@ -107,6 +107,7 @@ type UserRegisterRequest struct {
Language string `json:"language" binding:"required,min=2,max=16"`
DefaultCurrency string `json:"defaultCurrency" binding:"required,len=3,validCurrency"`
FirstDayOfWeek WeekDay `json:"firstDayOfWeek" binding:"min=0,max=6"`
+ TransactionCategoryCreateBatchRequest
}
// UserVerifyEmailRequest represents all parameters of user verify email request
diff --git a/src/lib/services.js b/src/lib/services.js
index e51a0edf..13a7d4ee 100644
--- a/src/lib/services.js
+++ b/src/lib/services.js
@@ -91,7 +91,7 @@ export default {
}
});
},
- register: ({ username, email, nickname, password, language, defaultCurrency, firstDayOfWeek }) => {
+ register: ({ username, email, nickname, password, language, defaultCurrency, firstDayOfWeek, categories }) => {
return axios.post('register.json', {
username,
email,
@@ -99,7 +99,8 @@ export default {
password,
language,
defaultCurrency,
- firstDayOfWeek
+ firstDayOfWeek,
+ categories
}, {
timeout: api.requestVerifyEmailTimeout
});
diff --git a/src/locales/en.js b/src/locales/en.js
index dd96446d..37096165 100644
--- a/src/locales/en.js
+++ b/src/locales/en.js
@@ -1056,8 +1056,11 @@ export default {
'Use Preset Transaction Categories': 'Use Preset Transaction Categories',
'Preset Categories': 'Preset Categories',
'Set Whether You Use The Preset Transaction Categories': 'Set Whether You Use The Preset Transaction Categories',
+ 'Complete': 'Complete',
+ 'Registration Complete': 'Registration Complete',
'You have been successfully registered': 'You have been successfully registered',
'You have been successfully registered, but something wrong with adding preset categories. You can re-add preset categories in settings page anytime.': 'You have been successfully registered, but something wrong with adding preset categories. You can re-add preset categories in settings page anytime.',
+ 'You have been successfully registered. Account activation link has been sent to your email address, please activate your account first.': 'You have been successfully registered. Account activation link has been sent to your email address, please activate your account first.',
'Unable to sign up': 'Unable to sign up',
'User registration is disabled': 'User registration is disabled',
'Unable to get user profile': 'Unable to get user profile',
diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js
index dde31e74..a1d476f9 100644
--- a/src/locales/zh_Hans.js
+++ b/src/locales/zh_Hans.js
@@ -1056,8 +1056,11 @@ export default {
'Use Preset Transaction Categories': '使用预设交易分类',
'Preset Categories': '预设分类',
'Set Whether You Use The Preset Transaction Categories': '设置是否使用预设交易分类',
+ 'Complete': '完成',
+ 'Registration Complete': '注册完成',
'You have been successfully registered': '注册成功',
- 'You have been successfully registered, but something wrong with adding preset categories. You can re-add preset categories in settings page anytime.': '注册成功,但是添加预设分类时出错。您可以随时在设置页面中重新添加预设分类。',
+ 'You have been successfully registered, but something wrong with adding preset categories. You can re-add preset categories in settings page anytime.': '您已经注册成功,但是添加预设分类时出错。您可以随时在设置页面中重新添加预设分类。',
+ 'You have been successfully registered. Account activation link has been sent to your email address, please activate your account first.': '您已经注册成功。账号激活链接已经发送到您的邮箱地址,请先激活您的账号。',
'Unable to sign up': '无法注册',
'User registration is disabled': '用户注册已禁用',
'Unable to get user profile': '无法获取用户信息',
diff --git a/src/stores/index.js b/src/stores/index.js
index 0e5f1205..2676f7e7 100644
--- a/src/stores/index.js
+++ b/src/stores/index.js
@@ -159,7 +159,7 @@ export const useRootStore = defineStore('root', {
});
});
},
- register({ user }) {
+ register({ user, presetCategories }) {
const settingsStore = useSettingsStore();
return new Promise((resolve, reject) => {
@@ -170,7 +170,8 @@ export const useRootStore = defineStore('root', {
nickname: user.nickname,
language: user.language,
defaultCurrency: user.defaultCurrency,
- firstDayOfWeek: user.firstDayOfWeek
+ firstDayOfWeek: user.firstDayOfWeek,
+ categories: presetCategories
}).then(response => {
const data = response.data;
diff --git a/src/views/desktop/SignupPage.vue b/src/views/desktop/SignupPage.vue
index d1b7413c..1685de47 100644
--- a/src/views/desktop/SignupPage.vue
+++ b/src/views/desktop/SignupPage.vue
@@ -20,18 +20,7 @@
{{ finalResultMessage }}
+