2025-02-28 10:05:23 +05:00

121 lines
3.1 KiB
Go

package auth
import (
"bytes"
"donat-widget/internal/model"
"donat-widget/internal/model/api"
"donat-widget/pkg/custom_response"
"encoding/json"
"errors"
"io"
"log/slog"
"net/http"
"strconv"
)
func New(host, port string) *ClientAuth {
return &ClientAuth{
client: &http.Client{},
baseURL: "http://" + host + ":" + port + "/api/auth",
}
}
type ClientAuth struct {
client *http.Client
baseURL string
}
func (c *ClientAuth) CheckToken(
accessToken model.Token,
) (api.CheckTokenResponse, error) {
req, err := http.NewRequest("GET", c.baseURL+"/token/check", nil)
if err != nil {
slog.Error("http.NewRequest: " + err.Error())
return api.CheckTokenResponse{}, errors.New(custom_response.InternalError)
}
req.Header.Set("Authorization", string(accessToken))
resp, err := c.client.Do(req)
if err != nil {
slog.Error("client.Do: " + err.Error())
return api.CheckTokenResponse{}, errors.New(custom_response.InternalError)
}
response, err := io.ReadAll(resp.Body)
if err != nil {
slog.Error("io.ReadAll: " + err.Error())
return api.CheckTokenResponse{}, errors.New(custom_response.InternalError)
}
if resp.StatusCode != http.StatusOK {
var errorResponse custom_response.MessageErrorResponse
err = json.Unmarshal(response, &errorResponse)
return api.CheckTokenResponse{}, errors.New(errorResponse.Message)
}
checkTokenResponse := api.CheckTokenResponse{}
err = json.Unmarshal(response, &checkTokenResponse)
if err != nil {
slog.Error("json.Unmarshal: " + err.Error())
return api.CheckTokenResponse{}, errors.New(custom_response.InternalError)
}
return checkTokenResponse, nil
}
func (c *ClientAuth) VerifyTwoFa(
twoFaCode string,
streamerID model.StreamerID,
) (bool, error) {
_accountID := strconv.Itoa(int(streamerID))
path := c.baseURL + "/twoFa/verify" + "/" + _accountID + "/" + string(twoFaCode)
req, err := http.NewRequest("GET", path, nil)
if err != nil {
slog.Error("http.NewRequest: " + err.Error())
return false, err
}
resp, err := c.client.Do(req)
if err != nil {
slog.Error("client.Do: " + err.Error())
return false, err
}
if resp.StatusCode != http.StatusOK {
return false, errors.New("get failed: " + resp.Status)
}
response, err := io.ReadAll(resp.Body)
if err != nil {
slog.Error("io.ReadAll: " + err.Error())
return false, err
}
var verifyTokenResponse api.VerifyTokenResponse
err = json.Unmarshal(response, &verifyTokenResponse)
if err != nil {
slog.Error("json.Unmarshal: " + err.Error())
return false, err
}
return verifyTokenResponse.Verified, nil
}
func (c *ClientAuth) post(path string, body map[string]any) ([]byte, error) {
bytesBody, _ := json.Marshal(body)
resp, err := c.client.Post(c.baseURL+path, "application/json", bytes.NewReader(bytesBody))
if err != nil {
slog.Error("c.client.Post: " + err.Error())
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, errors.New("tinkoff: post failed: " + resp.Status)
}
response, err := io.ReadAll(resp.Body)
if err != nil {
slog.Error("io.ReadAll: " + err.Error())
return nil, err
}
return response, nil
}