Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;

namespace EventPlatform.Application.Contracts.Dtos
{
public class AdminDashboardSummaryDto
{
public int TotalEvents { get; set; }
public int PendingEvents { get; set; }
public int TotalUsers { get; set; }
public int TotalTransactions { get; set; }
public decimal TotalRevenue { get; set; }
}
}
19 changes: 19 additions & 0 deletions EventPlatform.Application/Contracts/Dtos/AdminEventDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;

namespace EventPlatform.Application.Contracts.Dtos
{
public class AdminEventDto
{
public int EventId { get; set; }
public string Title { get; set; } = string.Empty;
public string EventType { get; set; } = string.Empty;
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public string EventStatus { get; set; } = string.Empty;
public string? Location { get; set; }
public string? OnlineUrl { get; set; }
public DateTime? CreatedAt { get; set; }
public string SubmittedByName { get; set; } = string.Empty;
public string SubmittedByEmail { get; set; } = string.Empty;
}
}
17 changes: 17 additions & 0 deletions EventPlatform.Application/Contracts/Dtos/AdminTransactionDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;

namespace EventPlatform.Application.Contracts.Dtos
{
public class AdminTransactionDto
{
public int TransactionId { get; set; }
public decimal Amount { get; set; }
public string PaymentStatus { get; set; } = string.Empty;
public string? PaymentGateway { get; set; }
public string? GatewayTransactionId { get; set; }
public DateTime? TransactionDate { get; set; }
public string BuyerName { get; set; } = string.Empty;
public string BuyerEmail { get; set; } = string.Empty;
public string EventTitle { get; set; } = string.Empty;
}
}
15 changes: 15 additions & 0 deletions EventPlatform.Application/Contracts/Dtos/AdminUserDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;

