diff --git a/server/memo.go b/server/memo.go index 94f0beda..e9aea9e6 100644 --- a/server/memo.go +++ b/server/memo.go @@ -289,60 +289,6 @@ func (s *Server) registerMemoRoutes(g *echo.Group) { return c.JSON(http.StatusOK, composeResponse(memo)) }) - g.POST("/memo/:memoId/resource", func(c echo.Context) error { - ctx := c.Request().Context() - memoID, err := strconv.Atoi(c.Param("memoId")) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("memoId"))).SetInternal(err) - } - - userID, ok := c.Get(getUserIDContextKey()).(int) - if !ok { - return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session") - } - memoResourceUpsert := &api.MemoResourceUpsert{} - if err := json.NewDecoder(c.Request().Body).Decode(memoResourceUpsert); err != nil { - return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post memo resource request").SetInternal(err) - } - resourceFind := &api.ResourceFind{ - ID: &memoResourceUpsert.ResourceID, - } - resource, err := s.Store.FindResource(ctx, resourceFind) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource").SetInternal(err) - } - if resource == nil { - return echo.NewHTTPError(http.StatusBadRequest, "Resource not found").SetInternal(err) - } else if resource.CreatorID != userID { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized to bind this resource").SetInternal(err) - } - - memoResourceUpsert.MemoID = memoID - currentTs := time.Now().Unix() - memoResourceUpsert.UpdatedTs = ¤tTs - if _, err := s.Store.UpsertMemoResource(ctx, memoResourceUpsert); err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert memo resource").SetInternal(err) - } - return c.JSON(http.StatusOK, composeResponse(resource)) - }) - - g.GET("/memo/:memoId/resource", func(c echo.Context) error { - ctx := c.Request().Context() - memoID, err := strconv.Atoi(c.Param("memoId")) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("memoId"))).SetInternal(err) - } - - resourceFind := &api.ResourceFind{ - MemoID: &memoID, - } - resourceList, err := s.Store.FindResourceList(ctx, resourceFind) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource list").SetInternal(err) - } - return c.JSON(http.StatusOK, composeResponse(resourceList)) - }) - g.GET("/memo/stats", func(c echo.Context) error { ctx := c.Request().Context() normalStatus := api.Normal @@ -458,41 +404,6 @@ func (s *Server) registerMemoRoutes(g *echo.Group) { } return c.JSON(http.StatusOK, true) }) - - g.DELETE("/memo/:memoId/resource/:resourceId", func(c echo.Context) error { - ctx := c.Request().Context() - userID, ok := c.Get(getUserIDContextKey()).(int) - if !ok { - return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session") - } - memoID, err := strconv.Atoi(c.Param("memoId")) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Memo ID is not a number: %s", c.Param("memoId"))).SetInternal(err) - } - resourceID, err := strconv.Atoi(c.Param("resourceId")) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Resource ID is not a number: %s", c.Param("resourceId"))).SetInternal(err) - } - - memo, err := s.Store.FindMemo(ctx, &api.MemoFind{ - ID: &memoID, - }) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find memo").SetInternal(err) - } - if memo.CreatorID != userID { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") - } - - memoResourceDelete := &api.MemoResourceDelete{ - MemoID: &memoID, - ResourceID: &resourceID, - } - if err := s.Store.DeleteMemoResource(ctx, memoResourceDelete); err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource list").SetInternal(err) - } - return c.JSON(http.StatusOK, true) - }) } func (s *Server) createMemoCreateActivity(c echo.Context, memo *api.Memo) error { diff --git a/server/memo_resource.go b/server/memo_resource.go new file mode 100644 index 00000000..c0f1bc4d --- /dev/null +++ b/server/memo_resource.go @@ -0,0 +1,104 @@ +package server + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + "github.com/usememos/memos/api" + + "github.com/labstack/echo/v4" +) + +func (s *Server) registerMemoResourceRoutes(g *echo.Group) { + g.POST("/memo/:memoId/resource", func(c echo.Context) error { + ctx := c.Request().Context() + memoID, err := strconv.Atoi(c.Param("memoId")) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("memoId"))).SetInternal(err) + } + + userID, ok := c.Get(getUserIDContextKey()).(int) + if !ok { + return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session") + } + memoResourceUpsert := &api.MemoResourceUpsert{} + if err := json.NewDecoder(c.Request().Body).Decode(memoResourceUpsert); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post memo resource request").SetInternal(err) + } + resourceFind := &api.ResourceFind{ + ID: &memoResourceUpsert.ResourceID, + } + resource, err := s.Store.FindResource(ctx, resourceFind) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource").SetInternal(err) + } + if resource == nil { + return echo.NewHTTPError(http.StatusBadRequest, "Resource not found").SetInternal(err) + } else if resource.CreatorID != userID { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized to bind this resource").SetInternal(err) + } + + memoResourceUpsert.MemoID = memoID + currentTs := time.Now().Unix() + memoResourceUpsert.UpdatedTs = ¤tTs + if _, err := s.Store.UpsertMemoResource(ctx, memoResourceUpsert); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert memo resource").SetInternal(err) + } + return c.JSON(http.StatusOK, composeResponse(resource)) + }) + + g.GET("/memo/:memoId/resource", func(c echo.Context) error { + ctx := c.Request().Context() + memoID, err := strconv.Atoi(c.Param("memoId")) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("memoId"))).SetInternal(err) + } + + resourceFind := &api.ResourceFind{ + MemoID: &memoID, + } + resourceList, err := s.Store.FindResourceList(ctx, resourceFind) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource list").SetInternal(err) + } + return c.JSON(http.StatusOK, composeResponse(resourceList)) + }) + + g.DELETE("/memo/:memoId/resource/:resourceId", func(c echo.Context) error { + ctx := c.Request().Context() + userID, ok := c.Get(getUserIDContextKey()).(int) + if !ok { + return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session") + } + memoID, err := strconv.Atoi(c.Param("memoId")) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Memo ID is not a number: %s", c.Param("memoId"))).SetInternal(err) + } + resourceID, err := strconv.Atoi(c.Param("resourceId")) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Resource ID is not a number: %s", c.Param("resourceId"))).SetInternal(err) + } + + memo, err := s.Store.FindMemo(ctx, &api.MemoFind{ + ID: &memoID, + }) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find memo").SetInternal(err) + } + if memo.CreatorID != userID { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } + + memoResourceDelete := &api.MemoResourceDelete{ + MemoID: &memoID, + ResourceID: &resourceID, + } + if err := s.Store.DeleteMemoResource(ctx, memoResourceDelete); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch resource list").SetInternal(err) + } + return c.JSON(http.StatusOK, true) + }) +} diff --git a/server/server.go b/server/server.go index 75a24237..3c82e8e2 100644 --- a/server/server.go +++ b/server/server.go @@ -102,6 +102,7 @@ func NewServer(ctx context.Context, profile *profile.Profile) (*Server, error) { s.registerAuthRoutes(apiGroup, secret) s.registerUserRoutes(apiGroup) s.registerMemoRoutes(apiGroup) + s.registerMemoResourceRoutes(apiGroup) s.registerShortcutRoutes(apiGroup) s.registerResourceRoutes(apiGroup) s.registerTagRoutes(apiGroup)