Implement Basic Currency System

This commit is contained in:
Alan Moon 2025-06-19 14:37:01 -07:00
parent eb0b957020
commit 818ba48924
6 changed files with 78 additions and 6 deletions

View File

@ -152,5 +152,22 @@ namespace qtc_api.Controllers
var result = await _userService.DeleteUser(id); var result = await _userService.DeleteUser(id);
return Ok(result); return Ok(result);
} }
[HttpPost("update-user-currency")]
[Authorize]
public async Task<ActionResult<ServiceResponse<int>>> UpdateUserCurrency(int amount, bool isSpinClaim)
{
var identity = HttpContext.User.Identity as ClaimsIdentity;
if (identity != null)
{
IEnumerable<Claim> claims = identity.Claims;
var id = claims.First().Value;
if (id != null) return Ok(await _userService.AddCurrencyToUser(id, amount, isSpinClaim));
else return Ok(new ServiceResponse<int> { Success = false, Message = "Identity Has No User ID" });
}
else return Ok(new ServiceResponse<int> { Success = false, Message = "No Identity" });
}
} }
} }

View File

@ -10,5 +10,6 @@
public DateTime DateOfBirth { get; set; } = new DateTime(); public DateTime DateOfBirth { get; set; } = new DateTime();
public DateTime CreatedAt { get; set; } = new DateTime(); public DateTime CreatedAt { get; set; } = new DateTime();
public int Status { get; set; } = 0; public int Status { get; set; } = 0;
public int CurrencyAmount { get; set; } = 0;
} }
} }

View File

@ -19,6 +19,7 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddDbContext<DataContext>();
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSignalR(); builder.Services.AddSignalR();
@ -34,9 +35,10 @@ builder.Services.AddAuthentication().AddJwtBearer(options =>
ValidAudience = builder.Configuration["Jwt:Audience"] ValidAudience = builder.Configuration["Jwt:Audience"]
}; };
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("JWT_KEY"))) var jwtKey = Environment.GetEnvironmentVariable("JWT_KEY");
options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Environment.GetEnvironmentVariable("JWT_KEY")!)); if (jwtKey != null)
else options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!)); options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));
else throw new Exception("Cannot Find Environment Variables 'JWT_KEY'. Please Check Environment.");
}); });
builder.Services.AddScoped<IUserService, UserService>(); builder.Services.AddScoped<IUserService, UserService>();
builder.Services.AddScoped<ITokenService, TokenService>(); builder.Services.AddScoped<ITokenService, TokenService>();

View File

@ -2,10 +2,11 @@
"profiles": { "profiles": {
"http": { "http": {
"commandName": "Project", "commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development",
"DB_PROVIDER": "SQLite",
"DB_CONNECTION_STRING": "Data Source=qtcdev.db",
"JWT_KEY": "iPBR1ZO9GHsP04SUf*jE4ILh5jwz$3$A"
}, },
"dotnetRunMessages": true, "dotnetRunMessages": true,
"applicationUrl": "http://localhost:5268" "applicationUrl": "http://localhost:5268"

View File

@ -15,5 +15,7 @@ namespace qtc_api.Services.UserService
public Task<ServiceResponse<FileContentResult>> GetUserPic(string userId); public Task<ServiceResponse<FileContentResult>> GetUserPic(string userId);
public Task<ServiceResponse<UserStatusDto>> UpdateStatus(UserStatusDto request); public Task<ServiceResponse<UserStatusDto>> UpdateStatus(UserStatusDto request);
public Task<ServiceResponse<User>> DeleteUser(string id); public Task<ServiceResponse<User>> DeleteUser(string id);
public Task<ServiceResponse<int>> AddCurrencyToUser(string id, int amount, bool isSpinClaim);
public Task<ServiceResponse<int>> RemoveCurrencyFromUser(string id, int amount);
} }
} }

View File

@ -106,6 +106,7 @@
x.Role = user.Role; x.Role = user.Role;
x.Bio = user.Bio; x.Bio = user.Bio;
x.DateOfBirth = user.DateOfBirth; x.DateOfBirth = user.DateOfBirth;
x.CurrencyAmount = user.CurrencyAmount;
userInfoList.Add(x); userInfoList.Add(x);
} }
@ -134,6 +135,7 @@
x.Status = user.Status; x.Status = user.Status;
x.DateOfBirth = user.DateOfBirth; x.DateOfBirth = user.DateOfBirth;
x.CreatedAt = user.CreatedAt; x.CreatedAt = user.CreatedAt;
x.CurrencyAmount = user.CurrencyAmount;
onlineUsers.Add(x); onlineUsers.Add(x);
} }
@ -170,6 +172,7 @@
dto.DateOfBirth = user.DateOfBirth; dto.DateOfBirth = user.DateOfBirth;
dto.CreatedAt = user.CreatedAt; dto.CreatedAt = user.CreatedAt;
dto.Status = user.Status; dto.Status = user.Status;
dto.CurrencyAmount = user.CurrencyAmount;
serviceResponse.Success = true; serviceResponse.Success = true;
serviceResponse.Data = dto; serviceResponse.Data = dto;
@ -214,6 +217,7 @@
infoDto.DateOfBirth = request.DateOfBirth; infoDto.DateOfBirth = request.DateOfBirth;
infoDto.CreatedAt = dbUser.CreatedAt; infoDto.CreatedAt = dbUser.CreatedAt;
infoDto.Status = dbUser.Status; infoDto.Status = dbUser.Status;
infoDto.CurrencyAmount = dbUser.CurrencyAmount;
serviceResponse.Success = true; serviceResponse.Success = true;
serviceResponse.Data = infoDto; serviceResponse.Data = infoDto;
@ -329,6 +333,51 @@
return serviceResponse; return serviceResponse;
} }
public async Task<ServiceResponse<int>> AddCurrencyToUser(string id, int amount, bool isSpinClaim)
{
var response = new ServiceResponse<int>();
var user = _dataContext.Users.FirstOrDefault(e => e.Id == id);
if (user != null)
{
user.CurrencyAmount += amount;
if (isSpinClaim) user.LastCurrencySpin = DateTime.UtcNow;
await _dataContext.SaveChangesAsync();
response.Success = true;
response.Data = user.CurrencyAmount;
return response;
}
else
{
response.Success = false;
response.Message = "User Not Found";
return response;
}
}
public async Task<ServiceResponse<int>> RemoveCurrencyFromUser(string id, int amount)
{
var response = new ServiceResponse<int>();
var user = _dataContext.Users.FirstOrDefault(e => e.Id == id);
if (user != null)
{
user.CurrencyAmount -= amount;
await _dataContext.SaveChangesAsync();
response.Success = true;
response.Data = user.CurrencyAmount;
return response;
}
else
{
response.Success = false;
response.Message = "User Not Found";
return response;
}
}
private long LongRandom(long min, long max, Random rnd) private long LongRandom(long min, long max, Random rnd)
{ {
long result = rnd.Next((int)(min >> 32), (int)(max >> 32)); long result = rnd.Next((int)(min >> 32), (int)(max >> 32));