namespace EventPlatform.Application.Contracts.Dtos
{
public class AdminUserDto
{
public Guid UserId { get; set; }
public string FullName { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
public string Role { get; set; } = string.Empty;
public string AccountStatus { get; set; } = string.Empty;
public DateTime? CreatedAt { get; set; }
public int TotalRegistrations { get; set; }
}
}
18 changes: 18 additions & 0 deletions EventPlatform.Application/Contracts/Dtos/JoinMeetingInfoDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System;

namespace EventPlatform.Application.Contracts.Dtos
{
public class JoinMeetingInfoDto
{
public Guid RegistrationId { get; set; }
public Guid UserId { get; set; }
public int EventId { get; set; }
public string Title { get; set; } = string.Empty;
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public string RoomId { get; set; } = string.Empty;
public string Role { get; set; }
public string UserName { get; set; } = string.Empty;
public string UserIdentifier { get; set; } = string.Empty;
}
}
25 changes: 25 additions & 0 deletions EventPlatform.Application/Contracts/Dtos/UserRegistrationDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;

namespace EventPlatform.Application.Contracts.Dtos
{
public class UserRegistrationDto
{
public Guid RegistrationId { get; set; }
public Guid UserId { get; set; }
public int EventId { get; set; }
public string Title { get; set; } = string.Empty;
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public string EventType { get; set; } = string.Empty;
public string? Location { get; set; }
public string? OnlineUrl { get; set; }
public string EventStatus { get; set; } = string.Empty;
public bool IsOnline { get; set; }
public int TicketTypeId { get; set; }
public string TicketTypeName { get; set; } = string.Empty;
public decimal TicketPrice { get; set; }
public DateTime? RegistrationDate { get; set; }
public string UniqueToken { get; set; } = string.Empty;
public DateTime? CheckInTime { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace EventPlatform.Application.Contracts.Requests.Admin
{
public class RejectEventRequest
{
public string? Reason { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Threading.Tasks;
using EventPlatform.Application.Contracts.Dtos;

namespace EventPlatform.Application.Services.Interfaces.Admin
{
public interface IAdminService
{
Task<AdminDashboardSummaryDto> GetDashboardSummaryAsync();
Task<PaginatedResult<AdminEventDto>> GetEventsAsync(string? status, string? keyword, int pageNumber, int pageSize);
Task<bool> UpdateEventStatusAsync(int eventId, string newStatus);
Task<PaginatedResult<AdminTransactionDto>> GetTransactionsAsync(string? status, int pageNumber, int pageSize);
Task<PaginatedResult<AdminUserDto>> GetUsersAsync(string? role, string? accountStatus, int pageNumber, int pageSize);
Task<bool> UpdateUserStatusAsync(Guid userId, string newStatus);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using EventPlatform.Application.Contracts.Requests;
using EventPlatform.Application.Contracts.Dtos;
using EventPlatform.Application.Contracts.Requests;
using EventPlatform.Application.Contracts.Responses;
using System;
using System.Collections.Generic;
Expand All @@ -11,6 +12,8 @@ namespace EventPlatform.Application.Services.Interfaces.Event
public interface IRegistrationService
{
Task<BookingResponse> CreateBookingAsync(CreateBookingRequest request);
Task<IEnumerable<UserRegistrationDto>> GetMyRegistrationsAsync();
Task<JoinMeetingInfoDto> GetJoinMeetingInfoAsync(Guid registrationId);
Task CancelBookingAsync(CancelBookingRequest request);
}
}
219 changes: 219 additions & 0 deletions EventPlatform.Infrastructure/Services/Admin/AdminService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using EventPlatform.Application.Contracts.Dtos;
using EventPlatform.Application.Services.Interfaces.Admin;
using EventPlatform.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;

namespace EventPlatform.Infrastructure.Services.Admin
{
public class AdminService : IAdminService
{
private readonly ApplicationDbContext _context;

public AdminService(ApplicationDbContext context)
{
_context = context;
}

public async Task<AdminDashboardSummaryDto> GetDashboardSummaryAsync()
{
var totalEvents = await _context.Events.CountAsync();
var pendingEvents = await _context.Events.CountAsync(e => e.EventStatus == "Pending");
var totalUsers = await _context.Users.CountAsync();
var totalTransactions = await _context.Transactions.CountAsync();
var totalRevenue = await _context.Transactions
.Where(t => t.PaymentStatus == "Success" || t.PaymentStatus == "Completed")
.SumAsync(t => (decimal?)t.Amount) ?? 0m;

return new AdminDashboardSummaryDto
{
TotalEvents = totalEvents,
PendingEvents = pendingEvents,
TotalUsers = totalUsers,
TotalTransactions = totalTransactions,
TotalRevenue = totalRevenue
};
}

public async Task<PaginatedResult<AdminEventDto>> GetEventsAsync(string? status, string? keyword, int pageNumber, int pageSize)
{
pageNumber = Math.Max(1, pageNumber);
pageSize = Math.Clamp(pageSize, 1, 100);

var query = _context.Events
.AsNoTracking()
.Include(e => e.CreatedByUser)
.AsQueryable();

if (!string.IsNullOrWhiteSpace(status))
{
query = query.Where(e => e.EventStatus == status);
}

if (!string.IsNullOrWhiteSpace(keyword))
{
keyword = keyword.Trim();
query = query.Where(e => e.Title.Contains(keyword) || e.Description.Contains(keyword));
}

var totalCount = await query.CountAsync();
var items = await query
.OrderByDescending(e => e.CreatedAt ?? e.StartTime)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.Select(e => new AdminEventDto
{
EventId = e.EventId,
Title = e.Title,
EventType = e.EventType,
StartTime = e.StartTime,
EndTime = e.EndTime,
EventStatus = e.EventStatus,
Location = e.Location,
OnlineUrl = e.OnlineUrl,
CreatedAt = e.CreatedAt,
SubmittedByName = e.CreatedByUser.FullName,
SubmittedByEmail = e.CreatedByUser.Email
})
.ToListAsync();

return new PaginatedResult<AdminEventDto>
{
Items = items,
PageNumber = pageNumber,
PageSize = pageSize,
TotalCount = totalCount
};
}

public async Task<bool> UpdateEventStatusAsync(int eventId, string newStatus)
{
var eventEntity = await _context.Events.FindAsync(eventId);
if (eventEntity == null)
{
return false;
}

if (!string.Equals(eventEntity.EventStatus, newStatus, StringComparison.OrdinalIgnoreCase))
{
eventEntity.EventStatus = newStatus;
eventEntity.UpdatedAt = DateTime.UtcNow;
_context.Events.Update(eventEntity);
await _context.SaveChangesAsync();
}

return true;
}

public async Task<PaginatedResult<AdminTransactionDto>> GetTransactionsAsync(string? status, int pageNumber, int pageSize)
{
pageNumber = Math.Max(1, pageNumber);
pageSize = Math.Clamp(pageSize, 1, 100);

var query = _context.Transactions
.AsNoTracking()
.Include(t => t.Registration)
.ThenInclude(r => r.User)
.Include(t => t.Registration)
.ThenInclude(r => r.TicketType)
.ThenInclude(tt => tt.Event)
.AsQueryable();

if (!string.IsNullOrWhiteSpace(status))
{
query = query.Where(t => t.PaymentStatus == status);
}

var totalCount = await query.CountAsync();
var items = await query
.OrderByDescending(t => t.TransactionDate ?? DateTime.MinValue)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.Select(t => new AdminTransactionDto
{
TransactionId = t.TransactionId,
Amount = t.Amount,
PaymentStatus = t.PaymentStatus,
PaymentGateway = t.PaymentGateway,
GatewayTransactionId = t.GatewayTransactionId,
TransactionDate = t.TransactionDate,
BuyerName = t.Registration.User.FullName,
BuyerEmail = t.Registration.User.Email,
EventTitle = t.Registration.TicketType.Event.Title
})
.ToListAsync();

return new PaginatedResult<AdminTransactionDto>
{
Items = items,
PageNumber = pageNumber,
PageSize = pageSize,
TotalCount = totalCount
};
}

public async Task<PaginatedResult<AdminUserDto>> GetUsersAsync(string? role, string? accountStatus, int pageNumber, int pageSize)
{
pageNumber = Math.Max(1, pageNumber);
pageSize = Math.Clamp(pageSize, 1, 100);

var query = _context.Users.AsNoTracking().AsQueryable();

if (!string.IsNullOrWhiteSpace(role))
{
query = query.Where(u => u.Role == role);
}

if (!string.IsNullOrWhiteSpace(accountStatus))
{
query = query.Where(u => u.AccountStatus == accountStatus);
}

var totalCount = await query.CountAsync();
var items = await query
.OrderByDescending(u => u.CreatedAt)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.Select(u => new AdminUserDto
{
UserId = u.UserId,
FullName = u.FullName,
Email = u.Email,
Role = u.Role,
AccountStatus = u.AccountStatus,
CreatedAt = u.CreatedAt,
TotalRegistrations = u.Registrations.Count
})
.ToListAsync();

return new PaginatedResult<AdminUserDto>
{
Items = items,
PageNumber = pageNumber,
PageSize = pageSize,
TotalCount = totalCount
};
}

public async Task<bool> UpdateUserStatusAsync(Guid userId, string newStatus)
{
var user = await _context.Users.FindAsync(userId);
if (user == null)
{
return false;
}

if (!string.Equals(user.AccountStatus, newStatus, StringComparison.OrdinalIgnoreCase))
{
user.AccountStatus = newStatus;
user.UpdatedAt = DateTime.UtcNow;
_context.Users.Update(user);
await _context.SaveChangesAsync();
}

return true;
}
}
}
Loading