apollo-backend/internal/api/devices.go

89 lines
2.1 KiB
Go
Raw Normal View History

package api
2021-05-10 00:51:15 +00:00
import (
2021-07-26 17:05:09 +00:00
"context"
2021-05-10 00:51:15 +00:00
"encoding/json"
2021-07-26 17:05:09 +00:00
"fmt"
2021-05-10 00:51:15 +00:00
"net/http"
2021-07-26 17:05:09 +00:00
"github.com/dustin/go-humanize/english"
2021-05-10 00:51:15 +00:00
"github.com/julienschmidt/httprouter"
2021-07-26 17:05:09 +00:00
"github.com/sideshow/apns2"
"github.com/sideshow/apns2/payload"
"github.com/sirupsen/logrus"
2021-05-10 00:51:15 +00:00
2021-07-05 23:22:24 +00:00
"github.com/christianselig/apollo-backend/internal/data"
2021-05-10 00:51:15 +00:00
)
func (a *api) upsertDeviceHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
2021-05-10 00:51:15 +00:00
d := &data.Device{}
if err := json.NewDecoder(r.Body).Decode(d); err != nil {
a.errorResponse(w, r, 500, err.Error())
2021-05-10 00:51:15 +00:00
return
}
if err := a.models.Devices.Upsert(d); err != nil {
a.errorResponse(w, r, 500, err.Error())
2021-05-10 00:51:15 +00:00
return
}
w.WriteHeader(http.StatusOK)
}
2021-07-26 17:05:09 +00:00
func (a *api) testDeviceHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
ctx := context.Background()
d, err := a.models.Devices.GetByAPNSToken(ps.ByName("apns"))
if err != nil {
a.logger.WithFields(logrus.Fields{
"err": err,
}).Info("failed fetching device from database")
a.errorResponse(w, r, 500, err.Error())
return
}
stmt := `
SELECT username
FROM accounts
INNER JOIN devices_accounts ON devices.account_id = accounts.id
2021-07-26 17:06:50 +00:00
WHERE devices_accounts.device_id = $1`
2021-07-26 17:05:09 +00:00
rows, err := a.db.Query(ctx, stmt, d.ID)
if err != nil {
a.logger.WithFields(logrus.Fields{
"apns": ps.ByName("apns"),
"err": err,
}).Error("failed to fetch device accounts")
return
}
defer rows.Close()
var users []string
for rows.Next() {
var user string
rows.Scan(&user)
users = append(users, user)
}
body := fmt.Sprintf("Active usernames are: %s", english.OxfordWordSeries(users, "and"))
notification := &apns2.Notification{}
notification.Topic = "com.christianselig.Apollo"
notification.Payload = payload.
NewPayload().
Category("test-notification").
AlertBody(body)
client := apns2.NewTokenClient(a.apns)
if !d.Sandbox {
client = client.Production()
}
if _, err := client.Push(notification); err != nil {
a.logger.WithFields(logrus.Fields{
"err": err,
}).Info("failed to send test notification")
a.errorResponse(w, r, 500, err.Error())
return
}
w.WriteHeader(http.StatusOK)
}