fix: cheers, it builds now
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
using System.Security.Claims;
|
||||
using LctMonolith.Services;
|
||||
using LctMonolith.Services.Contracts;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace LctMonolith.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// Endpoints exposing gamification progress information.
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("api/gamification")]
|
||||
[Authorize]
|
||||
public class GamificationController : ControllerBase
|
||||
{
|
||||
private readonly IGamificationService _gamificationService;
|
||||
|
||||
public GamificationController(IGamificationService gamificationService)
|
||||
{
|
||||
_gamificationService = gamificationService;
|
||||
}
|
||||
|
||||
private Guid GetUserId() => Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
|
||||
|
||||
/// <summary>Returns current user progress snapshot (rank, xp, outstanding requirements).</summary>
|
||||
[HttpGet("progress")]
|
||||
public async Task<IActionResult> GetProgress(CancellationToken ct)
|
||||
{
|
||||
var snapshot = await _gamificationService.GetProgressAsync(GetUserId(), ct);
|
||||
return Ok(snapshot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
using System.Security.Claims;
|
||||
using LctMonolith.Services;
|
||||
using LctMonolith.Services.Contracts;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace LctMonolith.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// Inventory endpoints for viewing owned store items and artifacts.
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("api/inventory")]
|
||||
[Authorize]
|
||||
public class InventoryController : ControllerBase
|
||||
{
|
||||
private readonly IInventoryService _inventory;
|
||||
public InventoryController(IInventoryService inventory)
|
||||
{
|
||||
_inventory = inventory;
|
||||
}
|
||||
|
||||
private Guid GetUserId() => Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
|
||||
|
||||
/// <summary>List owned store inventory entries.</summary>
|
||||
[HttpGet("store-items")]
|
||||
public async Task<IActionResult> GetStoreItems(CancellationToken ct)
|
||||
{
|
||||
var items = await _inventory.GetStoreInventoryAsync(GetUserId(), ct);
|
||||
return Ok(items.Select(i => new { i.StoreItemId, i.Quantity, i.AcquiredAt, i.IsReturned, i.StoreItem?.Name }));
|
||||
}
|
||||
|
||||
/// <summary>List owned artifacts.</summary>
|
||||
[HttpGet("artifacts")]
|
||||
public async Task<IActionResult> GetArtifacts(CancellationToken ct)
|
||||
{
|
||||
var artifacts = await _inventory.GetArtifactsAsync(GetUserId(), ct);
|
||||
return Ok(artifacts.Select(a => new { a.ArtifactId, a.ObtainedAt, a.Artifact?.Name, a.Artifact?.Rarity }));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
using System.Security.Claims;
|
||||
using LctMonolith.Models.Database;
|
||||
using LctMonolith.Services;
|
||||
using LctMonolith.Services.Contracts;
|
||||
using LctMonolith.Services.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace LctMonolith.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// Endpoints for listing and managing missions.
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("api/missions")]
|
||||
[Authorize]
|
||||
public class MissionsController : ControllerBase
|
||||
{
|
||||
private readonly IMissionService _missionService;
|
||||
|
||||
public MissionsController(IMissionService missionService)
|
||||
{
|
||||
_missionService = missionService;
|
||||
}
|
||||
|
||||
private Guid GetUserId() => Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);
|
||||
|
||||
/// <summary>Returns missions currently available to the authenticated user.</summary>
|
||||
[HttpGet]
|
||||
public async Task<ActionResult<IEnumerable<Mission>>> GetAvailable(CancellationToken ct)
|
||||
{
|
||||
var userId = GetUserId();
|
||||
var list = await _missionService.GetAvailableMissionsAsync(userId, ct);
|
||||
return Ok(list);
|
||||
}
|
||||
|
||||
/// <summary>Create a mission (HR functionality – for now any authenticated user).</summary>
|
||||
[HttpPost]
|
||||
public async Task<ActionResult<Mission>> Create(CreateMissionModel model, CancellationToken ct)
|
||||
{
|
||||
var mission = await _missionService.CreateMissionAsync(model, ct);
|
||||
return CreatedAtAction(nameof(GetAvailable), new { id = mission.Id }, mission);
|
||||
}
|
||||
|
||||
/// <summary>Update mission status for current user (submit/complete/etc.).</summary>
|
||||
[HttpPatch("{missionId:guid}/status")]
|
||||
public async Task<ActionResult> UpdateStatus(Guid missionId, UpdateMissionStatusRequest req, CancellationToken ct)
|
||||
{
|
||||
var userId = GetUserId();
|
||||
var result = await _missionService.UpdateStatusAsync(userId, missionId, req.Status, req.SubmissionData, ct);
|
||||
return Ok(new { result.MissionId, result.Status, result.UpdatedAt });
|
||||
}
|
||||
}
|
||||
@@ -18,21 +18,21 @@ public static class DbSeeder
|
||||
{
|
||||
var ranks = new List<Rank>
|
||||
{
|
||||
new() { Name = "Искатель", Order = 0, RequiredExperience = 0 },
|
||||
new() { Name = "Пилот-кандидат", Order = 1, RequiredExperience = 500 },
|
||||
new() { Name = "Принятый в экипаж", Order = 2, RequiredExperience = 1500 }
|
||||
new() { Title = "Искатель", ExpNeeded = 0 },
|
||||
new() { Title = "Пилот-кандидат", ExpNeeded = 500 },
|
||||
new() { Title = "Принятый в экипаж", ExpNeeded = 1500 }
|
||||
};
|
||||
db.Ranks.AddRange(ranks);
|
||||
Log.Information("Seeded {Count} ranks", ranks.Count);
|
||||
}
|
||||
|
||||
if (!await db.Competencies.AnyAsync(ct))
|
||||
if (!await db.Skills.AnyAsync(ct))
|
||||
{
|
||||
var comps = new[]
|
||||
{
|
||||
"Вера в дело","Стремление к большему","Общение","Аналитика","Командование","Юриспруденция","Трёхмерное мышление","Базовая экономика","Основы аэронавигации"
|
||||
}.Select(n => new Competency { Name = n });
|
||||
db.Competencies.AddRange(comps);
|
||||
}.Select(n => new Skill { Title = n });
|
||||
db.Skills.AddRange(comps);
|
||||
Log.Information("Seeded competencies");
|
||||
}
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ public class AppUser : IdentityUser<Guid>
|
||||
public Rank? Rank { get; set; }
|
||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
||||
public ICollection<UserCompetency> Competencies { get; set; } = new List<UserCompetency>();
|
||||
public ICollection<UserMission> Missions { get; set; } = new List<UserMission>();
|
||||
public ICollection<PlayerSkill> Competencies { get; set; } = new List<PlayerSkill>();
|
||||
public ICollection<PlayerMission> Missions { get; set; } = new List<PlayerMission>();
|
||||
public ICollection<UserInventoryItem> Inventory { get; set; } = new List<UserInventoryItem>();
|
||||
public ICollection<Transaction> Transactions { get; set; } = new List<Transaction>();
|
||||
public ICollection<RefreshToken> RefreshTokens { get; set; } = new List<RefreshToken>();
|
||||
|
||||
@@ -95,11 +95,8 @@ builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
|
||||
|
||||
// Domain services
|
||||
builder.Services.AddScoped<ITokenService, TokenService>();
|
||||
builder.Services.AddScoped<IGamificationService, LctMonolith>();
|
||||
builder.Services.AddScoped<IMissionService, MissionService>();
|
||||
builder.Services.AddScoped<IStoreService, StoreService>();
|
||||
builder.Services.AddScoped<INotificationService, NotificationService>();
|
||||
builder.Services.AddScoped<IInventoryService, InventoryService>();
|
||||
builder.Services.AddScoped<IAnalyticsService, AnalyticsService>();
|
||||
|
||||
// CORS
|
||||
|
||||
@@ -17,16 +17,12 @@ public class AnalyticsService : IAnalyticsService
|
||||
{
|
||||
var totalUsers = await _uow.Users.Query().CountAsync(ct);
|
||||
var totalMissions = await _uow.Missions.Query().CountAsync(ct);
|
||||
var completedMissions = await _uow.UserMissions.Query(um => um.Status == MissionStatus.Completed).CountAsync(ct);
|
||||
var totalArtifacts = await _uow.Artifacts.Query().CountAsync(ct);
|
||||
var totalStoreItems = await _uow.StoreItems.Query().CountAsync(ct);
|
||||
var totalExperience = await _uow.Users.Query().SumAsync(u => (long)u.Experience, ct);
|
||||
return new AnalyticsSummary
|
||||
{
|
||||
TotalUsers = totalUsers,
|
||||
TotalMissions = totalMissions,
|
||||
CompletedMissions = completedMissions,
|
||||
TotalArtifacts = totalArtifacts,
|
||||
TotalStoreItems = totalStoreItems,
|
||||
TotalExperience = totalExperience
|
||||
};
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
using LctMonolith.Services.Models;
|
||||
|
||||
using LctMonolith.Services.Models;
|
||||
|
||||
namespace LctMonolith.Services;
|
||||
|
||||
public interface IAnalyticsService
|
||||
|
||||
@@ -5,5 +5,4 @@ namespace LctMonolith.Services.Contracts;
|
||||
public interface IInventoryService
|
||||
{
|
||||
Task<IEnumerable<UserInventoryItem>> GetStoreInventoryAsync(Guid userId, CancellationToken ct = default);
|
||||
Task<IEnumerable<UserArtifact>> GetArtifactsAsync(Guid userId, CancellationToken ct = default);
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
using LctMonolith.Models.Database;
|
||||
|
||||
namespace LctMonolith.Services.Models;
|
||||
|
||||
public class UpdateMissionStatusRequest
|
||||
{
|
||||
public MissionStatus Status { get; set; }
|
||||
public string? SubmissionData { get; set; }
|
||||
}
|
||||
@@ -10,7 +10,6 @@ using LctMonolith.Services.Models;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using Serilog;
|
||||
|
||||
namespace LctMonolith.Services;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user