chore: update activity payload (#891)

pull/898/head
boojack 3 years ago committed by GitHub
parent 2e95f6824f
commit e5550828a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,5 +1,7 @@
package api package api
import "github.com/usememos/memos/server/profile"
// ActivityType is the type for an activity. // ActivityType is the type for an activity.
type ActivityType string type ActivityType string
@ -16,8 +18,6 @@ const (
ActivityUserAuthSignIn ActivityType = "user.auth.signin" ActivityUserAuthSignIn ActivityType = "user.auth.signin"
// ActivityUserAuthSignUp is the type for user signup. // ActivityUserAuthSignUp is the type for user signup.
ActivityUserAuthSignUp ActivityType = "user.auth.signup" ActivityUserAuthSignUp ActivityType = "user.auth.signup"
// ActivityUserAuthSignOut is the type for user signout.
ActivityUserAuthSignOut ActivityType = "user.auth.signout"
// ActivityUserSettingUpdate is the type for updating user settings. // ActivityUserSettingUpdate is the type for updating user settings.
ActivityUserSettingUpdate ActivityType = "user.setting.update" ActivityUserSettingUpdate ActivityType = "user.setting.update"
@ -39,6 +39,13 @@ const (
// ActivityShortcutDelete is the type for deleting shortcuts. // ActivityShortcutDelete is the type for deleting shortcuts.
ActivityShortcutDelete ActivityType = "shortcut.delete" ActivityShortcutDelete ActivityType = "shortcut.delete"
// Resource related.
// ActivityResourceCreate is the type for creating resources.
ActivityResourceCreate ActivityType = "resource.create"
// ActivityResourceDelete is the type for deleting resources.
ActivityResourceDelete ActivityType = "resource.delete"
// Tag related. // Tag related.
// ActivityTagCreate is the type for creating tags. // ActivityTagCreate is the type for creating tags.
@ -64,11 +71,41 @@ const (
ActivityError ActivityLevel = "ERROR" ActivityError ActivityLevel = "ERROR"
) )
type ActivityUserCreatePayload struct {
UserID int `json:"userId"`
Username string `json:"username"`
Role Role `json:"role"`
}
type ActivityUserAuthSignInPayload struct { type ActivityUserAuthSignInPayload struct {
UserID int `json:"userId"` UserID int `json:"userId"`
IP string `json:"ip"` IP string `json:"ip"`
} }
type ActivityUserAuthSignUpPayload struct {
Username string `json:"username"`
IP string `json:"ip"`
}
type ActivityShortcutCreatePayload struct {
Title string `json:"title"`
Payload string `json:"payload"`
}
type ActivityResourceCreatePayload struct {
Filename string `json:"filename"`
Type string `json:"type"`
Size int64 `json:"size"`
}
type ActivityTagCreatePayload struct {
TagName string `json:"tagName"`
}
type ActivityServerStartPayload struct {
Profile *profile.Profile `json:"profile"`
}
type Activity struct { type Activity struct {
ID int `json:"id"` ID int `json:"id"`

@ -8,7 +8,6 @@ import (
"context" "context"
"fmt" "fmt"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/usememos/memos/server" "github.com/usememos/memos/server"
"github.com/usememos/memos/server/profile" "github.com/usememos/memos/server/profile"
"github.com/usememos/memos/store" "github.com/usememos/memos/store"
@ -46,11 +45,7 @@ func run(profile *profile.Profile) error {
println(greetingBanner) println(greetingBanner)
fmt.Printf("Version %s has started at :%d\n", profile.Version, profile.Port) fmt.Printf("Version %s has started at :%d\n", profile.Version, profile.Port)
metricCollector.Collect(ctx, &metric.Metric{ return serverInstance.Run(ctx)
Name: "service started",
})
return serverInstance.Run()
} }
func execute() error { func execute() error {

@ -8,7 +8,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/usememos/memos/api" "github.com/usememos/memos/api"
"github.com/usememos/memos/common" "github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
@ -115,9 +114,9 @@ func (s *Server) registerAuthRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create user").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create user").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{ if err := s.createUserAuthSignUpActivity(c, user); err != nil {
Name: "user signed up", return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create activity").SetInternal(err)
}) }
err = setUserSession(c, user) err = setUserSession(c, user)
if err != nil { if err != nil {
@ -132,14 +131,10 @@ func (s *Server) registerAuthRoutes(g *echo.Group) {
}) })
g.POST("/auth/signout", func(c echo.Context) error { g.POST("/auth/signout", func(c echo.Context) error {
ctx := c.Request().Context()
err := removeUserSession(c) err := removeUserSession(c)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to set sign out session").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to set sign out session").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{
Name: "user signout",
})
return c.JSON(http.StatusOK, true) return c.JSON(http.StatusOK, true)
}) })
@ -153,7 +148,7 @@ func (s *Server) createUserAuthSignInActivity(c echo.Context, user *api.User) er
} }
payloadStr, err := json.Marshal(payload) payloadStr, err := json.Marshal(payload)
if err != nil { if err != nil {
return errors.Wrap(err, "failed to malshal activity payload") return errors.Wrap(err, "failed to marshal activity payload")
} }
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{ _, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: user.ID, CreatorID: user.ID,
@ -163,3 +158,22 @@ func (s *Server) createUserAuthSignInActivity(c echo.Context, user *api.User) er
}) })
return err return err
} }
func (s *Server) createUserAuthSignUpActivity(c echo.Context, user *api.User) error {
ctx := c.Request().Context()
payload := api.ActivityUserAuthSignUpPayload{
Username: user.Username,
IP: echo.ExtractIPFromRealIPHeader()(c.Request()),
}
payloadStr, err := json.Marshal(payload)
if err != nil {
return errors.Wrap(err, "failed to marshal activity payload")
}
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: user.ID,
Type: api.ActivityUserAuthSignUp,
Level: api.ActivityInfo,
Payload: string(payloadStr),
})
return err
}

