diff --git a/code/rest/space_controller.go b/code/rest/space_controller.go new file mode 100644 index 0000000..e7bce18 --- /dev/null +++ b/code/rest/space_controller.go @@ -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) +} diff --git a/code/rest/space_dao.go b/code/rest/space_dao.go new file mode 100644 index 0000000..d50ec1e --- /dev/null +++ b/code/rest/space_dao.go @@ -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) +} diff --git a/code/rest/space_member_controller.go b/code/rest/space_member_controller.go new file mode 100644 index 0000000..28579fe --- /dev/null +++ b/code/rest/space_member_controller.go @@ -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) +} diff --git a/code/rest/space_member_dao.go b/code/rest/space_member_dao.go new file mode 100644 index 0000000..000d778 --- /dev/null +++ b/code/rest/space_member_dao.go @@ -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) +} diff --git a/code/rest/space_member_model.go b/code/rest/space_member_model.go new file mode 100644 index 0000000..88a8214 --- /dev/null +++ b/code/rest/space_member_model.go @@ -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)"` +} diff --git a/code/rest/space_member_service.go b/code/rest/space_member_service.go new file mode 100644 index 0000000..77145f2 --- /dev/null +++ b/code/rest/space_member_service.go @@ -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 +} diff --git a/code/rest/space_model.go b/code/rest/space_model.go new file mode 100644 index 0000000..3409499 --- /dev/null +++ b/code/rest/space_model.go @@ -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"` +} diff --git a/code/rest/space_service.go b/code/rest/space_service.go new file mode 100644 index 0000000..1a4e156 --- /dev/null +++ b/code/rest/space_service.go @@ -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 +} diff --git a/code/support/tank_context.go b/code/support/tank_context.go index e5da8db..fa94bfa 100644 --- a/code/support/tank_context.go +++ b/code/support/tank_context.go @@ -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() {