Added: user auth

This commit is contained in:
Aleksandr Soloshenko 2022-10-06 22:06:05 +07:00
parent 7b9316f64d
commit 094c7f1181
5 changed files with 71 additions and 5 deletions

View File

@ -1,19 +1,40 @@
package handlers
import (
"bitbucket.org/capcom6/smsgatewaybackend/internal/smsgateway/models"
"bitbucket.org/capcom6/smsgatewaybackend/internal/smsgateway/services"
microbase "bitbucket.org/soft-c/gomicrobase"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/basicauth"
)
type thirdPartyHandler struct {
microbase.Handler
authSvc *services.AuthService
messagesSvc *services.MessagesService
}
func (h *thirdPartyHandler) postMessage(c *fiber.Ctx) error {
func (h *thirdPartyHandler) postMessage(user models.User, c *fiber.Ctx) error {
return fiber.ErrNotImplemented
}
func (h *thirdPartyHandler) authorize(handler func(models.User, *fiber.Ctx) error) fiber.Handler {
return func(c *fiber.Ctx) error {
username := c.Locals("username").(string)
password := c.Locals("password").(string)
user, err := h.authSvc.AuthorizeUser(username, password)
if err != nil {
errorLog.Println(err)
return fiber.ErrUnauthorized
}
return handler(user, c)
}
}
func (h *thirdPartyHandler) register(router fiber.Router) {
router.Use(basicauth.New(basicauth.Config{
Authorizer: func(username string, password string) bool {
@ -21,9 +42,15 @@ func (h *thirdPartyHandler) register(router fiber.Router) {
},
}))
router.Post("/message", h.postMessage)
router.Post("/message", h.authorize(h.postMessage))
}
func newThirdPartyHandler() *thirdPartyHandler {
return &thirdPartyHandler{}
func newThirdPartyHandler(validator *validator.Validate, authSvc *services.AuthService, messagesSvc *services.MessagesService) *thirdPartyHandler {
return &thirdPartyHandler{
Handler: microbase.Handler{
Validator: validator,
},
authSvc: authSvc,
messagesSvc: messagesSvc,
}
}

View File

@ -18,7 +18,7 @@ func Register(router fiber.Router, db *gorm.DB) error {
messagesSvc := services.NewMessagesService(messages)
newMobileHandler(validator, authSvc, messagesSvc).register(router.Group("/mobile/v1"))
newThirdPartyHandler().register(router.Group("/3rdparty/v1"))
newThirdPartyHandler(validator, authSvc, messagesSvc).register(router.Group("/3rdparty/v1"))
return nil
}

View File

@ -30,6 +30,10 @@ func (r *MessagesRepository) Get(deviceID, ID string) (message models.Message, e
return
}
func (r *MessagesRepository) Insert(message *models.Message) error {
return r.db.Create(message).Error
}
func (r *MessagesRepository) UpdateState(message *models.Message) error {
return r.db.Transaction(func(tx *gorm.DB) error {
if err := tx.Model(message).Select("State").Updates(message).Error; err != nil {

View File

@ -49,6 +49,15 @@ func (s *AuthService) AuthorizeDevice(token string) (models.Device, error) {
return s.devices.GetByToken(token)
}
func (s *AuthService) AuthorizeUser(username, password string) (models.User, error) {
user, err := s.users.GetByLogin(username)
if err != nil {
return user, err
}
return user, crypto.CompareBCryptHash(user.PasswordHash, password)
}
func NewAuthService(users *repositories.UsersRepository, devices *repositories.DevicesRepository) *AuthService {
idgen, _ := nanoid.Standard(21)

View File

@ -43,6 +43,20 @@ func (s *MessagesService) UpdateState(deviceID string, message smsgateway.Messag
return s.messages.UpdateState(&existing)
}
func (s *MessagesService) Enqeue(deviceID string, message smsgateway.Message) error {
msg := models.Message{
DeviceID: deviceID,
ExtID: message.ID,
Message: message.Message,
Recipients: s.recipientsToModel(message.PhoneNumbers),
}
if msg.ExtID == "" {
msg.ExtID = s.idgen()
}
return s.messages.Insert(&msg)
}
func (s *MessagesService) recipientsToDomain(input []models.MessageRecipient) []string {
output := make([]string, len(input))
@ -53,6 +67,18 @@ func (s *MessagesService) recipientsToDomain(input []models.MessageRecipient) []
return output
}
func (s *MessagesService) recipientsToModel(input []string) []models.MessageRecipient {
output := make([]models.MessageRecipient, len(input))
for i, v := range input {
output[i] = models.MessageRecipient{
PhoneNumber: v,
}
}
return output
}
func (s *MessagesService) recipientsStateToModel(input []smsgateway.RecipientState) []models.MessageRecipient {
output := make([]models.MessageRecipient, len(input))