@ -8,12 +8,10 @@ import (
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
getter "github.com/usememos/memos/plugin/http_getter" getter "github.com/usememos/memos/plugin/http_getter"
metric "github.com/usememos/memos/plugin/metrics"
) )
func (s *Server) registerGetterPublicRoutes(g *echo.Group) { func registerGetterPublicRoutes(g *echo.Group) {
g.GET("/get/httpmeta", func(c echo.Context) error { g.GET("/get/httpmeta", func(c echo.Context) error {
ctx := c.Request().Context()
urlStr := c.QueryParam("url") urlStr := c.QueryParam("url")
if urlStr == "" { if urlStr == "" {
return echo.NewHTTPError(http.StatusBadRequest, "Missing website url") return echo.NewHTTPError(http.StatusBadRequest, "Missing website url")
@ -26,12 +24,6 @@ func (s *Server) registerGetterPublicRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusNotAcceptable, fmt.Sprintf("Failed to get website meta with url: %s", urlStr)).SetInternal(err) return echo.NewHTTPError(http.StatusNotAcceptable, fmt.Sprintf("Failed to get website meta with url: %s", urlStr)).SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{
Name: "getter used",
Labels: map[string]string{
"type": "httpmeta",
},
})
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(htmlMeta)); err != nil { if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(htmlMeta)); err != nil {
@ -41,7 +33,6 @@ func (s *Server) registerGetterPublicRoutes(g *echo.Group) {
}) })
g.GET("/get/image", func(c echo.Context) error { g.GET("/get/image", func(c echo.Context) error {
ctx := c.Request().Context()
urlStr := c.QueryParam("url") urlStr := c.QueryParam("url")
if urlStr == "" { if urlStr == "" {
return echo.NewHTTPError(http.StatusBadRequest, "Missing image url") return echo.NewHTTPError(http.StatusBadRequest, "Missing image url")
@ -54,12 +45,6 @@ func (s *Server) registerGetterPublicRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Failed to get image url: %s", urlStr)).SetInternal(err) return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Failed to get image url: %s", urlStr)).SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{
Name: "getter used",
Labels: map[string]string{
"type": "image",
},
})
c.Response().Writer.WriteHeader(http.StatusOK) c.Response().Writer.WriteHeader(http.StatusOK)
c.Response().Writer.Header().Set("Content-Type", image.Mediatype) c.Response().Writer.Header().Set("Content-Type", image.Mediatype)

@ -9,9 +9,9 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/pkg/errors"
"github.com/usememos/memos/api" "github.com/usememos/memos/api"
"github.com/usememos/memos/common" "github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
) )
@ -66,9 +66,9 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create resource").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create resource").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{ if err := s.createResourceCreateActivity(c, resource); err != nil {
Name: "resource created", return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create activity").SetInternal(err)
}) }
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(resource)); err != nil { if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(resource)); err != nil {
@ -275,3 +275,23 @@ func (s *Server) registerResourcePublicRoutes(g *echo.Group) {
return nil return nil
}) })
} }
func (s *Server) createResourceCreateActivity(c echo.Context, resource *api.Resource) error {
ctx := c.Request().Context()
payload := api.ActivityResourceCreatePayload{
Filename: resource.Filename,
Type: resource.Type,
Size: resource.Size,
}
payloadStr, err := json.Marshal(payload)
if err != nil {
return errors.Wrap(err, "failed to marshal activity payload")
}
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: resource.CreatorID,
Type: api.ActivityResourceCreate,
Level: api.ActivityInfo,
Payload: string(payloadStr),
})
return err
}

