151 lines
3.9 KiB
Go
151 lines
3.9 KiB
Go
package core
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
customErrors "ips-lacpass-backend/internal/errors"
|
|
"ips-lacpass-backend/internal/repository/fhir"
|
|
"ips-lacpass-backend/internal/repository/vhl"
|
|
"sort"
|
|
|
|
authMiddleware "ips-lacpass-backend/internal/middleware"
|
|
)
|
|
|
|
type UserService struct {
|
|
Repository UserRepository
|
|
}
|
|
|
|
type FhirService struct {
|
|
Repository fhir.FhirRepository
|
|
}
|
|
|
|
type VhlService struct {
|
|
Repository vhl.VhlRepository
|
|
}
|
|
|
|
func NewUserService(r UserRepository) UserService {
|
|
return UserService{
|
|
Repository: r,
|
|
}
|
|
}
|
|
|
|
func NewFhirService(r fhir.FhirRepository) FhirService {
|
|
return FhirService{
|
|
Repository: r,
|
|
}
|
|
}
|
|
|
|
func NewVhlService(r vhl.VhlRepository) VhlService {
|
|
return VhlService{
|
|
Repository: r,
|
|
}
|
|
}
|
|
|
|
func (us *UserService) CreateUser(ctx context.Context, ur UserRequest) (*User, error) {
|
|
|
|
user := &User{
|
|
Username: ur.Identifier,
|
|
Email: ur.Email,
|
|
FirstName: ur.FirstName,
|
|
LastName: ur.LastName,
|
|
Locale: ur.Locale,
|
|
DocumentType: ur.DocumentType,
|
|
Identifier: ur.Identifier,
|
|
}
|
|
|
|
resp, err := us.Repository.CreateUser(ctx, *user, ur.Password)
|
|
if err != nil {
|
|
var uErr *customErrors.HttpError
|
|
if errors.As(err, &uErr) {
|
|
return nil, uErr
|
|
}
|
|
return nil, &customErrors.HttpError{
|
|
StatusCode: 502,
|
|
Body: []map[string]interface{}{{"error": "auth_service_error", "message": "Failed to connect to authentication service"}}, Err: err,
|
|
}
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (us *UserService) UpdateUser(ctx context.Context, ur UserUpdateRequest) (*User, error) {
|
|
|
|
userUUID, err := authMiddleware.GetUserUUIDFromContext(ctx)
|
|
if err != nil {
|
|
return nil, &customErrors.HttpError{
|
|
StatusCode: 401,
|
|
Body: []map[string]interface{}{{"error": "user_uuid_not_found", "message": "User UUID not found in request context"}},
|
|
Err: err,
|
|
}
|
|
}
|
|
|
|
resp, err := us.Repository.UpdateUser(ctx, userUUID, ur)
|
|
if err != nil {
|
|
var uErr *customErrors.HttpError
|
|
if errors.As(err, &uErr) {
|
|
return nil, uErr
|
|
}
|
|
return nil, &customErrors.HttpError{
|
|
StatusCode: 502,
|
|
Body: []map[string]interface{}{{"error": "auth_service_error", "message": "Failed to connect to authentication service"}}, Err: err,
|
|
}
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (fs *FhirService) GetIps(ctx context.Context) (map[string]interface{}, error) {
|
|
userId, err := authMiddleware.GetUserDocIDFromContext(ctx)
|
|
if err != nil {
|
|
return nil, &customErrors.HttpError{
|
|
StatusCode: 401,
|
|
Body: []map[string]interface{}{{"error": "user_identifier_not_found", "message": "User identifier not found in request context"}},
|
|
Err: err,
|
|
}
|
|
}
|
|
|
|
bundle, err := fs.Repository.GetDocumentReference(userId)
|
|
if err != nil {
|
|
fmt.Printf("Error fetching document reference: %v\n", err)
|
|
return nil, err
|
|
}
|
|
entries := bundle.Entry
|
|
if len(entries) == 0 {
|
|
return nil, &customErrors.HttpError{
|
|
StatusCode: 404,
|
|
Body: []map[string]interface{}{{"error": "not_found", "message": "No IPS found for the user"}},
|
|
Err: fmt.Errorf("no IPS found for the user"),
|
|
}
|
|
}
|
|
sort.Slice(entries, func(i, j int) bool {
|
|
return entries[i].Resource.Meta.LastUpdated > entries[j].Resource.Meta.LastUpdated
|
|
})
|
|
|
|
ipsBundle, err := fs.Repository.GetIpsBundle(entries[0].Resource.Content[0].Attachment.URL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ipsBundle, nil
|
|
|
|
}
|
|
|
|
func (vs *VhlService) CreateQrCode(ctx context.Context, expiresOn *string, content *string, passCode *string) (*vhl.QrData, error) {
|
|
if content == nil || *content == "" {
|
|
return nil, &customErrors.HttpError{
|
|
StatusCode: 400,
|
|
Body: []map[string]interface{}{{"error": "invalid_request", "message": "Content cannot be empty"}},
|
|
Err: errors.New("content cannot be empty"),
|
|
}
|
|
}
|
|
|
|
qrData, err := vs.Repository.CreateQr(ctx, vhl.CreateQrRequest{
|
|
JsonContent: *content,
|
|
ExpiresOn: *expiresOn,
|
|
PassCode: *passCode,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return qrData, nil
|
|
}
|