Newer
Older
hypermedia-blazorcrud / Blazorcrud.Client / Services / UserService.cs
@Derek Comartin Derek Comartin on 12 Jul 2 KB Init
using Blazorcrud.Client.Shared;
using Blazorcrud.Shared.Data;
using Blazorcrud.Shared.Models;
using Microsoft.AspNetCore.Components;

namespace Blazorcrud.Client.Services
{
    public class UserService: IUserService
    {
        private IHttpService _httpService;
        private ILocalStorageService _localStorageService;
        private NavigationManager _navigationManager;
        private string _userKey = "user";

        public User User {get; private set;}

        public UserService(IHttpService httpService, ILocalStorageService localStorageService, NavigationManager navigationManager)
        {
            _httpService = httpService;
            _localStorageService = localStorageService;
            _navigationManager = navigationManager;
        }

        public async Task Initialize()
        {
            User = await _localStorageService.GetItem<User>(_userKey);
        }

        public async Task Login(Login model)
        {
            User = await _httpService.Post<User>("/api/user/authenticate", model);
            await _localStorageService.SetItem(_userKey, User);
        }

        public async Task Logout()
        {
            User = null;
            await _localStorageService.RemoveItem(_userKey);
            _navigationManager.NavigateTo("/user/login");
        }

        public async Task<PagedResult<UserViewModel>> GetUsers(string? name, string page)
        {
            return await _httpService.Get<PagedResult<UserViewModel>>("api/user" + "?page=" + page + "&name=" + name);
        }

        public async Task<User> GetUser(int id)
        {
            return await _httpService.Get<User>($"api/user/{id}");
        }

        public async Task DeleteUser(UserViewModel user)
        {
            await _httpService.Delete(user.Operations.Single(x => x.OperationId == "DeleteUser").Uri);
            
            // auto logout if the user deleted their own record
            // dc - this gross, shouldn't be here but higher up in the call stack
            if (user.Id == User.Id)
                await Logout();
        }

        public async Task AddUser(User user)
        {
            await _httpService.Post($"api/user", user);
        }

        public async Task UpdateUser(User user)
        {
            await _httpService.Put($"api/user", user);
            // update local storage if the user updated their own record
            if (user.Id == User.Id)
            {
                User.FirstName = user.FirstName;
                User.LastName = user.LastName;
                User.Username = user.Username;
                await _localStorageService.SetItem(_userKey, User);
            }
        }
    }
}