diff --git a/controllor/adminAdd.go b/adminControllor/adminAdd.go similarity index 98% rename from controllor/adminAdd.go rename to adminControllor/adminAdd.go index 8046426..9771fca 100644 --- a/controllor/adminAdd.go +++ b/adminControllor/adminAdd.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminDelete.go b/adminControllor/adminDelete.go similarity index 98% rename from controllor/adminDelete.go rename to adminControllor/adminDelete.go index 3bf8ee9..3d08db1 100644 --- a/controllor/adminDelete.go +++ b/adminControllor/adminDelete.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminEdit.go b/adminControllor/adminEdit.go similarity index 99% rename from controllor/adminEdit.go rename to adminControllor/adminEdit.go index 76d32bf..aeaa7d6 100644 --- a/controllor/adminEdit.go +++ b/adminControllor/adminEdit.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminGet.go b/adminControllor/adminGet.go similarity index 97% rename from controllor/adminGet.go rename to adminControllor/adminGet.go index 34a95ed..a736a9a 100644 --- a/controllor/adminGet.go +++ b/adminControllor/adminGet.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/adminLogin.go b/adminControllor/adminLogin.go similarity index 99% rename from controllor/adminLogin.go rename to adminControllor/adminLogin.go index 433350f..d8bdcd3 100644 --- a/controllor/adminLogin.go +++ b/adminControllor/adminLogin.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "errors" diff --git a/controllor/adminLogout.go b/adminControllor/adminLogout.go similarity index 97% rename from controllor/adminLogout.go rename to adminControllor/adminLogout.go index 5e424b8..e684099 100644 --- a/controllor/adminLogout.go +++ b/adminControllor/adminLogout.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/adminControllor/adminRange.go b/adminControllor/adminRange.go new file mode 100644 index 0000000..68a601c --- /dev/null +++ b/adminControllor/adminRange.go @@ -0,0 +1,81 @@ +package adminControllor + +import ( + "net/http" + "strings" + + "github.com/TrafficLight6/GoAccountHub/sqlTable" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type AdminRangeRequestBody struct { + //It the Length is -1, It Means Get All Admin from BeginTableId to The End + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition AdminSearchCondition `json:"search_condition"` +} + +type AdminSearchCondition struct { + //If The Field is Empty, It Means Ignore This Condition + Username string `json:"username"` + PasswordHash string `json:"password_hash"` + UUHash string `json:"uu_hash"` +} + +func AdminRange(c *gin.Context) { + var body AdminRangeRequestBody + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Invalid Request Body"}) + c.Abort() + return + } + if body.BeginTableId < 0 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "BeginTableId Begin From 1"}) + c.Abort() + return + } + //Check Length is Valid + if body.Length < -1 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Length Must Be Greater Than -1"}) + c.Abort() + return + } + var isReturnAll bool + if body.Length == -1 { + isReturnAll = true + } else { + isReturnAll = false + } + //Get Db + db := c.Value("db").(*gorm.DB) + //Build Search Query (only non-empty fields, combined with AND) + condition := body.SearchCondition + var conditions []string + var args []interface{} + if condition.Username != "" { + conditions = append(conditions, "username LIKE ?") + args = append(args, "%"+condition.Username+"%") + } + if condition.PasswordHash != "" { + conditions = append(conditions, "password_hash LIKE ?") + args = append(args, "%"+condition.PasswordHash+"%") + } + if condition.UUHash != "" { + conditions = append(conditions, "uu_hash LIKE ?") + args = append(args, "%"+condition.UUHash+"%") + } + query := db.Model(&sqlTable.Admin{}) + if len(conditions) > 0 { + query = query.Where(strings.Join(conditions, " AND "), args...) + } + //Search + var admins []sqlTable.Admin + if isReturnAll { + query.Find(&admins) + } else { + query.Limit(body.Length).Offset((body.BeginTableId - 1) * body.Length).Find(&admins) + } + //Return Result + c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success(not include root admin)", "data": admins}) +} diff --git a/controllor/characterAdd.go b/adminControllor/characterAdd.go similarity index 99% rename from controllor/characterAdd.go rename to adminControllor/characterAdd.go index 0724198..00e6c85 100644 --- a/controllor/characterAdd.go +++ b/adminControllor/characterAdd.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/characterEdit.go b/adminControllor/characterEdit.go similarity index 98% rename from controllor/characterEdit.go rename to adminControllor/characterEdit.go index f4f995b..df9b0b9 100644 --- a/controllor/characterEdit.go +++ b/adminControllor/characterEdit.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/characterGet.go b/adminControllor/characterGet.go similarity index 97% rename from controllor/characterGet.go rename to adminControllor/characterGet.go index 5a50e4e..f18f45f 100644 --- a/controllor/characterGet.go +++ b/adminControllor/characterGet.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/adminControllor/characterRange.go b/adminControllor/characterRange.go new file mode 100644 index 0000000..ad63cff --- /dev/null +++ b/adminControllor/characterRange.go @@ -0,0 +1,81 @@ +package adminControllor + +import ( + "net/http" + "strings" + + "github.com/TrafficLight6/GoAccountHub/sqlTable" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type CharacterRangeRequestBody struct { + //It the Length is -1, It Means Get All User from BeginTableId to The End + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition CharacterSearchCondition `json:"search_condition"` +} + +type CharacterSearchCondition struct { + //If The Field is Empty, It Means Ignore This Condition + CharacterName string `json:"character_name"` + PasswordHash string `json:"password_hash"` + UserUUHash string `json:"user_uu_hash"` + UUHash string `json:"uu_hash"` +} + +func CharacterRange(c *gin.Context) { + var body CharacterRangeRequestBody + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": err.Error()}) + return + } + //Check Length is Valid + if body.Length < -1 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Length Must Be Greater Than -1"}) + c.Abort() + return + } + var isReturnAll bool + if body.Length == -1 { + isReturnAll = true + } else { + isReturnAll = false + } + //Get Db + db := c.Value("db").(*gorm.DB) + //Build Search Query (only non-empty fields, combined with AND) + condition := body.SearchCondition + var conditions []string + var args []interface{} + if condition.CharacterName != "" { + conditions = append(conditions, "character_name LIKE ?") + args = append(args, "%"+condition.CharacterName+"%") + } + if condition.PasswordHash != "" { + conditions = append(conditions, "password_hash LIKE ?") + args = append(args, "%"+condition.PasswordHash+"%") + } + if condition.UserUUHash != "" { + conditions = append(conditions, "user_uu_hash LIKE ?") + args = append(args, "%"+condition.UserUUHash+"%") + } + if condition.UUHash != "" { + conditions = append(conditions, "uu_hash LIKE ?") + args = append(args, "%"+condition.UUHash+"%") + } + query := db.Model(&sqlTable.Character{}) + if len(conditions) > 0 { + query = query.Where(strings.Join(conditions, " AND "), args...) + } + //Search + var characters []sqlTable.Character + if isReturnAll { + query.Find(&characters) + } else { + query.Limit(body.Length).Offset((body.BeginTableId - 1) * body.Length).Find(&characters) + } + //Return Result + c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success", "data": characters}) + return +} diff --git a/controllor/charaterDelete.go b/adminControllor/charaterDelete.go similarity index 98% rename from controllor/charaterDelete.go rename to adminControllor/charaterDelete.go index cb08dca..c9db246 100644 --- a/controllor/charaterDelete.go +++ b/adminControllor/charaterDelete.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/rootControllor.go b/adminControllor/rootControllor.go similarity index 88% rename from controllor/rootControllor.go rename to adminControllor/rootControllor.go index 78320ec..3cbf74c 100644 --- a/controllor/rootControllor.go +++ b/adminControllor/rootControllor.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userAdd.go b/adminControllor/userAdd.go similarity index 98% rename from controllor/userAdd.go rename to adminControllor/userAdd.go index f4cdb11..2d98603 100644 --- a/controllor/userAdd.go +++ b/adminControllor/userAdd.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userDelete.go b/adminControllor/userDelete.go similarity index 97% rename from controllor/userDelete.go rename to adminControllor/userDelete.go index f968a61..10caf85 100644 --- a/controllor/userDelete.go +++ b/adminControllor/userDelete.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userEdit.go b/adminControllor/userEdit.go similarity index 99% rename from controllor/userEdit.go rename to adminControllor/userEdit.go index 8bd620b..d948f97 100644 --- a/controllor/userEdit.go +++ b/adminControllor/userEdit.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/controllor/userGet.go b/adminControllor/userGet.go similarity index 98% rename from controllor/userGet.go rename to adminControllor/userGet.go index ed90c7a..85efa98 100644 --- a/controllor/userGet.go +++ b/adminControllor/userGet.go @@ -1,4 +1,4 @@ -package controllor +package adminControllor import ( "net/http" diff --git a/adminControllor/userRanger.go b/adminControllor/userRanger.go new file mode 100644 index 0000000..c18b681 --- /dev/null +++ b/adminControllor/userRanger.go @@ -0,0 +1,82 @@ +package adminControllor + +import ( + "net/http" + "strings" + + "github.com/TrafficLight6/GoAccountHub/sqlTable" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type UserRangeRequestBody struct { + //It the Length is -1, It Means Get All User from BeginTableId to The End + BeginTableId int `json:"begin_table_id"` + Length int `json:"length"` + SearchCondition UserSearchCondition `json:"search_condition"` +} + +type UserSearchCondition struct { + //If The Field is Empty, It Means Ignore This Condition + Username string `json:"username"` + PasswordHash string `json:"password_hash"` + UUHash string `json:"uu_hash"` +} + +func UserRange(c *gin.Context) { + var body UserRangeRequestBody + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Invalid Request Body"}) + c.Abort() + return + } + if body.BeginTableId < 0 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "BeginTableId Begin From 1"}) + c.Abort() + return + } + //Check Length is Valid + if body.Length < -1 { + c.JSON(http.StatusBadRequest, gin.H{"code": http.StatusBadRequest, "error": "Length Must Be Greater Than -1"}) + c.Abort() + return + } + var isReturnAll bool + if body.Length == -1 { + isReturnAll = true + } else { + isReturnAll = false + } + //Get Db + db := c.Value("db").(*gorm.DB) + //Build Search Query (only non-empty fields, combined with AND) + condition := body.SearchCondition + var conditions []string + var args []interface{} + if condition.Username != "" { + conditions = append(conditions, "username LIKE ?") + args = append(args, "%"+condition.Username+"%") + } + if condition.PasswordHash != "" { + conditions = append(conditions, "password_hash LIKE ?") + args = append(args, "%"+condition.PasswordHash+"%") + } + if condition.UUHash != "" { + conditions = append(conditions, "uu_hash LIKE ?") + args = append(args, "%"+condition.UUHash+"%") + } + query := db.Model(&sqlTable.User{}) + if len(conditions) > 0 { + query = query.Where(strings.Join(conditions, " AND "), args...) + } + //Search + var users []sqlTable.User + if isReturnAll { + query.Find(&users) + } else { + query.Limit(body.Length).Offset((body.BeginTableId - 1) * body.Length).Find(&users) + } + //Return Result + c.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "message": "Success", "data": users}) + return +} diff --git a/router/router.go b/router/router.go index c1a33b1..781f1ef 100644 --- a/router/router.go +++ b/router/router.go @@ -1,8 +1,8 @@ package router import ( + "github.com/TrafficLight6/GoAccountHub/adminControllor" "github.com/TrafficLight6/GoAccountHub/config" - "github.com/TrafficLight6/GoAccountHub/controllor" "github.com/TrafficLight6/GoAccountHub/middleware" sqlOperator "github.com/TrafficLight6/GoAccountHub/sql" "github.com/gin-gonic/gin" @@ -22,7 +22,7 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { router.RouterGroup.Group("/") //Root Page - router.GET("/", controllor.Root) + router.GET("/", adminControllor.Root) //v1 Api v1 := router.Group("/api/v1") @@ -31,29 +31,32 @@ func ReturnRouter(config config.Config) (*gin.Engine, *gorm.DB) { //Admin Api //Login & Logout - v1.GET("/admin/login", controllor.AdminLogin) - v1.DELETE("/admin/logout", controllor.AdminLogout) + v1.GET("/admin/login", adminControllor.AdminLogin) + v1.DELETE("/admin/logout", adminControllor.AdminLogout) //Admin Operation - v1.POST("/admin/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_add_admin"), controllor.AdminAdd) - v1.DELETE("/admin/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_delete_admin"), controllor.AdminDelete) - v1.PUT("/admin/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_edit_admin"), controllor.AdminEdit) - v1.GET("/admin/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin"), controllor.AdminGet) + v1.POST("/admin/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_add_admin"), adminControllor.AdminAdd) + v1.DELETE("/admin/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_delete_admin"), adminControllor.AdminDelete) + v1.PUT("/admin/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_edit_admin"), adminControllor.AdminEdit) + v1.GET("/admin/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin"), adminControllor.AdminGet) + v1.GET("/admin/range", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_get_admin_range"), adminControllor.AdminRange) //User Api - v1.POST("/user/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserAdd) - v1.DELETE("/user/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserDelete) - v1.PUT("/user/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserEdit) - v1.GET("/user/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), controllor.UserGet) + v1.POST("/user/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserAdd) + v1.DELETE("/user/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserDelete) + v1.PUT("/user/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserEdit) + v1.GET("/user/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user"), adminControllor.UserGet) + v1.GET("/user/range", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_user_range"), adminControllor.UserRange) //Character Api //Check is Allowed to Use Multi Character Functions v1.Use(middleware.ConfigBlocker("allow_multi_character")) //Character Operation - v1.POST("/character/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterAdd) - v1.DELETE("/character/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterDelete) - v1.PUT("/character/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterEdit) - v1.GET("/character/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), controllor.CharacterGet) + v1.POST("/character/add", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterAdd) + v1.DELETE("/character/delete", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterDelete) + v1.PUT("/character/edit", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterEdit) + v1.GET("/character/get", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character"), adminControllor.CharacterGet) + v1.GET("/character/range", middleware.AdminCheckMiddleware(), middleware.AdminPermissionCheckMiddleware("can_operate_character_range"), adminControllor.CharacterRange) } return router, db