activity.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package store
  2. import (
  3. "context"
  4. "database/sql"
  5. "github.com/usememos/memos/api"
  6. )
  7. // activityRaw is the store model for an Activity.
  8. // Fields have exactly the same meanings as Activity.
  9. type activityRaw struct {
  10. ID int
  11. // Standard fields
  12. CreatorID int
  13. CreatedTs int64
  14. // Domain specific fields
  15. Type api.ActivityType
  16. Level api.ActivityLevel
  17. Payload string
  18. }
  19. // toActivity creates an instance of Activity based on the ActivityRaw.
  20. func (raw *activityRaw) toActivity() *api.Activity {
  21. return &api.Activity{
  22. ID: raw.ID,
  23. CreatorID: raw.CreatorID,
  24. CreatedTs: raw.CreatedTs,
  25. Type: raw.Type,
  26. Level: raw.Level,
  27. Payload: raw.Payload,
  28. }
  29. }
  30. // CreateActivity creates an instance of Activity.
  31. func (s *Store) CreateActivity(ctx context.Context, create *api.ActivityCreate) (*api.Activity, error) {
  32. if s.Profile.Mode == "prod" {
  33. return nil, nil
  34. }
  35. tx, err := s.db.BeginTx(ctx, nil)
  36. if err != nil {
  37. return nil, FormatError(err)
  38. }
  39. defer tx.Rollback()
  40. activityRaw, err := createActivity(ctx, tx, create)
  41. if err != nil {
  42. return nil, err
  43. }
  44. if err := tx.Commit(); err != nil {
  45. return nil, FormatError(err)
  46. }
  47. activity := activityRaw.toActivity()
  48. return activity, nil
  49. }
  50. // createActivity creates a new activity.
  51. func createActivity(ctx context.Context, tx *sql.Tx, create *api.ActivityCreate) (*activityRaw, error) {
  52. query := `
  53. INSERT INTO activity (
  54. creator_id,
  55. type,
  56. level,
  57. payload
  58. )
  59. VALUES (?, ?, ?, ?)
  60. RETURNING id, type, level, payload, creator_id, created_ts
  61. `
  62. var activityRaw activityRaw
  63. if err := tx.QueryRowContext(ctx, query, create.CreatorID, create.Type, create.Level, create.Payload).Scan(
  64. &activityRaw.ID,
  65. &activityRaw.Type,
  66. &activityRaw.Level,
  67. &activityRaw.Payload,
  68. &activityRaw.CreatorID,
  69. &activityRaw.CreatedTs,
  70. ); err != nil {
  71. return nil, FormatError(err)
  72. }
  73. return &activityRaw, nil
  74. }