controller.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package cast
  2. import (
  3. "context"
  4. "github.com/ente-io/museum/ente"
  5. "github.com/ente-io/museum/ente/cast"
  6. "github.com/ente-io/museum/pkg/controller/access"
  7. castRepo "github.com/ente-io/museum/pkg/repo/cast"
  8. "github.com/ente-io/museum/pkg/utils/auth"
  9. "github.com/ente-io/museum/pkg/utils/network"
  10. "github.com/ente-io/stacktrace"
  11. "github.com/gin-gonic/gin"
  12. "github.com/sirupsen/logrus"
  13. )
  14. type Controller struct {
  15. CastRepo *castRepo.Repository
  16. AccessCtrl access.Controller
  17. }
  18. func NewController(castRepo *castRepo.Repository,
  19. accessCtrl access.Controller,
  20. ) *Controller {
  21. return &Controller{
  22. CastRepo: castRepo,
  23. AccessCtrl: accessCtrl,
  24. }
  25. }
  26. func (c *Controller) RegisterDevice(ctx *gin.Context, request *cast.RegisterDeviceRequest) (string, error) {
  27. return c.CastRepo.AddCode(ctx, request.PublicKey, network.GetClientIP(ctx))
  28. }
  29. func (c *Controller) GetPublicKey(ctx *gin.Context, deviceCode string) (string, error) {
  30. pubKey, ip, err := c.CastRepo.GetPubKeyAndIp(ctx, deviceCode)
  31. if err != nil {
  32. return "", stacktrace.Propagate(err, "")
  33. }
  34. if ip != network.GetClientIP(ctx) {
  35. logrus.WithFields(logrus.Fields{
  36. "deviceCode": deviceCode,
  37. "ip": ip,
  38. "clientIP": network.GetClientIP(ctx),
  39. }).Warn("GetPublicKey: IP mismatch")
  40. return "", &ente.ErrCastIPMismatch
  41. }
  42. return pubKey, nil
  43. }
  44. func (c *Controller) GetEncCastData(ctx context.Context, deviceCode string) (*string, error) {
  45. return c.CastRepo.GetEncCastData(ctx, deviceCode)
  46. }
  47. func (c *Controller) InsertCastData(ctx *gin.Context, request *cast.CastRequest) error {
  48. userID := auth.GetUserID(ctx.Request.Header)
  49. return c.CastRepo.InsertCastData(ctx, userID, request.DeviceCode, request.CollectionID, request.CastToken, request.EncPayload)
  50. }
  51. func (c *Controller) RevokeAllToken(ctx *gin.Context) error {
  52. userID := auth.GetUserID(ctx.Request.Header)
  53. return c.CastRepo.RevokeTokenForUser(ctx, userID)
  54. }
  55. func (c *Controller) GetCollectionAndCasterIDForToken(ctx *gin.Context, token string) (*cast.AuthContext, error) {
  56. collectId, userId, err := c.CastRepo.GetCollectionAndCasterIDForToken(ctx, token)
  57. if err != nil {
  58. return nil, stacktrace.Propagate(err, "")
  59. }
  60. _, err = c.AccessCtrl.GetCollection(ctx, &access.GetCollectionParams{CollectionID: collectId, ActorUserID: userId})
  61. if err != nil {
  62. return nil, stacktrace.Propagate(err, "failed to verify cast access")
  63. }
  64. go c.CastRepo.UpdateLastUsedAtForToken(ctx, token)
  65. return &cast.AuthContext{UserID: userId, CollectionID: collectId}, nil
  66. }