add default categories backend

This commit is contained in:
MaysWind
2020-12-04 02:42:52 +08:00
parent 9c18bc650e
commit c5cc4dee56
8 changed files with 242 additions and 2 deletions
+106
View File
@@ -173,6 +173,112 @@ func (a *TransactionCategoriesApi) CategoryCreateHandler(c *core.Context) (inter
return categoryResp, nil
}
func (a *TransactionCategoriesApi) CategoryCreateBatchHandler(c *core.Context) (interface{}, *errs.Error) {
var categoryCreateBatchReq models.TransactionCategoryCreateBatchRequest
err := c.ShouldBindJSON(&categoryCreateBatchReq)
if err != nil {
log.WarnfWithRequestId(c, "[transaction_categories.CategoryCreateBatchHandler] parse request failed, because %s", err.Error())
return nil, errs.NewIncompleteOrIncorrectSubmissionError(err)
}
uid := c.GetCurrentUid()
categoryTypeMaxOrderMap := make(map[models.TransactionCategoryType]int)
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(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.ErrOperationFailed
}
}
category := a.createNewCategory(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 := 0; j < len(categoryCreateReq.SubCategories); j++ {
subCategory := a.createNewCategory(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(uid, totalCount, categoriesMap)
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)
categoryResps := make([]*models.TransactionCategoryInfoResponse, len(categories))
categoryRespMap := make(map[int64]*models.TransactionCategoryInfoResponse)
for i := 0; i < len(categories); i++ {
categoryResps[i] = categories[i].ToTransactionCategoryInfoResponse()
categoryRespMap[categoryResps[i].Id] = categoryResps[i]
}
for i := 0; i < len(categoryResps); i++ {
categoryResp := categoryResps[i]
if categoryResp.ParentId <= models.TRANSACTION_PARENT_ID_LEVEL_ONE {
continue
}
parentCategory, parentExists := categoryRespMap[categoryResp.ParentId]
if !parentExists || parentCategory == nil {
continue
}
parentCategory.SubCategories = append(parentCategory.SubCategories, categoryResp)
}
finalCategoryResps := make(models.TransactionCategoryInfoResponseSlice, 0)
for i := 0; i < len(categoryResps); i++ {
if categoryResps[i].ParentId == models.TRANSACTION_PARENT_ID_LEVEL_ONE {
sort.Sort(categoryResps[i].SubCategories)
finalCategoryResps = append(finalCategoryResps, categoryResps[i])
}
}
sort.Sort(finalCategoryResps)
typeCategoryMapResponse := make(map[models.TransactionCategoryType]models.TransactionCategoryInfoResponseSlice)
for i := 0; i < len(finalCategoryResps); i++ {
category := finalCategoryResps[i]
categoryList, _ := typeCategoryMapResponse[category.Type]
categoryList = append(categoryList, category)
typeCategoryMapResponse[category.Type] = categoryList
}
return typeCategoryMapResponse, nil
}
func (a *TransactionCategoriesApi) CategoryModifyHandler(c *core.Context) (interface{}, *errs.Error) {
var categoryModifyReq models.TransactionCategoryModifyRequest
err := c.ShouldBindJSON(&categoryModifyReq)
+13
View File
@@ -37,6 +37,19 @@ type TransactionCategoryCreateRequest struct {
Comment string `json:"comment" binding:"max=255"`
}
type TransactionCategoryCreateBatchRequest struct {
Categories []*TransactionCategoryCreateWithSubCategories `json:"categories" binding:"required"`
}
type TransactionCategoryCreateWithSubCategories struct {
Name string `json:"name" binding:"required,notBlank,max=32"`
Type TransactionCategoryType `json:"type" binding:"required"`
Icon int64 `json:"icon,string" binding:"min=1"`
Color string `json:"color" binding:"required,len=6,validHexRGBColor"`
Comment string `json:"comment" binding:"max=255"`
SubCategories []*TransactionCategoryCreateRequest `json:"subCategories" binding:"required"`
}
type TransactionCategoryListRequest struct {
Type TransactionCategoryType `form:"type" binding:"min=0"`
ParentId int64 `form:"parent_id,string,default=-1" binding:"min=-1"`
+53
View File
@@ -150,6 +150,59 @@ func (s *TransactionCategoryService) CreateCategory(category *models.Transaction
})
}
func (s *TransactionCategoryService) CreateCategories(uid int64, totalCount int, categories map[*models.TransactionCategory][]*models.TransactionCategory) ([]*models.TransactionCategory, error) {
if uid <= 0 {
return nil, errs.ErrUserIdInvalid
}
var allCategories []*models.TransactionCategory
primaryCategories := categories[nil]
for i := 0; i < len(primaryCategories); i++ {
primaryCategory := primaryCategories[i]
primaryCategory.CategoryId = s.GenerateUuid(uuid.UUID_TYPE_CATEGORY)
primaryCategory.Deleted = false
primaryCategory.CreatedUnixTime = time.Now().Unix()
primaryCategory.UpdatedUnixTime = time.Now().Unix()
allCategories = append(allCategories, primaryCategory)
secondaryCategories := categories[primaryCategory]
for j := 0; j < len(secondaryCategories); j++ {
secondaryCategory := secondaryCategories[j]
secondaryCategory.CategoryId = s.GenerateUuid(uuid.UUID_TYPE_CATEGORY)
secondaryCategory.ParentCategoryId = primaryCategory.CategoryId
secondaryCategory.Deleted = false
secondaryCategory.CreatedUnixTime = time.Now().Unix()
secondaryCategory.UpdatedUnixTime = time.Now().Unix()
allCategories = append(allCategories, secondaryCategory)
}
}
err := s.UserDataDB(uid).DoTransaction(func(sess *xorm.Session) error {
for i := 0; i < len(allCategories); i++ {
category := allCategories[i]
_, err := sess.Insert(category)
if err != nil {
return err
}
}
return nil
})
if err != nil {
return nil, err
}
return allCategories, nil
}
func (s *TransactionCategoryService) ModifyCategory(category *models.TransactionCategory) error {
if category.Uid <= 0 {
return errs.ErrUserIdInvalid