shoc-backend/Api.SeaHavenIndustries/Controllers/AccountController.cs

165 lines
5.3 KiB
C#
Raw Normal View History

2026-01-21 15:41:19 -06:00
using Api.SeaHavenIndustries.DTOs;
using Data.SeaHavenIndustries;
2026-05-14 11:00:12 -05:00
using FluentValidation;
2026-01-21 15:41:19 -06:00
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
2026-05-06 10:49:33 -05:00
using SeaHaven.Services.Interfaces;
using SeaHaven.Services.DTOs;
2026-05-14 11:00:12 -05:00
using System.Security.Claims;
2026-01-21 15:41:19 -06:00
[ApiController]
[Route("api/Account")]
[Route("api/accounts")]
2026-01-21 16:24:54 -06:00
public class AccountController : ControllerBase
2026-01-21 15:41:19 -06:00
{
2026-05-06 10:49:33 -05:00
private readonly IAccountService _accountService;
2026-01-21 15:41:19 -06:00
2026-05-06 10:49:33 -05:00
public AccountController(IAccountService accountService)
2026-01-21 15:41:19 -06:00
{
2026-05-06 10:49:33 -05:00
_accountService = accountService;
2026-01-21 15:41:19 -06:00
}
// -----------------------------------
// POST: api/Account/AddAccounts
// -----------------------------------
[HttpPost("AddAccounts")]
public async Task<IActionResult> AddAccounts(Account_DTO dto)
{
try
{
2026-05-06 10:49:33 -05:00
var createDto = new CreateAccountDTO
2026-01-21 15:41:19 -06:00
{
2026-05-06 10:49:33 -05:00
Name = dto.Name ?? throw new ArgumentException("Name is required"),
2026-01-21 15:41:19 -06:00
Phone = dto.Phone,
Email = dto.Email,
2026-05-06 10:49:33 -05:00
Website = dto.Website
2026-01-21 15:41:19 -06:00
};
2026-05-14 11:00:12 -05:00
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (userId == null)
return Unauthorized(new Response { Status = "Error", Message = "User not authenticated" });
2026-05-06 10:49:33 -05:00
await _accountService.CreateAccountAsync(createDto, userId);
2026-01-21 15:41:19 -06:00
return Ok(new DataResponse
{
Message = "Account added successfully.",
Status = "200"
});
}
2026-05-14 11:00:12 -05:00
catch (ValidationException vex)
{
var errors = string.Join(", ", vex.Errors.Select(e => e.ErrorMessage));
return BadRequest(new Response { Status = "Validation Error", Message = errors });
}
2026-01-21 15:41:19 -06:00
catch (Exception ex)
{
2026-05-14 11:00:12 -05:00
return StatusCode(500, new Response { Status = "Error", Message = ex.Message });
2026-01-21 15:41:19 -06:00
}
}
// -----------------------------------
// POST: api/Account/EditAccounts
// -----------------------------------
[HttpPost("EditAccounts")]
public async Task<IActionResult> EditAccounts(EditAccount_DTO dto)
{
try
{
2026-05-06 10:49:33 -05:00
var updateDto = new UpdateAccountDTO
{
Name = dto.Name,
Phone = dto.Phone,
Email = dto.Email,
Website = dto.Website
};
2026-01-21 15:41:19 -06:00
2026-05-14 11:00:12 -05:00
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (userId == null)
return Unauthorized(new Response { Status = "Error", Message = "User not authenticated" });
2026-05-06 10:49:33 -05:00
await _accountService.UpdateAccountAsync(dto.Id, updateDto, userId);
2026-01-21 15:41:19 -06:00
return Ok(new DataResponse
{
Message = "Account updated successfully.",
Status = "200"
});
}
2026-05-14 11:00:12 -05:00
catch (ValidationException vex)
{
var errors = string.Join(", ", vex.Errors.Select(e => e.ErrorMessage));
return BadRequest(new Response { Status = "Validation Error", Message = errors });
}
catch (KeyNotFoundException)
{
return NotFound(new Response { Status = "Error", Message = "Account not found" });
}
2026-01-21 15:41:19 -06:00
catch (Exception ex)
{
2026-05-14 11:00:12 -05:00
return StatusCode(500, new Response { Status = "Error", Message = ex.Message });
2026-01-21 15:41:19 -06:00
}
}
// -----------------------------------
// GET: api/Account/DeleteAccounts?id=5
// -----------------------------------
[HttpGet("DeleteAccounts")]
public async Task<IActionResult> DeleteAccounts(int id)
{
try
{
2026-05-14 11:00:12 -05:00
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (userId == null)
return Unauthorized(new Response { Status = "Error", Message = "User not authenticated" });
2026-05-06 10:49:33 -05:00
await _accountService.DeleteAccountAsync(id, userId);
2026-01-21 15:41:19 -06:00
return Ok(new DataResponse
{
Message = "Account deleted successfully.",
Status = "200"
});
}
2026-05-14 11:00:12 -05:00
catch (KeyNotFoundException)
{
return NotFound(new Response { Status = "Error", Message = "Account not found" });
}
2026-01-21 15:41:19 -06:00
catch (Exception ex)
{
2026-05-14 11:00:12 -05:00
return StatusCode(500, new Response { Status = "Error", Message = ex.Message });
2026-01-21 15:41:19 -06:00
}
}
// -----------------------------------
// GET: api/Account/GetAccountList?search=&page=&pageSize=
// -----------------------------------
[HttpGet("GetAccountList")]
2026-05-06 10:49:33 -05:00
public async Task<IActionResult> GetAccountList(string? search = "", int page = 1, int pageSize = 12)
2026-01-21 15:41:19 -06:00
{
2026-05-06 10:49:33 -05:00
var pagedResult = await _accountService.GetAccountsPagedAsync(page, pageSize, search);
2026-01-21 15:41:19 -06:00
2026-05-06 10:49:33 -05:00
var data = pagedResult.Items.Select(a => new
2026-01-21 15:41:19 -06:00
{
2026-05-06 10:49:33 -05:00
Id = a.Id,
Name = a.Name,
Type = a.Type ?? "",
Phone = a.Phone,
Email = a.Email,
Industry = (int?)null, // Map if needed
Website = a.Website
});
2026-01-21 15:41:19 -06:00
var viewModel = new Pagination_DTO
{
Data = data,
PageNumber = page,
PageSize = pageSize,
2026-05-06 10:49:33 -05:00
TotalCount = pagedResult.TotalCount,
TotalPages = (int)Math.Ceiling(pagedResult.TotalCount / (double)pageSize)
2026-01-21 15:41:19 -06:00
};
return Ok(viewModel);
}
}