Files
Core_Be/Services/BootstrapService.cs
Dhananjaya99 bffc9b1686 first commit
2026-09-28 11:44:26 +05:30

90 lines
3.8 KiB
C#

using Fitness_core_BE.Exceptions;
using Fitness_core_BE.Helpers;
using Fitness_core_BE.Infra.UoW;
using Fitness_core_BE.Interfaces.Services;
using Fitness_core_BE.Models;
using Fitness_core_BE.Models.Enums;
using Microsoft.EntityFrameworkCore;
namespace Fitness_core_BE.Services
{
// GYM's onboarding/activation flow (ClientController's "onboarding/requests" ->
// "activation/{token}" endpoints) is a multi-gym SaaS signup wizard -- OTP checks, NIC
// upload, a payment-method + platform-billing charge step -- built for a platform onboarding
// many paying gym clients. Vijaya is a single, already-real club, not a SaaS signup; this
// is the one-time "create the club" step instead, guarded so it can only ever run once
// (before that first Client row exists) rather than being a repeatable registration path.
public class BootstrapService : IBootstrapService
{
private readonly CentralDbContext _central;
private readonly IUnitOfWork _uow;
public BootstrapService(CentralDbContext central, IUnitOfWork uow)
{
_central = central;
_uow = uow;
}
public async Task<object> BootstrapClub(object payload)
{
await _uow.BeginAsync();
try
{
if (await _central.Client.AnyAsync())
throw new BadRequestException("The club is already set up.");
var data = DeserializePayload.Deserialize(payload);
if (!data.ContainsKey("userId")) throw new ArgumentException("userId is required");
if (!data.ContainsKey("clientName")) throw new ArgumentException("clientName is required");
var userId = Guid.Parse(data["userId"].GetString()!);
var clientName = data["clientName"].GetString()!;
// core-api keeps its own local mirror of user identity (see CustomerRepository/
// StaffRepository doing the same on customer/staff creation) -- Client.FKUserId
// has a real local FK to this table, not to auth-service's database, since the
// two services no longer share a connection. Idempotent: harmless if a mirror
// row already exists for this user id.
if (!await _central.Users.AnyAsync(u => u.UserId == userId))
{
_central.Users.Add(new User
{
UserId = userId,
Email = data.ContainsKey("clientEmail") ? data["clientEmail"].GetString() : null,
PhoneNumber = data.ContainsKey("clientPhone") ? data["clientPhone"].GetString() : null,
IsActive = true
});
}
var client = new Client
{
ClientId = Guid.NewGuid(),
FKUserId = userId,
ClientName = clientName,
ClientPhone = data.ContainsKey("clientPhone") ? data["clientPhone"].GetString() : null,
ClientEmail = data.ContainsKey("clientEmail") ? data["clientEmail"].GetString() : null
};
_central.Client.Add(client);
_central.ClientBusiness.Add(new ClientBusiness
{
Bid = Guid.NewGuid(),
FKClientId = client.ClientId,
BusinessType = BusinessType.institute,
BusinessName = clientName,
IsActive = true
});
await _uow.CommitAsync();
return new { clientId = client.ClientId, clientName = client.ClientName };
}
catch
{
await _uow.RollbackAsync();
throw;
}
}
}
}