using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Protos.Account; using Grpc.Core; using Google.Protobuf.WellKnownTypes; using Microsoft.EntityFrameworkCore; using DysonNetwork.Pass.Auth; namespace DysonNetwork.Pass.Account; public class AccountGrpcService(AppDatabase db, AuthService auth) : DysonNetwork.Shared.Protos.Account.AccountService.AccountServiceBase { public override async Task GetAccount(Empty request, ServerCallContext context) { var account = await GetAccountFromContext(context); return ToAccountResponse(account); } public override async Task UpdateAccount(UpdateAccountRequest request, ServerCallContext context) { var account = await GetAccountFromContext(context); // TODO: implement await db.SaveChangesAsync(); return ToAccountResponse(account); } private async Task GetAccountFromContext(ServerCallContext context) { var authorizationHeader = context.RequestHeaders.FirstOrDefault(h => h.Key == "authorization"); if (authorizationHeader == null) { throw new RpcException(new Grpc.Core.Status(StatusCode.Unauthenticated, "Missing authorization header.")); } var token = authorizationHeader.Value.Replace("Bearer ", ""); if (!auth.ValidateToken(token, out var sessionId)) { throw new RpcException(new Grpc.Core.Status(StatusCode.Unauthenticated, "Invalid token.")); } var session = await db.AuthSessions.Include(s => s.Account).ThenInclude(a => a.Contacts) .FirstOrDefaultAsync(s => s.Id == sessionId); if (session == null) { throw new RpcException(new Grpc.Core.Status(StatusCode.Unauthenticated, "Session not found.")); } return session.Account; } private AccountResponse ToAccountResponse(Shared.Models.Account account) { // TODO: implement return new AccountResponse { }; } }