Plan stuff. Log stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.0 KiB

4 years ago
  1. package models
  2. import (
  3. "github.com/gisle/stufflog/internal/generate"
  4. "github.com/gisle/stufflog/slerrors"
  5. )
  6. // An Activity is a general hobby or group of related related sub-activities.
  7. type Activity struct {
  8. ID string `json:"id"`
  9. UserID string `json:"userId"`
  10. Name string `json:"name"`
  11. Icon string `json:"icon"`
  12. DailyBonus int `json:"dailyBonus"`
  13. SubActivities []SubActivity `json:"subActivities"`
  14. }
  15. func (activity *Activity) GenerateIDs() {
  16. activity.ID = generate.ID("A", 12)
  17. for i := range activity.SubActivities {
  18. activity.SubActivities[i].ID = generate.ID("AS", 16)
  19. }
  20. }
  21. func (activity *Activity) SubActivity(id string) *SubActivity {
  22. for i := range activity.SubActivities {
  23. if activity.SubActivities[i].ID == id {
  24. return &activity.SubActivities[i]
  25. }
  26. }
  27. return nil
  28. }
  29. func (activity *Activity) ApplyUpdate(update ActivityUpdate) (changed bool, err error) {
  30. if update.SetName != nil {
  31. activity.Name = *update.SetName
  32. changed = true
  33. }
  34. if update.SetIcon != nil {
  35. activity.Icon = *update.SetIcon
  36. changed = true
  37. }
  38. if update.SetDailyBonus != nil {
  39. activity.DailyBonus = *update.SetDailyBonus
  40. changed = true
  41. }
  42. if update.AddSub != nil {
  43. sub := *update.AddSub
  44. sub.ID = generate.ID("SA", 16)
  45. activity.SubActivities = append(activity.SubActivities, sub)
  46. changed = true
  47. }
  48. if update.EditSub != nil {
  49. sub := activity.SubActivity(update.EditSub.ID)
  50. if sub == nil {
  51. err = slerrors.NotFound("Sub-activity you're trying to edit")
  52. return
  53. }
  54. *sub = *update.EditSub
  55. changed = true
  56. }
  57. if update.RemoveSub != nil {
  58. found := false
  59. for i, sub := range activity.SubActivities {
  60. if sub.ID == *update.RemoveSub {
  61. activity.SubActivities = append(activity.SubActivities[:i], activity.SubActivities[i+1:]...)
  62. found = true
  63. changed = true
  64. break
  65. }
  66. }
  67. if !found {
  68. err = slerrors.NotFound("Sub-activity you're trying to remove")
  69. return
  70. }
  71. }
  72. return
  73. }
  74. // A SubActivity is a part of the activity, i.e. tutorial, writing, practice. This is what determines
  75. // how many points should be awarded. The baseline multiplier should amount to 1000 points per hour,
  76. // while activities that take longer (i.e. a published piece of writing vs writing for your eyes only).
  77. type SubActivity struct {
  78. ID string `json:"id"`
  79. Name string `json:"name"`
  80. UnitName string `json:"unitName"`
  81. Value float64 `json:"value"`
  82. }
  83. // ActivityUpdate describes a change to an activity
  84. type ActivityUpdate struct {
  85. AddSub *SubActivity `json:"addSub"`
  86. EditSub *SubActivity `json:"editSub"`
  87. RemoveSub *string `json:"removeSub"`
  88. SetName *string `json:"setName"`
  89. SetIcon *string `json:"setIcon"`
  90. SetDailyBonus *int `json:"setDailyBonus"`
  91. }
  92. type ActivitiesByName []*Activity
  93. func (activities ActivitiesByName) Len() int {
  94. return len(activities)
  95. }
  96. func (activities ActivitiesByName) Less(i, j int) bool {
  97. return activities[i].Name < activities[j].Name
  98. }
  99. func (activities ActivitiesByName) Swap(i, j int) {
  100. activities[i], activities[j] = activities[j], activities[i]
  101. }