diff --git a/api/api_parameters.go b/api/api_parameters.go index 9c5605f..21c7310 100644 --- a/api/api_parameters.go +++ b/api/api_parameters.go @@ -25,11 +25,29 @@ type avatarIDParam struct { AvatarID int `json:"avatarID"` } +// swagger:parameters newAvatar newAvatar1 updateAvatar +// type avatarObjectParam struct { +// //Link of the avatar in server. +// // in:body +// Avatar models.Avatar `json:""` +// } + +// avatarObjectParam object +// +// Avatar object to provide to update or create avatar into the database. +// // swagger:parameters newAvatar newAvatar1 updateAvatar type avatarObjectParam struct { - //Link of the avatar in server. - // in:body - Avatar models.Avatar `json:"avatar"` + // Avatar name + // + // required: true + // in: body + Name string `gorm:"column:name;not null;unique" json:"name,omitempty"` + // Path into server + // + // required: true + // in: body + Link string `gorm:"column:link;not null;unique" json:"link,omitempty"` } // <><><><><> <><><><><> <><><><><> <><><><><> // diff --git a/api/avatar_route.go b/api/avatar_route.go index 8e0a0d1..f4c62e9 100644 --- a/api/avatar_route.go +++ b/api/avatar_route.go @@ -182,10 +182,7 @@ func getAvatarFromLink(w http.ResponseWriter, r *http.Request) { } func newAvatar(w http.ResponseWriter, r *http.Request) { - var data struct { - Avatar *models.Avatar - OmitID interface{} `json:"id,omitempty"` - } + var Avatar *models.Avatar token := r.Context().Value(jwtTokenKey).(*jwt.Token) if !canManageOrganisation(token) { res := error401 @@ -196,8 +193,8 @@ func newAvatar(w http.ResponseWriter, r *http.Request) { store := datastores.Store() db := dbStore.db request := r.Body - err := chiRender.Bind(request, &data) - if err != nil || data.Avatar == nil { + err := chiRender.Bind(request, &Avatar) + if err != nil || Avatar == nil { render.JSON(w, error422.StatusCode, error422) return } @@ -205,19 +202,16 @@ func newAvatar(w http.ResponseWriter, r *http.Request) { render.JSON(w, error503.StatusCode, error503) return } - rerr := store.Avatar().Save(data.Avatar, db) + rerr := store.Avatar().Save(Avatar, db) if rerr != nil { render.JSON(w, rerr.StatusCode, rerr) return } - render.JSON(w, 201, data.Avatar) + render.JSON(w, 201, Avatar) } func updateAvatar(w http.ResponseWriter, r *http.Request) { - var data struct { - Avatar *models.Avatar - OmitID interface{} `json:"id,omitempty"` - } + var Avatar *models.Avatar token := r.Context().Value(jwtTokenKey).(*jwt.Token) if !canManageOrganisation(token) { res := error401 @@ -228,9 +222,9 @@ func updateAvatar(w http.ResponseWriter, r *http.Request) { store := datastores.Store() db := dbStore.db request := r.Body - err := chiRender.Bind(request, &data) + err := chiRender.Bind(request, &Avatar) avatar := r.Context().Value(oldAvatarKey).(models.Avatar) - if err != nil || data.Avatar == nil { + if err != nil || &Avatar == nil { render.JSON(w, error422.StatusCode, error422) return } @@ -238,7 +232,7 @@ func updateAvatar(w http.ResponseWriter, r *http.Request) { render.JSON(w, error503.StatusCode, error503) return } - rerr := store.Avatar().Update(&avatar, data.Avatar, db) + rerr := store.Avatar().Update(&avatar, Avatar, db) if err != nil { render.JSON(w, rerr.StatusCode, rerr) return diff --git a/api/emojis_route.go b/api/emojis_route.go index 6026680..d5e5ed9 100644 --- a/api/emojis_route.go +++ b/api/emojis_route.go @@ -177,8 +177,11 @@ func getAllEmoji(w http.ResponseWriter, r *http.Request) { func getEmojiFromName(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } name := r.Context().Value(emojiNameKey).(string) emoji := store.Emoji().GetByName(name, db) render.JSON(w, 200, emoji) @@ -186,8 +189,11 @@ func getEmojiFromName(w http.ResponseWriter, r *http.Request) { func getEmojiFromShortcut(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } link := r.Context().Value(emojiShortcutKey).(string) emoji := store.Emoji().GetByShortcut(link, db) render.JSON(w, 200, emoji) @@ -195,8 +201,11 @@ func getEmojiFromShortcut(w http.ResponseWriter, r *http.Request) { func getEmojiFromLink(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } link := r.Context().Value(emojiLinkKey).(string) emoji := store.Emoji().GetByLink(link, db) render.JSON(w, 200, emoji) @@ -220,18 +229,19 @@ func newEmoji(w http.ResponseWriter, r *http.Request) { err := chiRender.Bind(request, &data) if err != nil || data.Emoji == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Emoji().Save(data.Emoji, db) - if err == nil { - render.JSON(w, 201, data.Emoji) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return } + apperr := store.Emoji().Save(data.Emoji, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 201, data.Emoji) } func updateEmoji(w http.ResponseWriter, r *http.Request) { @@ -253,18 +263,17 @@ func updateEmoji(w http.ResponseWriter, r *http.Request) { emoji := r.Context().Value(oldEmojiKey).(models.Emoji) if err != nil || data.Emoji == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Emoji().Update(&emoji, data.Emoji, db) - if err == nil { - render.JSON(w, 200, emoji) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Emoji().Update(&emoji, data.Emoji, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 200, emoji) } func deleteEmoji(w http.ResponseWriter, r *http.Request) { @@ -281,18 +290,18 @@ func deleteEmoji(w http.ResponseWriter, r *http.Request) { Object: emoji, } db := dbStore.db - if err := db.DB().Ping(); err == nil { - err := store.Emoji().Delete(&emoji, db) - if err == nil { - message.Success = true - message.Message = "Emoji well removed." - render.JSON(w, 200, message) - } else { - message.Success = false - message.Message = err.Message - render.JSON(w, err.StatusCode, message.Message) - } - } else { - render.JSON(w, 503, error503) + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Emoji().Delete(&emoji, db) + if apperr != nil { + message.Success = false + message.Message = apperr.Message + render.JSON(w, apperr.StatusCode, message.Message) + return } + message.Success = true + message.Message = "Emoji well removed." + render.JSON(w, 200, message) } diff --git a/api/folder_route.go b/api/folder_route.go index aaf42b8..259556a 100644 --- a/api/folder_route.go +++ b/api/folder_route.go @@ -177,20 +177,22 @@ func folderContext(next http.Handler) http.Handler { func getAllFolder(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db - if err := db.DB().Ping(); err == nil { - result := store.Folder().GetAll(db) - render.JSON(w, 200, result) - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return } + result := store.Folder().GetAll(db) + render.JSON(w, 200, result) } func getFolderFromName(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } name := r.Context().Value(folderNameKey).(string) folder := store.Folder().GetByName(name, db) render.JSON(w, 200, folder) @@ -198,8 +200,11 @@ func getFolderFromName(w http.ResponseWriter, r *http.Request) { func getFolderFromType(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } folderType := r.Context().Value(folderTypeKey).(string) folder := store.Folder().GetByType(folderType, db) render.JSON(w, 200, folder) @@ -207,8 +212,11 @@ func getFolderFromType(w http.ResponseWriter, r *http.Request) { func getFolderFromLink(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } link := r.Context().Value(folderLinkKey).(string) folder := store.Folder().GetByLink(link, db) render.JSON(w, 200, folder) @@ -220,20 +228,19 @@ func getFolderFromMessage(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - folders := store.Folder().GetByMessage(data.Message, db) - render.JSON(w, 200, folders) - } else { - render.JSON(w, error503.StatusCode, error503) - } + return } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + folders := store.Folder().GetByMessage(data.Message, db) + render.JSON(w, 200, folders) } func newFolder(w http.ResponseWriter, r *http.Request) { @@ -242,24 +249,21 @@ func newFolder(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Folder == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Folder().Save(data.Folder, db) - if err == nil { - render.JSON(w, 201, data.Folder) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Folder().Save(data.Folder, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + } + render.JSON(w, 201, data.Folder) } func updateFolder(w http.ResponseWriter, r *http.Request) { @@ -268,47 +272,43 @@ func updateFolder(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) folder := r.Context().Value(oldFolderKey).(models.Folder) if err != nil || data.Folder == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Folder().Update(&folder, data.Folder, db) - if err == nil { - render.JSON(w, 200, folder) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return } + apperr := store.Folder().Update(&folder, data.Folder, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + } + render.JSON(w, 200, folder) } func deleteFolder(w http.ResponseWriter, r *http.Request) { folder := r.Context().Value("folder").(models.Folder) store := datastores.Store() - message := deleteMessageModel{ Object: folder, } db := dbStore.db - if err := db.DB().Ping(); err == nil { - err := store.Folder().Delete(&folder, db) - if err == nil { - message.Success = true - message.Message = "Folder well removed." - render.JSON(w, 200, message) - } else { - message.Success = false - message.Message = err.Message - render.JSON(w, err.StatusCode, message.Message) - } - } else { - render.JSON(w, 503, error503) + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Folder().Delete(&folder, db) + if apperr != nil { + message.Success = false + message.Message = apperr.Message + render.JSON(w, apperr.StatusCode, message.Message) } + message.Success = true + message.Message = "Folder well removed." + render.JSON(w, 200, message) } diff --git a/api/member_route.go b/api/member_route.go index d4efb6c..f386df8 100644 --- a/api/member_route.go +++ b/api/member_route.go @@ -5,10 +5,12 @@ import ( "net/http" "strconv" + jwt "github.com/dgrijalva/jwt-go" "github.com/pressly/chi" chiRender "github.com/pressly/chi/render" "github.com/titouanfreville/popcubeapi/datastores" "github.com/titouanfreville/popcubeapi/models" + "github.com/titouanfreville/popcubeapi/utils" ) const ( @@ -101,42 +103,45 @@ func initMemberRoute(router chi.Router) { // 503: databaseError // default: genericError r.Post("/new", newMember) - r.Route("/:memberID", func(r chi.Router) { - r.Use(memberContext) - // swagger:route PUT /member/{memberID} Members updateMember - // - // Update member - // - // This will return the new member object - // - // Responses: - // 200: memberObjectSuccess - // 422: wrongEntity - // 503: databaseError - // default: genericError - r.Put("/update", updateMember) - // swagger:route PUT /member/{memberID} Members deleteMember - // - // Update member - // - // This will return the new member object - // - // Responses: - // 200: memberObjectSuccess - // 422: wrongEntity - // 503: databaseError - // default: genericError - r.Delete("/delete", deleteMember) - }) + }) + router.Route("/channel/{channelID}/user/{userID}", func(r chi.Router) { + r.Use(tokenAuth.Verifier) + r.Use(Authenticator) + r.Use(memberContext) + // swagger:route PUT /channel/{channelID}/user/{userID} Members updateMember + // + // Update member + // + // This will return the new member object + // + // Responses: + // 200: memberObjectSuccess + // 422: wrongEntity + // 503: databaseError + // default: genericError + r.Put("/update", updateMember) + // swagger:route DELETE /channel/{channelID}/user/{userID} Members deleteMember + // + // Delete member + // + // This will return the new member object + // + // Responses: + // 200: memberObjectSuccess + // 422: wrongEntity + // 503: databaseError + // default: genericError + r.Delete("/delete", deleteMember) }) } func memberContext(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - memberID, err := strconv.ParseUint(chi.URLParam(r, "memberID"), 10, 64) + channelID, err := strconv.ParseUint(chi.URLParam(r, "channelID"), 10, 64) + userID, err := strconv.ParseUint(chi.URLParam(r, "userID"), 10, 64) oldMember := models.Member{} if err == nil { - oldMember = datastores.Store().Member().GetByID(memberID, dbStore.db) + oldMember = datastores.Store().Member().GetByID(channelID, userID, dbStore.db) } ctx := context.WithValue(r.Context(), oldMemberKey, oldMember) next.ServeHTTP(w, r.WithContext(ctx)) @@ -145,14 +150,13 @@ func memberContext(next http.Handler) http.Handler { func getAllMember(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db - if err := db.DB().Ping(); err == nil { - result := store.Member().GetAll(db) - render.JSON(w, 200, result) - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return } + result := store.Member().GetAll(db) + render.JSON(w, 200, result) } func getMemberFromUser(w http.ResponseWriter, r *http.Request) { @@ -161,20 +165,19 @@ func getMemberFromUser(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.User == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - role := store.Member().GetByUser(data.User, db) - render.JSON(w, 200, role) - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return } + role := store.Member().GetByUser(data.User, db) + render.JSON(w, 200, role) } func getMemberFromChannel(w http.ResponseWriter, r *http.Request) { @@ -183,20 +186,19 @@ func getMemberFromChannel(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Channel == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - role := store.Member().GetByChannel(data.Channel, db) - render.JSON(w, 200, role) - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return } + role := store.Member().GetByChannel(data.Channel, db) + render.JSON(w, 200, role) } func getMemberFromRole(w http.ResponseWriter, r *http.Request) { @@ -205,20 +207,19 @@ func getMemberFromRole(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Role == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - role := store.Member().GetByRole(data.Role, db) - render.JSON(w, 200, role) - } else { - render.JSON(w, error503.StatusCode, error503) - } + return } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + role := store.Member().GetByRole(data.Role, db) + render.JSON(w, 200, role) } func newMember(w http.ResponseWriter, r *http.Request) { @@ -227,24 +228,37 @@ func newMember(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Member == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Member().Save(data.Member, db) - if err == nil { - render.JSON(w, 201, data.Member) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + token := r.Context().Value(jwtTokenKey).(*jwt.Token) + chanel := store.Channel().GetByID(data.Member.IDChannel, db) + if &chanel == nil { + message := "You are trying to invite member to chanel : " + chanel.ChannelName + " but channel doesn't exist." + apierr := utils.NewAPIError(404, "Channel don't exist", message) + render.JSON(w, apierr.StatusCode, apierr) + return + } + if !canManageUser(chanel.ChannelName, false, "", token) { + res := error401 + res.Message = "You don't have the right to manage user from channel : " + chanel.ChannelName + "." + render.JSON(w, error401.StatusCode, error401) + return + } + apperr := store.Member().Save(data.Member, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 201, data.Member) } func updateMember(w http.ResponseWriter, r *http.Request) { @@ -253,47 +267,84 @@ func updateMember(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) member := r.Context().Value(oldMemberKey).(models.Member) if err != nil || data.Member == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Member().Update(&member, data.Member, db) - if err == nil { - render.JSON(w, 200, member) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + token := r.Context().Value(jwtTokenKey).(*jwt.Token) + chanel := store.Channel().GetByID(member.IDChannel, db) + user := store.User().GetByID(member.IDUser, db) + rename := store.User().GetByID(data.Member.IDUser, db) + if &chanel == nil { + message := "You are trying to update member from chanel : " + chanel.ChannelName + " but this channel doesn't exist." + apierr := utils.NewAPIError(404, "Channel don't exist", message) + render.JSON(w, apierr.StatusCode, apierr) + return + } + if &user == nil { + message := "You are trying to update member : " + user.Username + "from channel :" + chanel.ChannelName + " but this user doesn't exist." + apierr := utils.NewAPIError(404, "Channel don't exist", message) + render.JSON(w, apierr.StatusCode, apierr) + return + } + if &rename == nil { + rename = models.User{Username: ""} + } + if !canManageUser(chanel.ChannelName, user.Username == rename.Username, user.Username, token) { + res := error401 + res.Message = "You don't have the right to manage user from channel : " + chanel.ChannelName + "." + render.JSON(w, error401.StatusCode, error401) + return + } + apperr := store.Member().Update(&member, data.Member, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 200, member) } func deleteMember(w http.ResponseWriter, r *http.Request) { member := r.Context().Value(oldMemberKey).(models.Member) store := datastores.Store() - message := deleteMessageModel{ Object: member, } db := dbStore.db - if err := db.DB().Ping(); err == nil { - err := store.Member().Delete(&member, db) - if err == nil { - message.Success = true - message.Message = "Member well removed." - render.JSON(w, 200, message) - } else { - message.Success = false - message.Message = err.Message - render.JSON(w, err.StatusCode, message.Message) - } - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return + } + token := r.Context().Value(jwtTokenKey).(*jwt.Token) + chanel := store.Channel().GetByID(member.IDChannel, db) + if &chanel == nil { + message := "You are trying to remove member from chanel : " + chanel.ChannelName + " but channel doesn't exist." + apierr := utils.NewAPIError(404, "Channel doesn't exist", message) + render.JSON(w, apierr.StatusCode, apierr) + return + } + if !canManageUser(chanel.ChannelName, false, "", token) { + res := error401 + res.Message = "You don't have the right to manage user from channel : " + chanel.ChannelName + "." + render.JSON(w, error401.StatusCode, error401) + return + } + apperr := store.Member().Delete(&member, db) + if apperr != nil { + message.Success = false + message.Message = apperr.Message + render.JSON(w, apperr.StatusCode, message.Message) + return } + message.Success = true + message.Message = "Member well removed." + render.JSON(w, 200, message) } diff --git a/api/message_route.go b/api/message_route.go index 5315cf3..5781375 100644 --- a/api/message_route.go +++ b/api/message_route.go @@ -152,20 +152,22 @@ func messageContext(next http.Handler) http.Handler { func getAllMessage(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db - if err := db.DB().Ping(); err == nil { - result := store.Message().GetAll(db) - render.JSON(w, 200, result) - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return } + result := store.Message().GetAll(db) + render.JSON(w, 200, result) } func getMessageFromDate(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } date := r.Context().Value(messageDateKey).(int) message := store.Message().GetByDate(date, db) render.JSON(w, 200, message) @@ -177,20 +179,19 @@ func getMessageFromUser(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.User == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - role := store.Message().GetByCreator(data.User, db) - render.JSON(w, 200, role) - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return } + role := store.Message().GetByCreator(data.User, db) + render.JSON(w, 200, role) } func getMessageFromChannel(w http.ResponseWriter, r *http.Request) { @@ -199,20 +200,19 @@ func getMessageFromChannel(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Channel == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - role := store.Message().GetByChannel(data.Channel, db) - render.JSON(w, 200, role) - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return } + role := store.Message().GetByChannel(data.Channel, db) + render.JSON(w, 200, role) } func newMessage(w http.ResponseWriter, r *http.Request) { @@ -221,24 +221,23 @@ func newMessage(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Message == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Message().Save(data.Message, db) - if err == nil { - render.JSON(w, 201, data.Message) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Message().Save(data.Message, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 201, data.Message) } func updateMessage(w http.ResponseWriter, r *http.Request) { @@ -247,47 +246,45 @@ func updateMessage(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) message := r.Context().Value(oldMessageKey).(models.Message) if err != nil || data.Message == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Message().Update(&message, data.Message, db) - if err == nil { - render.JSON(w, 200, message) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Message().Update(&message, data.Message, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return } + render.JSON(w, 200, message) } func deleteMessageFunction(w http.ResponseWriter, r *http.Request) { message := r.Context().Value(oldMessageKey).(models.Message) store := datastores.Store() - dmessage := deleteMessageModel{ Object: message, } db := dbStore.db - if err := db.DB().Ping(); err == nil { - err := store.Message().Delete(&message, db) - if err == nil { - dmessage.Success = true - dmessage.Message = "Message well removed." - render.JSON(w, 200, message) - } else { - dmessage.Success = false - dmessage.Message = err.Message - render.JSON(w, err.StatusCode, dmessage.Message) - } - } else { - render.JSON(w, 503, error503) + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Message().Delete(&message, db) + if apperr != nil { + dmessage.Success = false + dmessage.Message = apperr.Message + render.JSON(w, apperr.StatusCode, dmessage.Message) + return } + dmessage.Success = true + dmessage.Message = "Message well removed." + render.JSON(w, 200, message) } diff --git a/api/organisation_route.go b/api/organisation_route.go index 0a9c7f1..6a0e8d1 100644 --- a/api/organisation_route.go +++ b/api/organisation_route.go @@ -107,12 +107,12 @@ func organisationContext(next http.Handler) http.Handler { func getAllOrganisation(w http.ResponseWriter, r *http.Request) { store := datastores.Store() db := dbStore.db - if err := db.DB().Ping(); err == nil { - result := store.Organisation().Get(db) - render.JSON(w, 200, result) - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return } + result := store.Organisation().Get(db) + render.JSON(w, 200, result) } func newOrganisation(w http.ResponseWriter, r *http.Request) { @@ -133,18 +133,18 @@ func newOrganisation(w http.ResponseWriter, r *http.Request) { err := chiRender.Bind(request, &data) if err != nil || data.Organisation == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Organisation().Save(data.Organisation, db) - if err == nil { - render.JSON(w, 201, data.Organisation) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Organisation().Save(data.Organisation, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return } + render.JSON(w, 201, data.Organisation) } func updateOrganisation(w http.ResponseWriter, r *http.Request) { @@ -166,16 +166,15 @@ func updateOrganisation(w http.ResponseWriter, r *http.Request) { organisation := r.Context().Value(oldOrganisationKey).(models.Organisation) if err != nil || data.Organisation == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Organisation().Update(&organisation, data.Organisation, db) - if err == nil { - render.JSON(w, 200, organisation) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Organisation().Update(&organisation, data.Organisation, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 200, organisation) } diff --git a/api/parameter_route.go b/api/parameter_route.go index 116553d..e92ecf8 100644 --- a/api/parameter_route.go +++ b/api/parameter_route.go @@ -98,14 +98,13 @@ func parameterContext(next http.Handler) http.Handler { func getAllParameter(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db - if err := db.DB().Ping(); err == nil { - result := store.Parameter().Get(db) - render.JSON(w, 200, result) - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return } + result := store.Parameter().Get(db) + render.JSON(w, 200, result) } func newParameter(w http.ResponseWriter, r *http.Request) { @@ -125,19 +124,19 @@ func newParameter(w http.ResponseWriter, r *http.Request) { request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Parameter == nil { - render.JSON(w, 500, err) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Parameter().Save(data.Parameter, db) - if err == nil { - render.JSON(w, 200, data.Parameter) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + render.JSON(w, error422.StatusCode, error422) + return } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Parameter().Save(data.Parameter, db) + if err != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 200, data.Parameter) } func updateParameter(w http.ResponseWriter, r *http.Request) { @@ -159,16 +158,16 @@ func updateParameter(w http.ResponseWriter, r *http.Request) { parameter := r.Context().Value(oldParameterKey).(models.Parameter) if err != nil || data.Parameter == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Parameter().Update(¶meter, data.Parameter, db) - if err == nil { - render.JSON(w, 200, parameter) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Parameter().Update(¶meter, data.Parameter, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return } + render.JSON(w, 200, parameter) } diff --git a/api/role_route.go b/api/role_route.go index 025469a..9ed1a57 100644 --- a/api/role_route.go +++ b/api/role_route.go @@ -138,20 +138,23 @@ func roleContext(next http.Handler) http.Handler { func getAllRole(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db - if err := db.DB().Ping(); err == nil { - result := store.Role().GetAll(db) - render.JSON(w, 200, result) - } else { + if err := db.DB().Ping(); err != nil { render.JSON(w, error503.StatusCode, error503) + return } + result := store.Role().GetAll(db) + render.JSON(w, 200, result) + } func getRoleFromName(w http.ResponseWriter, r *http.Request) { store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } name := r.Context().Value(roleNameKey).(string) role := store.Role().GetByName(name, db) render.JSON(w, 200, role) @@ -163,8 +166,11 @@ func getRoleFromRight(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Role == nil { @@ -185,24 +191,23 @@ func newRole(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) if err != nil || data.Role == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Role().Save(data.Role, db) - if err == nil { - render.JSON(w, 201, data.Role) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Role().Save(data.Role, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return } + render.JSON(w, 201, data.Role) } func updateRole(w http.ResponseWriter, r *http.Request) { @@ -211,47 +216,45 @@ func updateRole(w http.ResponseWriter, r *http.Request) { OmitID interface{} `json:"id,omitempty"` } store := datastores.Store() - db := dbStore.db request := r.Body err := chiRender.Bind(request, &data) role := r.Context().Value(oldRoleKey).(models.Role) if err != nil || data.Role == nil { render.JSON(w, error422.StatusCode, error422) - } else { - if err := db.DB().Ping(); err == nil { - err := store.Role().Update(&role, data.Role, db) - if err == nil { - render.JSON(w, 200, role) - } else { - render.JSON(w, err.StatusCode, err) - } - } else { - render.JSON(w, error503.StatusCode, error503) - } + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.Role().Update(&role, data.Role, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return } + render.JSON(w, 200, role) } func deleteRole(w http.ResponseWriter, r *http.Request) { role := r.Context().Value(oldRoleKey).(models.Role) store := datastores.Store() - message := deleteMessageModel{ Object: role, } db := dbStore.db - if err := db.DB().Ping(); err == nil { - err := store.Role().Delete(&role, db) - if err == nil { - message.Success = true - message.Message = "Role well removed." - render.JSON(w, 200, message) - } else { - message.Success = false - message.Message = err.Message - render.JSON(w, err.StatusCode, message.Message) - } - } else { - render.JSON(w, 503, error503) + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + err := store.Role().Delete(&role, db) + if err != nil { + message.Success = false + message.Message = err.Message + render.JSON(w, err.StatusCode, message.Message) + return } + message.Success = true + message.Message = "Role well removed." + render.JSON(w, 200, message) } diff --git a/api/user_parameter_route.go b/api/user_parameter_route.go new file mode 100644 index 0000000..588d71b --- /dev/null +++ b/api/user_parameter_route.go @@ -0,0 +1,253 @@ +package api + +import ( + "context" + "net/http" + + jwt "github.com/dgrijalva/jwt-go" + "github.com/pressly/chi" + chiRender "github.com/pressly/chi/render" + "github.com/titouanfreville/popcubeapi/datastores" + "github.com/titouanfreville/popcubeapi/models" +) + +const ( + oldUserParameterKey key = "oldUserParameter" + userParameterUser key = "userParameterUser" +) + +func initUserParameterRoute(router chi.Router) { + router.Route("/user/{userName}/parameters", func(r chi.Router) { + r.Use(tokenAuth.Verifier) + r.Use(userParameterAuthenticator) + // swagger:route GET /user/{userName}/parameters UserParameter getAllUserParameter + // + // Get user parameters + // + // This will get all the user parameters available in the organisation. + // + // Responses: + // 200: userParameterArraySuccess + // 503: databaseError + // default: genericError + r.Get("/", getAllUserParameter) + // swagger:route POST /user/{userName}/parameters UserParameter newUserParameter + // + // New userparameter + // + // This will create an userparameter for organisation userparameters library. + // + // Responses: + // 201: userparameterObjectSuccess + // 422: wrongEntity + // 503: databaseError + // default: genericError + r.Post("/", newUserParameter) + // swagger:route GET /user/{userName}/parameters/all UserParameter getAllUserParameter1 + // + // Get userparameters + // + // This will get all the userparameters available in the organisation. + // + // Responses: + // 200: userparameterArraySuccess + // 503: databaseError + // default: genericError + r.Get("/all", getAllUserParameter) + // swagger:route POST /user/{userName}/parameters/new UserParameter newUserParameter1 + // + // New userparameter + // + // This will create an userparameter for organisation userparameters library. + // + // Responses: + // 201: userparameterObjectSuccess + // 422: wrongEntity + // 503: databaseError + // default: genericError + r.Post("/new", newUserParameter) + r.Route("/{parameterName}", func(r chi.Router) { + r.Use(tokenAuth.Verifier) + r.Use(userParameterAuthenticator) + r.Use(userparameterContext) + // swagger:route PUT /user/{userName}/parameters/{parameterName} UserParameter updateUserParameter + // + // Update userparameter + // + // This will return the new userparameter object + // + // Responses: + // 200: userparameterObjectSuccess + // 422: wrongEntity + // 503: databaseError + // default: genericError + r.Put("/update", updateUserParameter) + // swagger:route DELETE /user/{userName}/parameters/{parameterName} UserParameter deleteUserParameter + // + // Delete userparameter + // + // This will return the new userparameter object + // + // Responses: + // 200: userparameterObjectSuccess + // 422: wrongEntity + // 503: databaseError + // default: genericError + r.Delete("/delete", deleteUserParameter) + }) + }) +} + +func userParameterAuthenticator(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + if jwtErr, ok := ctx.Value(jwtErrorKey).(error); ok { + if jwtErr != nil { + render.JSON(w, 401, jwtErr) + return + } + } + + jwtToken, ok := ctx.Value(jwtTokenKey).(*jwt.Token) + if !ok || jwtToken == nil || !jwtToken.Valid { + render.JSON(w, 401, "token is not valid or does not exist") + return + } + + tokenType, ok := jwtToken.Claims.(jwt.MapClaims)["type"] + + if !ok { + render.JSON(w, 401, "Token is not valid. Type is undifined") + return + } + + if tokenType != "userauth" { + render.JSON(w, 401, "Token is not an user auth one") + return + } + + tokenUser, ok := jwtToken.Claims.(jwt.MapClaims)["name"].(string) + tokenEmail, ok2 := jwtToken.Claims.(jwt.MapClaims)["email"].(string) + userFromMail := "-*-" + if !ok && !ok2 { + render.JSON(w, 401, "Token is not valid. User is undifined") + return + } + store := datastores.Store() + db := dbStore.db + userName := chi.URLParam(r, "userName") + if ok2 { + userFromMail = store.User().GetByEmail(tokenEmail, db).Username + } + if userName == "" || userName != tokenUser || userName != userFromMail { + render.JSON(w, 401, "You are not correctly identified.") + return + } + // Token is authenticated, pass it through + next.ServeHTTP(w, r) + }) +} + +func userparameterContext(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + userName := chi.URLParam(r, "userName") + parameterName := chi.URLParam(r, "parameterName") + oldUserParameter := models.UserParameter{} + store := datastores.Store() + db := dbStore.db + user := store.User().GetByUserName(userName, db) + if &user != nil { + oldUserParameter = store.UserParameter().GetByID(user.IDUser, parameterName, db) + } + ctx := context.WithValue(r.Context(), oldUserParameterKey, oldUserParameter) + ctx = context.WithValue(ctx, userParameterUser, user) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} + +func getAllUserParameter(w http.ResponseWriter, r *http.Request) { + store := datastores.Store() + db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + user := r.Context().Value(userParameterUser).(models.User) + result := store.UserParameter().GetByUser(&user, db) + render.JSON(w, 200, result) +} + +func newUserParameter(w http.ResponseWriter, r *http.Request) { + var data struct { + UserParameter *models.UserParameter + OmitID interface{} `json:"id,omitempty"` + } + store := datastores.Store() + db := dbStore.db + request := r.Body + err := chiRender.Bind(request, &data) + if err != nil || data.UserParameter == nil { + render.JSON(w, error422.StatusCode, error422) + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.UserParameter().Save(data.UserParameter, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 201, data.UserParameter) +} + +func updateUserParameter(w http.ResponseWriter, r *http.Request) { + var data struct { + UserParameter *models.UserParameter + OmitID interface{} `json:"id,omitempty"` + } + store := datastores.Store() + db := dbStore.db + request := r.Body + err := chiRender.Bind(request, &data) + userparameter := r.Context().Value(oldUserParameterKey).(models.UserParameter) + if err != nil || data.UserParameter == nil { + render.JSON(w, error422.StatusCode, error422) + return + } + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.UserParameter().Update(&userparameter, data.UserParameter, db) + if apperr != nil { + render.JSON(w, apperr.StatusCode, apperr) + return + } + render.JSON(w, 200, userparameter) +} + +func deleteUserParameter(w http.ResponseWriter, r *http.Request) { + userparameter := r.Context().Value(oldUserParameterKey).(models.UserParameter) + store := datastores.Store() + message := deleteMessageModel{ + Object: userparameter, + } + db := dbStore.db + if err := db.DB().Ping(); err != nil { + render.JSON(w, error503.StatusCode, error503) + return + } + apperr := store.UserParameter().Delete(&userparameter, db) + if apperr != nil { + message.Success = false + message.Message = apperr.Message + render.JSON(w, apperr.StatusCode, message.Message) + return + } + message.Success = true + message.Message = "UserParameter well removed." + render.JSON(w, 200, message) +} diff --git a/api/user_route.go b/api/user_route.go index 8eb062f..e239963 100644 --- a/api/user_route.go +++ b/api/user_route.go @@ -204,15 +204,15 @@ func initUserRoute(router chi.Router) { r.Put("/update", updateUser) // swagger:route PUT /user/{userID} Users deleteUser // - // Update user + // Delete user // - // This will return the new user object + // This will return a delete specific mesage // // Responses: - // 200: userObjectSuccess + // 200: deleteMessage // 422: wrongEntity // 503: databaseError - // default: genericError + // default: deleteMessage r.Delete("/delete", deleteUser) }) }) diff --git a/datastores/data_store.go b/datastores/data_store.go index c8884c0..a59008d 100644 --- a/datastores/data_store.go +++ b/datastores/data_store.go @@ -193,7 +193,7 @@ type FolderStore interface { type MemberStore interface { Save(member *models.Member, db *gorm.DB) *u.AppError Update(member *models.Member, newMember *models.Member, db *gorm.DB) *u.AppError - GetByID(ID uint64, db *gorm.DB) models.Member + GetByID(channelID uint64, userID uint64, db *gorm.DB) models.Member GetChannelMember(user *models.User, channel *models.Channel, db *gorm.DB) models.Member GetByUser(user *models.User, db *gorm.DB) []models.Member GetByChannel(channel *models.Channel, db *gorm.DB) []models.Member @@ -281,5 +281,5 @@ type UserParameterStore interface { GetAll(db *gorm.DB) []models.UserParameter GetByUser(user *models.User, db *gorm.DB) []models.UserParameter GetByName(parameterName string, db *gorm.DB) []models.UserParameter - GetByID(id uint64, db *gorm.DB) models.UserParameter + GetByID(userID uint64, parameterName string, db *gorm.DB) models.UserParameter } diff --git a/datastores/members_store.go b/datastores/members_store.go index 7f28de3..2ea1c2a 100644 --- a/datastores/members_store.go +++ b/datastores/members_store.go @@ -60,9 +60,9 @@ func (msi MemberStoreImpl) GetAll(db *gorm.DB) []models.Member { } // GetByID Used to get member from DB -func (msi MemberStoreImpl) GetByID(ID uint64, db *gorm.DB) models.Member { +func (msi MemberStoreImpl) GetByID(channelID uint64, userID uint64, db *gorm.DB) models.Member { member := models.Member{} - db.Where("idMember = ?", ID).First(&member) + db.Where("idChannel = ? AND idUser = ?", channelID, userID).First(&member) return member } diff --git a/datastores/user_parameter_store.go b/datastores/user_parameter_store.go index 787aadb..a61e294 100644 --- a/datastores/user_parameter_store.go +++ b/datastores/user_parameter_store.go @@ -90,8 +90,8 @@ func (psi UserParameterStoreImpl) GetByName(parameterName string, db *gorm.DB) [ } // GetByID Used to get userParameter from DB -func (psi UserParameterStoreImpl) GetByID(ID uint64, db *gorm.DB) models.UserParameter { +func (psi UserParameterStoreImpl) GetByID(userID uint64, parameterName string, db *gorm.DB) models.UserParameter { userParameter := models.UserParameter{} - db.Where("idUserParameter = ?", ID).First(&userParameter) + db.Where("idUser = ? AND parameterName= ?", userID, parameterName).First(&userParameter) return userParameter } diff --git a/docker/gobase.Dockerfile b/docker/gobase.Dockerfile index 1fd905f..cc32155 100644 --- a/docker/gobase.Dockerfile +++ b/docker/gobase.Dockerfile @@ -6,6 +6,7 @@ ENV TERM xterm-256color ENV GOCOPYPATH go/src/github.com/titouanfreville/popcubeapi ENV GOSU_VERSION 1.9 ENV ENVTYPE container +ENV WATCHING 1 COPY api /$GOCOPYPATH/api COPY models /$GOCOPYPATH/models @@ -14,6 +15,7 @@ COPY datastores /$GOCOPYPATH/datastores COPY configs /$GOCOPYPATH/configs COPY main.go /$GOCOPYPATH/main.go COPY scripts/wait-for-it.sh /bin/waitforit +COPY scripts/dev_api_build.sh /bin/buildapi RUN apk add --update git bash && \ cd /go/ && \ @@ -45,4 +47,4 @@ WORKDIR /$GOCOPYPATH EXPOSE 3000 -ENTRYPOINT waitforit database:3306 -t 0 -- echo "Db is ready" && go install && popcubeapi +ENTRYPOINT waitforit database:3306 -t 0 -- echo "Db is ready" && go install && popcubeapi \ No newline at end of file diff --git a/docker/gotest.Dockerfile b/docker/gotest.Dockerfile index 57aea30..d115b79 100644 --- a/docker/gotest.Dockerfile +++ b/docker/gotest.Dockerfile @@ -8,6 +8,7 @@ ENV GOCOPYPATH go/src/github.com/titouanfreville/popcubeapi ENV GOSU_VERSION 1.9 COPY scripts/wait-for-it.sh /bin/waitforit +COPY scripts/go_test_entrypoint.sh /bin/entrypoint WORKDIR /go/src @@ -27,5 +28,4 @@ RUN set -x \ && gosu nobody true \ && apk del .gosu-deps -# waitforit database:3306 -t 0 -- echo "Db is ready" && -ENTRYPOINT entrypoint /$GOCOPYPATH $WATCHING +ENTRYPOINT waitforit database:3306 -t 0 -- echo "Db is ready" && entrypoint /$GOCOPYPATH $WATCHING diff --git a/scripts/dev_api_build.sh b/scripts/dev_api_build.sh index cc1f786..e57f255 100755 --- a/scripts/dev_api_build.sh +++ b/scripts/dev_api_build.sh @@ -1 +1,53 @@ -#!/bin/bash \ No newline at end of file +#!/bin/bash +watcher () { +# script: watch +# author: Mike Smullin +# license: GPLv3 +# description: +# watches the given path for changes +# and executes a given command when changes occur +# usage: +# watch +# + path=$1 + shift + cmd=$* + sha=0 + update_sha() { + sha=$(ls -lR "$path" | sha1sum) + } + update_sha + previous_sha=$sha + build() { + echo -en " building...\n\n" + $cmd + echo -en "\n--> resumed watching." + } + compare() { + update_sha + if [[ $sha != $previous_sha ]] ; then + echo -n "change detected," + build + previous_sha=$sha + else + echo -n . + fi + } + trap build SIGINT + trap exit SIGQUIT + + echo -e "--> Press Ctrl+C to force build, Ctrl+\\ to exit." + echo -en "--> watching \"$path\"." + while true; do + compare + sleep 1 + done +} + +CMD=go install && popcubeapi +watching=${2:-0} +$CMD +if [ "$watching" -eq 0 ] +then + watcher $1 "$CMD" +fi \ No newline at end of file diff --git a/utils/go_test_entrypoint.sh b/scripts/go_test_entrypoint.sh similarity index 100% rename from utils/go_test_entrypoint.sh rename to scripts/go_test_entrypoint.sh diff --git a/swagger.yaml b/swagger.yaml index a5f51e2..f6a35ec 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -73,12 +73,19 @@ paths: operationId: "newAvatar" parameters: - in: "body" - name: "avatar" - description: "Link of the avatar in server." - required: false + name: "name" + description: "Avatar name" + required: true schema: - $ref: "#/definitions/Avatar" - x-go-name: "Avatar" + type: "string" + x-go-name: "Name" + - in: "body" + name: "link" + description: "Path into server" + required: true + schema: + type: "string" + x-go-name: "Link" - name: "token" in: "header" description: "User token you got from login call. Pass it as Authentication:\ @@ -215,12 +222,19 @@ paths: operationId: "newAvatar1" parameters: - in: "body" - name: "avatar" - description: "Link of the avatar in server." - required: false + name: "name" + description: "Avatar name" + required: true schema: - $ref: "#/definitions/Avatar" - x-go-name: "Avatar" + type: "string" + x-go-name: "Name" + - in: "body" + name: "link" + description: "Path into server" + required: true + schema: + type: "string" + x-go-name: "Link" - name: "token" in: "header" description: "User token you got from login call. Pass it as Authentication:\ @@ -649,6 +663,80 @@ paths: description: "genericError general error when unexpected errors occured" schema: $ref: "#/definitions/genericErrorModel" + /channel/{channelID}/user/{userID}: + put: + tags: + - "Members" + summary: "Update member" + description: "This will return the new member object" + operationId: "updateMember" + parameters: + - name: "memberID" + in: "path" + description: "Link of the member in server." + required: true + type: "integer" + format: "int64" + x-go-name: "MemberID" + - name: "token" + in: "header" + description: "User token you got from login call. Pass it as Authentication:\ + \ bearer {{token}} in the header" + required: true + type: "string" + x-go-name: "Token" + responses: + 200: + description: "memberObjectSuccess list of members" + schema: + $ref: "#/definitions/Member" + 422: + description: "wrongEntityError is an error object to inform that the provided\ + \ object was not correctly formated" + schema: + $ref: "#/definitions/genericErrorModel" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" + delete: + tags: + - "Members" + summary: "Delete member" + description: "This will return the new member object" + operationId: "deleteMember" + parameters: + - name: "token" + in: "header" + description: "User token you got from login call. Pass it as Authentication:\ + \ bearer {{token}} in the header" + required: true + type: "string" + x-go-name: "Token" + responses: + 200: + description: "memberObjectSuccess list of members" + schema: + $ref: "#/definitions/Member" + 422: + description: "wrongEntityError is an error object to inform that the provided\ + \ object was not correctly formated" + schema: + $ref: "#/definitions/genericErrorModel" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" /emoji: get: tags: @@ -1517,40 +1605,6 @@ paths: description: "genericError general error when unexpected errors occured" schema: $ref: "#/definitions/genericErrorModel" - /member/{memberID}: - put: - tags: - - "Members" - summary: "Update member" - description: "This will return the new member object" - operationId: "deleteMember" - parameters: - - name: "token" - in: "header" - description: "User token you got from login call. Pass it as Authentication:\ - \ bearer {{token}} in the header" - required: true - type: "string" - x-go-name: "Token" - responses: - 200: - description: "memberObjectSuccess list of members" - schema: - $ref: "#/definitions/Member" - 422: - description: "wrongEntityError is an error object to inform that the provided\ - \ object was not correctly formated" - schema: - $ref: "#/definitions/genericErrorModel" - 503: - description: "databaseError is an error object to tell what is happening\ - \ when we encounter issue with database" - schema: - $ref: "#/definitions/genericErrorModel" - default: - description: "genericError general error when unexpected errors occured" - schema: - $ref: "#/definitions/genericErrorModel" /message: get: tags: @@ -2901,8 +2955,8 @@ paths: put: tags: - "Users" - summary: "Update user" - description: "This will return the new user object" + summary: "Delete user" + description: "This will return a delete specific mesage" operationId: "deleteUser" parameters: - name: "userID" @@ -2921,9 +2975,149 @@ paths: x-go-name: "Token" responses: 200: - description: "userObjectSuccess list of users" + description: "deleteMessage" schema: - $ref: "#/definitions/User" + $ref: "#/definitions/deleteMessage" + 422: + description: "wrongEntityError is an error object to inform that the provided\ + \ object was not correctly formated" + schema: + $ref: "#/definitions/genericErrorModel" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "deleteMessage" + schema: + $ref: "#/definitions/deleteMessage" + /user/{userName}/parameters: + get: + tags: + - "UserParameter" + summary: "Get user parameters" + description: "This will get all the user parameters available in the organisation." + operationId: "getAllUserParameter" + parameters: [] + responses: + 200: + $ref: "#/responses/userParameterArraySuccess" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" + post: + tags: + - "UserParameter" + summary: "New userparameter" + description: "This will create an userparameter for organisation userparameters\ + \ library." + operationId: "newUserParameter" + parameters: [] + responses: + 201: + $ref: "#/responses/userparameterObjectSuccess" + 422: + description: "wrongEntityError is an error object to inform that the provided\ + \ object was not correctly formated" + schema: + $ref: "#/definitions/genericErrorModel" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" + /user/{userName}/parameters/all: + get: + tags: + - "UserParameter" + summary: "Get userparameters" + description: "This will get all the userparameters available in the organisation." + operationId: "getAllUserParameter1" + parameters: [] + responses: + 200: + $ref: "#/responses/userparameterArraySuccess" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" + /user/{userName}/parameters/new: + post: + tags: + - "UserParameter" + summary: "New userparameter" + description: "This will create an userparameter for organisation userparameters\ + \ library." + operationId: "newUserParameter1" + parameters: [] + responses: + 201: + $ref: "#/responses/userparameterObjectSuccess" + 422: + description: "wrongEntityError is an error object to inform that the provided\ + \ object was not correctly formated" + schema: + $ref: "#/definitions/genericErrorModel" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" + /user/{userName}/parameters/{parameterName}: + put: + tags: + - "UserParameter" + summary: "Update userparameter" + description: "This will return the new userparameter object" + operationId: "updateUserParameter" + parameters: [] + responses: + 200: + $ref: "#/responses/userparameterObjectSuccess" + 422: + description: "wrongEntityError is an error object to inform that the provided\ + \ object was not correctly formated" + schema: + $ref: "#/definitions/genericErrorModel" + 503: + description: "databaseError is an error object to tell what is happening\ + \ when we encounter issue with database" + schema: + $ref: "#/definitions/genericErrorModel" + default: + description: "genericError general error when unexpected errors occured" + schema: + $ref: "#/definitions/genericErrorModel" + delete: + tags: + - "UserParameter" + summary: "Delete userparameter" + description: "This will return the new userparameter object" + operationId: "deleteUserParameter" + parameters: [] + responses: + 200: + $ref: "#/responses/userparameterObjectSuccess" 422: description: "wrongEntityError is an error object to inform that the provided\ \ object was not correctly formated" @@ -3467,10 +3661,20 @@ definitions: x-go-package: "github.com/titouanfreville/popcubeapi/api" avatarObjectParam: type: "object" + required: + - "link" + - "name" properties: - avatar: - description: "Link of the avatar in server.\nin:body" - $ref: "#/definitions/Avatar" + link: + type: "string" + description: "Path into server" + x-go-name: "Link" + name: + type: "string" + description: "Avatar name" + x-go-name: "Name" + title: "avatarObjectParam object" + description: "Avatar object to provide to update or create avatar into the database." x-go-package: "github.com/titouanfreville/popcubeapi/api" avatarObjectSuccess: type: "object"