Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions api/memo.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,12 @@ type MemoFind struct {
CreatorID *int `json:"creatorId"`

// Domain specific fields
Pinned *bool
Tag *string
Pinned *bool
ContentSearch *string

// Pagination
Limit int
Offset int
}

type MemoDelete struct {
Expand Down
30 changes: 29 additions & 1 deletion server/memo.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,14 @@ func (s *Server) registerMemoRoutes(g *echo.Group) {
}
tag := c.QueryParam("tag")
if tag != "" {
memoFind.Tag = &tag
contentSearch := "#" + tag + " "
memoFind.ContentSearch = &contentSearch
}
if limit, err := strconv.Atoi(c.QueryParam("limit")); err == nil {
memoFind.Limit = limit
}
if offset, err := strconv.Atoi(c.QueryParam("offset")); err == nil {
memoFind.Offset = offset
}

list, err := s.Store.FindMemoList(memoFind)
Expand Down Expand Up @@ -177,4 +184,25 @@ func (s *Server) registerMemoRoutes(g *echo.Group) {

return nil
})

g.GET("/memo/amount", func(c echo.Context) error {
userID := c.Get(getUserIDContextKey()).(int)
normalRowStatus := api.Normal
memoFind := &api.MemoFind{
CreatorID: &userID,
RowStatus: &normalRowStatus,
}

memoList, err := s.Store.FindMemoList(memoFind)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find memo list").SetInternal(err)
}

c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(len(memoList)); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode memo amount").SetInternal(err)
}

return nil
})
}
1 change: 1 addition & 0 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func NewServer(profile *profile.Profile) *Server {
s.registerMemoRoutes(apiGroup)
s.registerShortcutRoutes(apiGroup)
s.registerResourceRoutes(apiGroup)
s.registerTagRoutes(apiGroup)

return s
}
Expand Down
51 changes: 51 additions & 0 deletions server/tag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package server

import (
"encoding/json"
"memos/api"
"net/http"
"regexp"

"github.com/labstack/echo/v4"
)

func (s *Server) registerTagRoutes(g *echo.Group) {
g.GET("/tag", func(c echo.Context) error {
userID := c.Get(getUserIDContextKey()).(int)
contentSearch := "#"
memoFind := api.MemoFind{
CreatorID: &userID,
ContentSearch: &contentSearch,
}

memoList, err := s.Store.FindMemoList(&memoFind)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find memo list").SetInternal(err)
}

tagMapSet := make(map[string]bool)

r, err := regexp.Compile("#(.+?) ")
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to compile regexp").SetInternal(err)
}
for _, memo := range memoList {
for _, rawTag := range r.FindAllString(memo.Content, -1) {
tag := r.ReplaceAllString(rawTag, "$1")
tagMapSet[tag] = true
}
}

tagList := []string{}
for tag := range tagMapSet {
tagList = append(tagList, tag)
}

c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(tagList); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode tags response").SetInternal(err)
}

return nil
})
}
9 changes: 8 additions & 1 deletion server/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,14 @@ func (s *Server) registerWebhookRoutes(g *echo.Group) {
}
tag := c.QueryParam("tag")
if tag != "" {
memoFind.Tag = &tag
contentSearch := tag + " "
memoFind.ContentSearch = &contentSearch
}
if limit, err := strconv.Atoi(c.QueryParam("limit")); err == nil {
memoFind.Limit = limit
}
if offset, err := strconv.Atoi(c.QueryParam("offset")); err == nil {
memoFind.Offset = offset
}

list, err := s.Store.FindMemoList(memoFind)
Expand Down
16 changes: 13 additions & 3 deletions store/memo.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,10 +209,20 @@ func findMemoRawList(db *sql.DB, find *api.MemoFind) ([]*memoRaw, error) {
if v := find.Pinned; v != nil {
where = append(where, "id in (SELECT memo_id FROM memo_organizer WHERE pinned = 1 AND user_id = memo.creator_id )")
}
if v := find.Tag; v != nil {
where, args = append(where, "content LIKE ?"), append(args, "%#"+*v+" %")
if v := find.ContentSearch; v != nil {
where, args = append(where, "content LIKE ?"), append(args, "%"+*v+"%")
}

pagination := ""
if find.Limit > 0 {
pagination = fmt.Sprintf("%s LIMIT %d", pagination, find.Limit)
if find.Offset > 0 {
pagination = fmt.Sprintf("%s OFFSET %d", pagination, find.Offset)
}
}

println(pagination)

rows, err := db.Query(`
SELECT
id,
Expand All @@ -223,7 +233,7 @@ func findMemoRawList(db *sql.DB, find *api.MemoFind) ([]*memoRaw, error) {
row_status
FROM memo
WHERE `+strings.Join(where, " AND ")+`
ORDER BY created_ts DESC`,
ORDER BY created_ts DESC`+pagination,
args...,
)
if err != nil {
Expand Down