@ -1,9 +1,13 @@
package server package server
import ( import (
"context"
"encoding/json"
"fmt" "fmt"
"time" "time"
"github.com/pkg/errors"
"github.com/usememos/memos/api"
"github.com/usememos/memos/server/profile" "github.com/usememos/memos/server/profile"
"github.com/usememos/memos/store" "github.com/usememos/memos/store"
@ -77,7 +81,7 @@ func NewServer(profile *profile.Profile) *Server {
publicGroup := e.Group("/o") publicGroup := e.Group("/o")
s.registerResourcePublicRoutes(publicGroup) s.registerResourcePublicRoutes(publicGroup)
s.registerGetterPublicRoutes(publicGroup) registerGetterPublicRoutes(publicGroup)
apiGroup := e.Group("/api") apiGroup := e.Group("/api")
apiGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc { apiGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
@ -94,6 +98,26 @@ func NewServer(profile *profile.Profile) *Server {
return s return s
} }
func (s *Server) Run() error { func (s *Server) Run(ctx context.Context) error {
if err := s.createServerStartActivity(ctx); err != nil {
return errors.Wrap(err, "failed to create activity")
}
return s.e.Start(fmt.Sprintf(":%d", s.Profile.Port)) return s.e.Start(fmt.Sprintf(":%d", s.Profile.Port))
} }
func (s *Server) createServerStartActivity(ctx context.Context) error {
payload := api.ActivityServerStartPayload{
Profile: s.Profile,
}
payloadStr, err := json.Marshal(payload)
if err != nil {
return errors.Wrap(err, "failed to marshal activity payload")
}
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: api.UnknownID,
Type: api.ActivityServerStart,
Level: api.ActivityInfo,
Payload: string(payloadStr),
})
return err
}

@ -7,9 +7,9 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/pkg/errors"
"github.com/usememos/memos/api" "github.com/usememos/memos/api"
"github.com/usememos/memos/common" "github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
) )
@ -31,9 +31,9 @@ func (s *Server) registerShortcutRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create shortcut").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create shortcut").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{ if err := s.createShortcutCreateActivity(c, shortcut); err != nil {
Name: "shortcut created", return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create activity").SetInternal(err)
}) }
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(shortcut)); err != nil { if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(shortcut)); err != nil {
@ -164,3 +164,22 @@ func (s *Server) registerShortcutRoutes(g *echo.Group) {
return c.JSON(http.StatusOK, true) return c.JSON(http.StatusOK, true)
}) })
} }
func (s *Server) createShortcutCreateActivity(c echo.Context, shortcut *api.Shortcut) error {
ctx := c.Request().Context()
payload := api.ActivityShortcutCreatePayload{
Title: shortcut.Title,
Payload: shortcut.Payload,
}
payloadStr, err := json.Marshal(payload)
if err != nil {
return errors.Wrap(err, "failed to marshal activity payload")
}
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: shortcut.CreatorID,
Type: api.ActivityShortcutCreate,
Level: api.ActivityInfo,
Payload: string(payloadStr),
})
return err
}

