/
meals.go
112 lines (102 loc) · 3.17 KB
/
meals.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package notifications
import (
"fmt"
"log"
"github.com/bradpurchase/grocerytime-backend/internal/pkg/db"
"github.com/bradpurchase/grocerytime-backend/internal/pkg/db/models"
"github.com/bradpurchase/grocerytime-backend/internal/pkg/utils"
)
// NewMeal sends a push notification about a new meal
func NewMeal(meal *models.Meal, appScheme string) {
var user models.User
userQuery := db.Manager.
Select("name").
Where("id = ?", meal.UserID).
Last(&user).
Error
if err := userQuery; err != nil {
log.Println(err)
}
title := "Meal Planned"
body := fmt.Sprintf("%v added a meal to your meal plan", user.Name)
deviceTokens, err := MealUserTokens(meal)
if err != nil {
log.Println(err)
}
for i := range deviceTokens {
Send(title, body, deviceTokens[i], "Meal", meal.ID.String(), appScheme)
}
}
// MealRemoved sends a push notification about a meal being removed from a meal plan
func MealRemoved(meal models.Meal, appScheme string) {
var user models.User
userQuery := db.Manager.
Select("name").
Where("id = ?", meal.UserID).
Last(&user).
Error
if err := userQuery; err != nil {
log.Println(err)
}
title := "Meal Removed"
nameTruncated := utils.TruncateString(meal.Name, 12)
body := fmt.Sprintf("%v removed \"%v\" from your meal plan", user.Name, nameTruncated)
deviceTokens, err := MealUserTokens(&meal)
if err != nil {
log.Println(err)
}
for i := range deviceTokens {
Send(title, body, deviceTokens[i], "Meal", meal.ID.String(), appScheme)
}
}
// MealUpdated sends a push notification about a meal being updated in a meal plan
func MealUpdated(meal models.Meal, origMealName string, appScheme string) {
var user models.User
userQuery := db.Manager.
Select("name").
Where("id = ?", meal.UserID).
Last(&user).
Error
if err := userQuery; err != nil {
log.Println(err)
}
title := "Meal Updated"
nameTruncated := utils.TruncateString(origMealName, 12)
body := fmt.Sprintf("%v updated \"%v\" in your meal plan", user.Name, nameTruncated)
deviceTokens, err := MealUserTokens(&meal)
if err != nil {
log.Println(err)
}
for i := range deviceTokens {
Send(title, body, deviceTokens[i], "Meal", meal.ID.String(), appScheme)
}
}
// MealUserTokens fetches apns device tokens for all meal users
func MealUserTokens(meal *models.Meal) (tokens []string, err error) {
var mealUsers []models.MealUser
mealUsersQuery := db.Manager.
Select("meal_users.user_id").
Joins("INNER JOIN meals ON meals.id = meal_users.meal_id").
Joins("INNER JOIN stores ON stores.id = meals.store_id").
Joins("INNER JOIN store_users ON store_users.store_id = stores.id").
Joins("INNER JOIN store_user_preferences ON store_user_preferences.store_user_id = store_users.id").
Where("meal_users.meal_id = ?", meal.ID).
Where("meal_users.user_id NOT IN (meals.user_id)").
Where("store_user_preferences.notifications = ?", true).
Group("meal_users.user_id").
Find(&mealUsers).
Error
if err := mealUsersQuery; err != nil {
return tokens, err
}
// Fetch the tokens for each store user
var t []string
for i := range mealUsers {
userTokens, err := DeviceTokensForUser(mealUsers[i].UserID)
if err != nil {
return tokens, err
}
t = append(t, userTokens...)
}
return t, nil
}