memo_relation.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package v1
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "github.com/labstack/echo/v4"
  7. "github.com/usememos/memos/common/util"
  8. "github.com/usememos/memos/store"
  9. )
  10. type MemoRelationType string
  11. const (
  12. MemoRelationReference MemoRelationType = "REFERENCE"
  13. MemoRelationAdditional MemoRelationType = "ADDITIONAL"
  14. )
  15. type MemoRelation struct {
  16. MemoID int32 `json:"memoId"`
  17. RelatedMemoID int32 `json:"relatedMemoId"`
  18. Type MemoRelationType `json:"type"`
  19. }
  20. type UpsertMemoRelationRequest struct {
  21. RelatedMemoID int32 `json:"relatedMemoId"`
  22. Type MemoRelationType `json:"type"`
  23. }
  24. func (s *APIV1Service) registerMemoRelationRoutes(g *echo.Group) {
  25. g.POST("/memo/:memoId/relation", func(c echo.Context) error {
  26. ctx := c.Request().Context()
  27. memoID, err := util.ConvertStringToInt32(c.Param("memoId"))
  28. if err != nil {
  29. return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("memoId"))).SetInternal(err)
  30. }
  31. request := &UpsertMemoRelationRequest{}
  32. if err := json.NewDecoder(c.Request().Body).Decode(request); err != nil {
  33. return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post memo relation request").SetInternal(err)
  34. }
  35. memoRelation, err := s.Store.UpsertMemoRelation(ctx, &store.MemoRelation{
  36. MemoID: memoID,
  37. RelatedMemoID: request.RelatedMemoID,
  38. Type: store.MemoRelationType(request.Type),
  39. })
  40. if err != nil {
  41. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert memo relation").SetInternal(err)
  42. }
  43. return c.JSON(http.StatusOK, memoRelation)
  44. })
  45. g.GET("/memo/:memoId/relation", func(c echo.Context) error {
  46. ctx := c.Request().Context()
  47. memoID, err := util.ConvertStringToInt32(c.Param("memoId"))
  48. if err != nil {
  49. return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("memoId"))).SetInternal(err)
  50. }
  51. memoRelationList, err := s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
  52. MemoID: &memoID,
  53. })
  54. if err != nil {
  55. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to list memo relations").SetInternal(err)
  56. }
  57. return c.JSON(http.StatusOK, memoRelationList)
  58. })
  59. g.DELETE("/memo/:memoId/relation/:relatedMemoId/type/:relationType", func(c echo.Context) error {
  60. ctx := c.Request().Context()
  61. memoID, err := util.ConvertStringToInt32(c.Param("memoId"))
  62. if err != nil {
  63. return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Memo ID is not a number: %s", c.Param("memoId"))).SetInternal(err)
  64. }
  65. relatedMemoID, err := util.ConvertStringToInt32(c.Param("relatedMemoId"))
  66. if err != nil {
  67. return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Related memo ID is not a number: %s", c.Param("resourceId"))).SetInternal(err)
  68. }
  69. relationType := store.MemoRelationType(c.Param("relationType"))
  70. if err := s.Store.DeleteMemoRelation(ctx, &store.DeleteMemoRelation{
  71. MemoID: &memoID,
  72. RelatedMemoID: &relatedMemoID,
  73. Type: &relationType,
  74. }); err != nil {
  75. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to delete memo relation").SetInternal(err)
  76. }
  77. return c.JSON(http.StatusOK, true)
  78. })
  79. }
  80. func convertMemoRelationFromStore(memoRelation *store.MemoRelation) *MemoRelation {
  81. return &MemoRelation{
  82. MemoID: memoRelation.MemoID,
  83. RelatedMemoID: memoRelation.RelatedMemoID,
  84. Type: MemoRelationType(memoRelation.Type),
  85. }
  86. }