@ -7,7 +7,6 @@ import (
"github.com/usememos/memos/api" "github.com/usememos/memos/api"
"github.com/usememos/memos/common" "github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
) )
@ -152,10 +151,6 @@ func (s *Server) registerSystemRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert system setting").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert system setting").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{
Name: "systemSetting updated",
Labels: map[string]string{"field": string(systemSettingUpsert.Name)},
})
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemSetting)); err != nil { if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemSetting)); err != nil {

@ -7,9 +7,9 @@ import (
"regexp" "regexp"
"sort" "sort"
"github.com/pkg/errors"
"github.com/usememos/memos/api" "github.com/usememos/memos/api"
"github.com/usememos/memos/common" "github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
) )
@ -35,9 +35,9 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert tag").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert tag").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{ if err := s.createTagCreateActivity(c, tag); err != nil {
Name: "tag created", return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create activity").SetInternal(err)
}) }
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(tag.Name)); err != nil { if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(tag.Name)); err != nil {
@ -155,3 +155,21 @@ func findTagListFromMemoContent(memoContent string) []string {
sort.Strings(tagList) sort.Strings(tagList)
return tagList return tagList
} }
func (s *Server) createTagCreateActivity(c echo.Context, tag *api.Tag) error {
ctx := c.Request().Context()
payload := api.ActivityTagCreatePayload{
TagName: tag.Name,
}
payloadStr, err := json.Marshal(payload)
if err != nil {
return errors.Wrap(err, "failed to marshal activity payload")
}
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: tag.CreatorID,
Type: api.ActivityTagCreate,
Level: api.ActivityInfo,
Payload: string(payloadStr),
})
return err
}

@ -7,9 +7,9 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/pkg/errors"
"github.com/usememos/memos/api" "github.com/usememos/memos/api"
"github.com/usememos/memos/common" "github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
@ -55,9 +55,9 @@ func (s *Server) registerUserRoutes(g *echo.Group) {
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create user").SetInternal(err) return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create user").SetInternal(err)
} }
s.Collector.Collect(ctx, &metric.Metric{ if err := s.createUserCreateActivity(c, user); err != nil {
Name: "user created", return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create activity").SetInternal(err)
}) }
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(user)); err != nil { if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(user)); err != nil {
@ -277,3 +277,23 @@ func (s *Server) registerUserRoutes(g *echo.Group) {
return c.JSON(http.StatusOK, true) return c.JSON(http.StatusOK, true)
}) })
} }
func (s *Server) createUserCreateActivity(c echo.Context, user *api.User) error {
ctx := c.Request().Context()
payload := api.ActivityUserCreatePayload{
UserID: user.ID,
Username: user.Username,
Role: user.Role,
}
payloadStr, err := json.Marshal(payload)
if err != nil {
return errors.Wrap(err, "failed to marshal activity payload")
}
_, err = s.Store.CreateActivity(ctx, &api.ActivityCreate{
CreatorID: user.ID,
Type: api.ActivityUserCreate,
Level: api.ActivityInfo,
Payload: string(payloadStr),
})
return err
}

Loading…
Cancel
Save