feat: add the space and spaceMember module.

This commit is contained in:
lishuang
2023-05-13 14:35:33 +08:00
parent 42208ac101
commit 3e2234c1cd
9 changed files with 619 additions and 2 deletions
+128
View File
@@ -0,0 +1,128 @@
package rest
import (
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/tool/builder"
"github.com/eyebluecn/tank/code/tool/result"
"net/http"
"strconv"
)
type SpaceController struct {
BaseController
spaceDao *SpaceDao
matterDao *MatterDao
matterService *MatterService
spaceService *SpaceService
}
func (this *SpaceController) Init() {
this.BaseController.Init()
b := core.CONTEXT.GetBean(this.spaceDao)
if b, ok := b.(*SpaceDao); ok {
this.spaceDao = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
}
b = core.CONTEXT.GetBean(this.matterService)
if b, ok := b.(*MatterService); ok {
this.matterService = b
}
b = core.CONTEXT.GetBean(this.spaceService)
if b, ok := b.(*SpaceService); ok {
this.spaceService = b
}
}
func (this *SpaceController) RegisterRoutes() map[string]func(writer http.ResponseWriter, request *http.Request) {
routeMap := make(map[string]func(writer http.ResponseWriter, request *http.Request))
routeMap["/api/space/create"] = this.Wrap(this.Create, USER_ROLE_ADMINISTRATOR)
routeMap["/api/space/delete"] = this.Wrap(this.Delete, USER_ROLE_USER)
routeMap["/api/space/detail"] = this.Wrap(this.Detail, USER_ROLE_USER)
routeMap["/api/space/page"] = this.Wrap(this.Page, USER_ROLE_USER)
return routeMap
}
func (this *SpaceController) Create(writer http.ResponseWriter, request *http.Request) *result.WebResult {
//TODO:
return this.Success("OK")
}
func (this *SpaceController) Delete(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
space := this.spaceDao.FindByUuid(uuid)
if space != nil {
this.spaceDao.Delete(space)
}
return this.Success(nil)
}
func (this *SpaceController) Detail(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
space := this.spaceDao.CheckByUuid(uuid)
user := this.checkUser(request)
if space.UserUuid != user.Uuid {
panic(result.UNAUTHORIZED)
}
return this.Success(space)
}
func (this *SpaceController) Page(writer http.ResponseWriter, request *http.Request) *result.WebResult {
pageStr := request.FormValue("page")
pageSizeStr := request.FormValue("pageSize")
orderCreateTime := request.FormValue("orderCreateTime")
user := this.checkUser(request)
var page int
if pageStr != "" {
page, _ = strconv.Atoi(pageStr)
}
pageSize := 200
if pageSizeStr != "" {
tmp, err := strconv.Atoi(pageSizeStr)
if err == nil {
pageSize = tmp
}
}
sortArray := []builder.OrderPair{
{
Key: "create_time",
Value: orderCreateTime,
},
}
pager := this.spaceDao.Page(page, pageSize, user.Uuid, sortArray)
return this.Success(pager)
}
+104
View File
@@ -0,0 +1,104 @@
package rest
import (
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/tool/builder"
"github.com/eyebluecn/tank/code/tool/result"
"gorm.io/gorm"
"github.com/eyebluecn/tank/code/tool/uuid"
"time"
)
type SpaceDao struct {
BaseDao
}
// find by uuid. if not found return nil.
func (this *SpaceDao) FindByUuid(uuid string) *Space {
var entity = &Space{}
db := core.CONTEXT.GetDB().Where("uuid = ?", uuid).First(entity)
if db.Error != nil {
if db.Error.Error() == result.DB_ERROR_NOT_FOUND {
return nil
} else {
panic(db.Error)
}
}
return entity
}
// find by uuid. if not found panic NotFound error
func (this *SpaceDao) CheckByUuid(uuid string) *Space {
entity := this.FindByUuid(uuid)
if entity == nil {
panic(result.NotFound("not found record with uuid = %s", uuid))
}
return entity
}
func (this *SpaceDao) Page(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) *Pager {
count, spaces := this.PlainPage(page, pageSize, userUuid, sortArray)
pager := NewPager(page, pageSize, count, spaces)
return pager
}
func (this *SpaceDao) PlainPage(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) (int, []*Space) {
var wp = &builder.WherePair{}
if userUuid != "" {
wp = wp.And(&builder.WherePair{Query: "user_uuid = ?", Args: []interface{}{userUuid}})
}
var conditionDB *gorm.DB
conditionDB = core.CONTEXT.GetDB().Model(&Space{}).Where(wp.Query, wp.Args...)
var count int64 = 0
db := conditionDB.Count(&count)
this.PanicError(db.Error)
var spaces []*Space
db = conditionDB.Order(this.GetSortString(sortArray)).Offset(page * pageSize).Limit(pageSize).Find(&spaces)
this.PanicError(db.Error)
return int(count), spaces
}
func (this *SpaceDao) Create(space *Space) *Space {
timeUUID, _ := uuid.NewV4()
space.Uuid = string(timeUUID.String())
space.CreateTime = time.Now()
space.UpdateTime = time.Now()
space.Sort = time.Now().UnixNano() / 1e6
db := core.CONTEXT.GetDB().Create(space)
this.PanicError(db.Error)
return space
}
func (this *SpaceDao) Save(space *Space) *Space {
space.UpdateTime = time.Now()
db := core.CONTEXT.GetDB().Save(space)
this.PanicError(db.Error)
return space
}
func (this *SpaceDao) Delete(space *Space) {
db := core.CONTEXT.GetDB().Delete(&space)
this.PanicError(db.Error)
}
// System cleanup.
func (this *SpaceDao) Cleanup() {
this.logger.Info("[SpaceDao] clean up. Delete all Space")
db := core.CONTEXT.GetDB().Where("uuid is not null").Delete(Space{})
this.PanicError(db.Error)
}
+136
View File
@@ -0,0 +1,136 @@
package rest
import (
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/tool/builder"
"github.com/eyebluecn/tank/code/tool/result"
"net/http"
"strconv"
"strings"
)
type SpaceMemberController struct {
BaseController
spaceMemberDao *SpaceMemberDao
bridgeDao *BridgeDao
matterDao *MatterDao
matterService *MatterService
spaceMemberService *SpaceMemberService
}
func (this *SpaceMemberController) Init() {
this.BaseController.Init()
b := core.CONTEXT.GetBean(this.spaceMemberDao)
if b, ok := b.(*SpaceMemberDao); ok {
this.spaceMemberDao = b
}
b = core.CONTEXT.GetBean(this.bridgeDao)
if b, ok := b.(*BridgeDao); ok {
this.bridgeDao = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
}
b = core.CONTEXT.GetBean(this.matterService)
if b, ok := b.(*MatterService); ok {
this.matterService = b
}
b = core.CONTEXT.GetBean(this.spaceMemberService)
if b, ok := b.(*SpaceMemberService); ok {
this.spaceMemberService = b
}
}
func (this *SpaceMemberController) RegisterRoutes() map[string]func(writer http.ResponseWriter, request *http.Request) {
routeMap := make(map[string]func(writer http.ResponseWriter, request *http.Request))
routeMap["/api/spaceMember/delete/batch"] = this.Wrap(this.DeleteBatch, USER_ROLE_USER)
routeMap["/api/spaceMember/detail"] = this.Wrap(this.Detail, USER_ROLE_USER)
routeMap["/api/spaceMember/page"] = this.Wrap(this.Page, USER_ROLE_USER)
return routeMap
}
func (this *SpaceMemberController) DeleteBatch(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuids := request.FormValue("uuids")
if uuids == "" {
panic(result.BadRequest("uuids cannot be null"))
}
uuidArray := strings.Split(uuids, ",")
for _, uuid := range uuidArray {
imageCache := this.spaceMemberDao.FindByUuid(uuid)
user := this.checkUser(request)
if imageCache.UserUuid != user.Uuid {
panic(result.UNAUTHORIZED)
}
this.spaceMemberDao.Delete(imageCache)
}
return this.Success("OK")
}
func (this *SpaceMemberController) Detail(writer http.ResponseWriter, request *http.Request) *result.WebResult {
uuid := request.FormValue("uuid")
if uuid == "" {
panic(result.BadRequest("uuid cannot be null"))
}
spaceMember := this.spaceMemberDao.CheckByUuid(uuid)
user := this.checkUser(request)
if spaceMember.UserUuid != user.Uuid {
panic(result.UNAUTHORIZED)
}
return this.Success(spaceMember)
}
func (this *SpaceMemberController) Page(writer http.ResponseWriter, request *http.Request) *result.WebResult {
pageStr := request.FormValue("page")
pageSizeStr := request.FormValue("pageSize")
orderCreateTime := request.FormValue("orderCreateTime")
user := this.checkUser(request)
var page int
if pageStr != "" {
page, _ = strconv.Atoi(pageStr)
}
pageSize := 200
if pageSizeStr != "" {
tmp, err := strconv.Atoi(pageSizeStr)
if err == nil {
pageSize = tmp
}
}
sortArray := []builder.OrderPair{
{
Key: "create_time",
Value: orderCreateTime,
},
}
pager := this.spaceMemberDao.Page(page, pageSize, user.Uuid, sortArray)
return this.Success(pager)
}
+104
View File
@@ -0,0 +1,104 @@
package rest
import (
"github.com/eyebluecn/tank/code/core"
"github.com/eyebluecn/tank/code/tool/builder"
"github.com/eyebluecn/tank/code/tool/result"
"gorm.io/gorm"
"github.com/eyebluecn/tank/code/tool/uuid"
"time"
)
type SpaceMemberDao struct {
BaseDao
}
// find by uuid. if not found return nil.
func (this *SpaceMemberDao) FindByUuid(uuid string) *SpaceMember {
var entity = &SpaceMember{}
db := core.CONTEXT.GetDB().Where("uuid = ?", uuid).First(entity)
if db.Error != nil {
if db.Error.Error() == result.DB_ERROR_NOT_FOUND {
return nil
} else {
panic(db.Error)
}
}
return entity
}
// find by uuid. if not found panic NotFound error
func (this *SpaceMemberDao) CheckByUuid(uuid string) *SpaceMember {
entity := this.FindByUuid(uuid)
if entity == nil {
panic(result.NotFound("not found record with uuid = %s", uuid))
}
return entity
}
func (this *SpaceMemberDao) Page(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) *Pager {
count, spaceMembers := this.PlainPage(page, pageSize, userUuid, sortArray)
pager := NewPager(page, pageSize, count, spaceMembers)
return pager
}
func (this *SpaceMemberDao) PlainPage(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) (int, []*SpaceMember) {
var wp = &builder.WherePair{}
if userUuid != "" {
wp = wp.And(&builder.WherePair{Query: "user_uuid = ?", Args: []interface{}{userUuid}})
}
var conditionDB *gorm.DB
conditionDB = core.CONTEXT.GetDB().Model(&SpaceMember{}).Where(wp.Query, wp.Args...)
var count int64 = 0
db := conditionDB.Count(&count)
this.PanicError(db.Error)
var spaceMembers []*SpaceMember
db = conditionDB.Order(this.GetSortString(sortArray)).Offset(page * pageSize).Limit(pageSize).Find(&spaceMembers)
this.PanicError(db.Error)
return int(count), spaceMembers
}
func (this *SpaceMemberDao) Create(spaceMember *SpaceMember) *SpaceMember {
timeUUID, _ := uuid.NewV4()
spaceMember.Uuid = string(timeUUID.String())
spaceMember.CreateTime = time.Now()
spaceMember.UpdateTime = time.Now()
spaceMember.Sort = time.Now().UnixNano() / 1e6
db := core.CONTEXT.GetDB().Create(spaceMember)
this.PanicError(db.Error)
return spaceMember
}
func (this *SpaceMemberDao) Save(spaceMember *SpaceMember) *SpaceMember {
spaceMember.UpdateTime = time.Now()
db := core.CONTEXT.GetDB().Save(spaceMember)
this.PanicError(db.Error)
return spaceMember
}
func (this *SpaceMemberDao) Delete(spaceMember *SpaceMember) {
db := core.CONTEXT.GetDB().Delete(&spaceMember)
this.PanicError(db.Error)
}
// System cleanup.
func (this *SpaceMemberDao) Cleanup() {
this.logger.Info("[SpaceMemberDao] clean up. Delete all SpaceMember")
db := core.CONTEXT.GetDB().Where("uuid is not null").Delete(SpaceMember{})
this.PanicError(db.Error)
}
+27
View File
@@ -0,0 +1,27 @@
package rest
import (
"time"
)
const (
//read only member
SPACE_MEMBER_ROLE_READ_ONLY = "READ_ONLY"
//read write member
SPACE_MEMBER_ROLE_READ_WRITE = "READ_WRITE"
//read write member
SPACE_MEMBER_ROLE_ADMIN = "ADMIN"
)
/**
* space member
*/
type SpaceMember struct {
Uuid string `json:"uuid" gorm:"type:char(36);primary_key;unique"`
Sort int64 `json:"sort" gorm:"type:bigint(20) not null"`
UpdateTime time.Time `json:"updateTime" gorm:"type:timestamp not null;default:CURRENT_TIMESTAMP"`
CreateTime time.Time `json:"createTime" gorm:"type:timestamp not null;default:'2018-01-01 00:00:00'"`
SpaceUuid string `json:"spaceUuid" gorm:"type:char(36);index:idx_space_uuid"`
UserUuid string `json:"userUuid" gorm:"type:char(36);index:idx_user_uuid"`
Role string `json:"role" gorm:"type:varchar(45)"`
}
+46
View File
@@ -0,0 +1,46 @@
package rest
import (
"github.com/eyebluecn/tank/code/core"
)
// @Service
type SpaceMemberService struct {
BaseBean
spaceMemberDao *SpaceMemberDao
matterDao *MatterDao
bridgeDao *BridgeDao
userDao *UserDao
}
func (this *SpaceMemberService) Init() {
this.BaseBean.Init()
b := core.CONTEXT.GetBean(this.spaceMemberDao)
if b, ok := b.(*SpaceMemberDao); ok {
this.spaceMemberDao = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
}
b = core.CONTEXT.GetBean(this.bridgeDao)
if b, ok := b.(*BridgeDao); ok {
this.bridgeDao = b
}
b = core.CONTEXT.GetBean(this.userDao)
if b, ok := b.(*UserDao); ok {
this.userDao = b
}
}
func (this *SpaceMemberService) Detail(uuid string) *SpaceMember {
spaceMember := this.spaceMemberDao.CheckByUuid(uuid)
return spaceMember
}
+16
View File
@@ -0,0 +1,16 @@
package rest
import (
"time"
)
/**
* shared space
*/
type Space struct {
Uuid string `json:"uuid" gorm:"type:char(36);primary_key;unique"`
Sort int64 `json:"sort" gorm:"type:bigint(20) not null"`
UpdateTime time.Time `json:"updateTime" gorm:"type:timestamp not null;default:CURRENT_TIMESTAMP"`
CreateTime time.Time `json:"createTime" gorm:"type:timestamp not null;default:'2018-01-01 00:00:00'"`
UserUuid string `json:"userUuid" gorm:"type:char(36);unique:uk_user_uuid"`
}
+46
View File
@@ -0,0 +1,46 @@
package rest
import (
"github.com/eyebluecn/tank/code/core"
)
// @Service
type SpaceService struct {
BaseBean
spaceDao *SpaceDao
matterDao *MatterDao
bridgeDao *BridgeDao
userDao *UserDao
}
func (this *SpaceService) Init() {
this.BaseBean.Init()
b := core.CONTEXT.GetBean(this.spaceDao)
if b, ok := b.(*SpaceDao); ok {
this.spaceDao = b
}
b = core.CONTEXT.GetBean(this.matterDao)
if b, ok := b.(*MatterDao); ok {
this.matterDao = b
}
b = core.CONTEXT.GetBean(this.bridgeDao)
if b, ok := b.(*BridgeDao); ok {
this.bridgeDao = b
}
b = core.CONTEXT.GetBean(this.userDao)
if b, ok := b.(*UserDao); ok {
this.userDao = b
}
}
func (this *SpaceService) Detail(uuid string) *Space {
space := this.spaceDao.CheckByUuid(uuid)
return space
}
+12 -2
View File
@@ -69,7 +69,7 @@ func (this *TankContext) Cleanup() {
}
}
//can serve as http server.
// can serve as http server.
func (this *TankContext) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
this.Router.ServeHTTP(writer, request)
}
@@ -204,6 +204,16 @@ func (this *TankContext) registerBeans() {
this.registerBean(new(rest.ShareDao))
this.registerBean(new(rest.ShareService))
//space
this.registerBean(new(rest.SpaceController))
this.registerBean(new(rest.SpaceDao))
this.registerBean(new(rest.SpaceService))
//space member
this.registerBean(new(rest.SpaceMemberController))
this.registerBean(new(rest.SpaceMemberDao))
this.registerBean(new(rest.SpaceMemberService))
//uploadToken
this.registerBean(new(rest.UploadTokenDao))
@@ -241,7 +251,7 @@ func (this *TankContext) initBeans() {
}
}
//if application installed. invoke this method.
// if application installed. invoke this method.
func (this *TankContext) InstallOk() {
if core.CONFIG.Installed() {