mirror of https://github.com/usememos/memos
parent
a797280e3f
commit
5195012217
@ -0,0 +1,94 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
// ActivityType is the type for an activity.
|
||||||
|
type ActivityType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// User related.
|
||||||
|
|
||||||
|
// ActivityUserCreate is the type for creating users.
|
||||||
|
ActivityUserCreate ActivityType = "user.create"
|
||||||
|
// ActivityUserUpdate is the type for updating users.
|
||||||
|
ActivityUserUpdate ActivityType = "user.update"
|
||||||
|
// ActivityUserDelete is the type for deleting users.
|
||||||
|
ActivityUserDelete ActivityType = "user.delete"
|
||||||
|
// ActivityUserAuthSignIn is the type for user signin.
|
||||||
|
ActivityUserAuthSignIn ActivityType = "user.auth.signin"
|
||||||
|
// ActivityUserAuthSignUp is the type for user 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 ActivityType = "user.setting.update"
|
||||||
|
|
||||||
|
// Memo related.
|
||||||
|
|
||||||
|
// ActivityMemoCreate is the type for creating memos.
|
||||||
|
ActivityMemoCreate ActivityType = "memo.create"
|
||||||
|
// ActivityMemoUpdate is the type for updating memos.
|
||||||
|
ActivityMemoUpdate ActivityType = "memo.update"
|
||||||
|
// ActivityMemoDelete is the type for deleting memos.
|
||||||
|
ActivityMemoDelete ActivityType = "memo.delete"
|
||||||
|
|
||||||
|
// Shortcut related.
|
||||||
|
|
||||||
|
// ActivityShortcutCreate is the type for creating shortcuts.
|
||||||
|
ActivityShortcutCreate ActivityType = "shortcut.create"
|
||||||
|
// ActivityShortcutUpdate is the type for updating shortcuts.
|
||||||
|
ActivityShortcutUpdate ActivityType = "shortcut.update"
|
||||||
|
// ActivityShortcutDelete is the type for deleting shortcuts.
|
||||||
|
ActivityShortcutDelete ActivityType = "shortcut.delete"
|
||||||
|
|
||||||
|
// Tag related.
|
||||||
|
|
||||||
|
// ActivityTagCreate is the type for creating tags.
|
||||||
|
ActivityTagCreate ActivityType = "tag.create"
|
||||||
|
// ActivityTagDelete is the type for deleting tags.
|
||||||
|
ActivityTagDelete ActivityType = "tag.delete"
|
||||||
|
|
||||||
|
// Server related.
|
||||||
|
|
||||||
|
// ActivityServerStart is the type for starting server.
|
||||||
|
ActivityServerStart ActivityType = "server.start"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ActivityLevel is the level of activities.
|
||||||
|
type ActivityLevel string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ActivityInfo is the INFO level of activities.
|
||||||
|
ActivityInfo ActivityLevel = "INFO"
|
||||||
|
// ActivityWarn is the WARN level of activities.
|
||||||
|
ActivityWarn ActivityLevel = "WARN"
|
||||||
|
// ActivityError is the ERROR level of activities.
|
||||||
|
ActivityError ActivityLevel = "ERROR"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ActivityUserAuthSignInPayload struct {
|
||||||
|
UserID int `json:"userId"`
|
||||||
|
IP string `json:"ip"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Activity struct {
|
||||||
|
ID int `json:"id"`
|
||||||
|
|
||||||
|
// Standard fields
|
||||||
|
CreatorID int `json:"creatorId"`
|
||||||
|
CreatedTs int64 `json:"createdTs"`
|
||||||
|
|
||||||
|
// Domain specific fields
|
||||||
|
Type ActivityType `json:"type"`
|
||||||
|
Level ActivityLevel `json:"level"`
|
||||||
|
Payload string `json:"payload"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ActivityCreate is the API message for creating an activity.
|
||||||
|
type ActivityCreate struct {
|
||||||
|
// Standard fields
|
||||||
|
CreatorID int
|
||||||
|
|
||||||
|
// Domain specific fields
|
||||||
|
Type ActivityType `json:"type"`
|
||||||
|
Level ActivityLevel
|
||||||
|
Payload string `json:"payload"`
|
||||||
|
}
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
|
||||||
|
"github.com/usememos/memos/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
// activityRaw is the store model for an Activity.
|
||||||
|
// Fields have exactly the same meanings as Activity.
|
||||||
|
type activityRaw struct {
|
||||||
|
ID int
|
||||||
|
|
||||||
|
// Standard fields
|
||||||
|
CreatorID int
|
||||||
|
CreatedTs int64
|
||||||
|
|
||||||
|
// Domain specific fields
|
||||||
|
Type api.ActivityType
|
||||||
|
Level api.ActivityLevel
|
||||||
|
Payload string
|
||||||
|
}
|
||||||
|
|
||||||
|
// toActivity creates an instance of Activity based on the ActivityRaw.
|
||||||
|
func (raw *activityRaw) toActivity() *api.Activity {
|
||||||
|
return &api.Activity{
|
||||||
|
ID: raw.ID,
|
||||||
|
|
||||||
|
CreatorID: raw.CreatorID,
|
||||||
|
CreatedTs: raw.CreatedTs,
|
||||||
|
|
||||||
|
Type: raw.Type,
|
||||||
|
Level: raw.Level,
|
||||||
|
Payload: raw.Payload,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateActivity creates an instance of Activity.
|
||||||
|
func (s *Store) CreateActivity(ctx context.Context, create *api.ActivityCreate) (*api.Activity, error) {
|
||||||
|
tx, err := s.db.BeginTx(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, FormatError(err)
|
||||||
|
}
|
||||||
|
defer tx.Rollback()
|
||||||
|
|
||||||
|
activityRaw, err := createActivity(ctx, tx, create)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Commit(); err != nil {
|
||||||
|
return nil, FormatError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return activityRaw.toActivity(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// createActivity creates a new activity.
|
||||||
|
func createActivity(ctx context.Context, tx *sql.Tx, create *api.ActivityCreate) (*activityRaw, error) {
|
||||||
|
query := `
|
||||||
|
INSERT INTO activity (
|
||||||
|
creator_id,
|
||||||
|
type,
|
||||||
|
level,
|
||||||
|
payload
|
||||||
|
)
|
||||||
|
VALUES (?, ?, ?, ?)
|
||||||
|
RETURNING id, type, level, payload, creator_id, created_ts
|
||||||
|
`
|
||||||
|
var activityRaw activityRaw
|
||||||
|
if err := tx.QueryRowContext(ctx, query, create.CreatorID, create.Type, create.Level, create.Payload).Scan(
|
||||||
|
&activityRaw.ID,
|
||||||
|
&activityRaw.Type,
|
||||||
|
&activityRaw.Level,
|
||||||
|
&activityRaw.Payload,
|
||||||
|
&activityRaw.CreatedTs,
|
||||||
|
&activityRaw.CreatedTs,
|
||||||
|
); err != nil {
|
||||||
|
return nil, FormatError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &activityRaw, nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue