apollo-backend/internal/api/api.go
2021-07-26 13:54:24 -04:00

76 lines
1.7 KiB
Go

package api
import (
"context"
"fmt"
"net/http"
"os"
"github.com/DataDog/datadog-go/statsd"
"github.com/jackc/pgx/v4/pgxpool"
"github.com/julienschmidt/httprouter"
"github.com/sideshow/apns2/token"
"github.com/sirupsen/logrus"
"github.com/christianselig/apollo-backend/internal/data"
"github.com/christianselig/apollo-backend/internal/reddit"
)
type api struct {
logger *logrus.Logger
statsd *statsd.Client
db *pgxpool.Pool
reddit *reddit.Client
models *data.Models
apns *token.Token
}
func NewAPI(ctx context.Context, logger *logrus.Logger, statsd *statsd.Client, db *pgxpool.Pool) *api {
reddit := reddit.NewClient(
os.Getenv("REDDIT_CLIENT_ID"),
os.Getenv("REDDIT_CLIENT_SECRET"),
statsd,
16,
)
var apns *token.Token
{
authKey, err := token.AuthKeyFromFile(os.Getenv("APPLE_KEY_PATH"))
if err != nil {
panic(err)
}
apns = &token.Token{
AuthKey: authKey,
KeyID: os.Getenv("APPLE_KEY_ID"),
TeamID: os.Getenv("APPLE_TEAM_ID"),
}
}
models := data.NewModels(ctx, db)
return &api{logger, statsd, db, reddit, models, apns}
}
func (a *api) Server(port int) *http.Server {
return &http.Server{
Addr: fmt.Sprintf(":%d", port),
Handler: a.Routes(),
}
}
func (a *api) Routes() *httprouter.Router {
router := httprouter.New()
router.GET("/v1/health", a.healthCheckHandler)
router.POST("/v1/device", a.upsertDeviceHandler)
router.POST("/v1/device/:apns/test", a.testDeviceHandler)
router.POST("/v1/device/:apns/account", a.upsertAccountHandler)
router.DELETE("/v1/device/:apns", a.deleteDeviceHandler)
router.POST("/v1/receipt", a.checkReceiptHandler)
router.POST("/v1/receipt/:apns", a.checkReceiptHandler)
return router
}