udemy-go-microservices/authentication-service/cmd/api/handlers.go
2024-08-31 22:56:25 +02:00

79 lines
1.6 KiB
Go

package main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"net/http"
)
func (app *Config) Authenticate(w http.ResponseWriter, r *http.Request) {
var requestPayload struct {
Email string `json:"email"`
Password string `json:"password"`
}
err := app.readJSON(w, r, &requestPayload)
if err != nil {
app.errorJSON(w, err, http.StatusBadRequest)
return
}
user, err := app.Models.User.GetByEmail(requestPayload.Email)
if err != nil {
// user not found
app.errorJSON(w, errors.New("invalid credentials"), http.StatusBadRequest)
return
}
valid, err := user.PasswordMatches(requestPayload.Password)
if err != nil || !valid {
app.errorJSON(w, errors.New("invalid credentials"), http.StatusBadRequest)
return
}
// log authentication
err = app.logRequest("authentication", fmt.Sprintf("%s is logged in", user.Email))
if err != nil {
app.errorJSON(w, err)
return
}
payload := jsonResponse{
Error: false,
Message: fmt.Sprintf("%s %s is authorized to log in.", user.FirstName, user.LastName),
Data: user,
}
app.writeJSON(w, http.StatusAccepted, payload)
}
func (app *Config) logRequest(name, data string) error {
var entry struct {
Name string `json:"name"`
Data string `json:"data"`
}
entry.Name = name
entry.Data = data
jsonData, _ := json.MarshalIndent(entry, "", "\t")
logServiceURL := "http://logger-service/log"
request, err := http.NewRequest("POST", logServiceURL, bytes.NewBuffer(jsonData))
if err != nil {
return err
}
request.Header.Add("Content-Type", "application/json")
client := &http.Client{}
_, err = client.Do(request)
if err != nil {
return err
}
return nil
}