feat: integrate DTOs to api

This commit is contained in:
cuqmbr 2022-07-17 14:32:53 +03:00
parent c8bc5f2989
commit 5f2f5055ad
3 changed files with 47 additions and 25 deletions

View File

@ -1,8 +1,6 @@
using System.Data;
using DatabaseModels.Plain;
using DatabaseModels.DataTransferObjets;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Server.Data;
using Server.Services;
namespace Server.Controllers;
@ -20,47 +18,47 @@ public class ScoreboardController : ControllerBase
// GET: /scoreboard
[HttpGet]
public async Task<ActionResult<ScoreboardRecord[]>> Get()
public async Task<ActionResult<ScoreboardRecordDto[]>> Get()
{
return await _sbService.GetScoreboard();
}
// GET: /scoreboard/cuqmbr
[HttpGet("{username}", Name = "Get")]
public async Task<ActionResult<ScoreboardRecord>> Get(string username)
public async Task<ActionResult<ScoreboardRecordDto>> Get(string username)
{
var sbRecord = await _sbService.GetUserHighScore(username);
var sbRecordDto = await _sbService.GetUserHighScore(username);
if (sbRecord == null)
if (sbRecordDto == null)
{
return NotFound();
}
return sbRecord;
return sbRecordDto;
}
// POST: /scoreboard
[HttpPost]
public async Task<ActionResult> Post([FromBody] ScoreboardRecord sbRecord)
public async Task<ActionResult> Post([FromBody] ScoreboardRecordDto sbRecordDto)
{
await _sbService.AddUserHighScore(sbRecord);
return CreatedAtAction(nameof(Get), new {sbRecord.User}, sbRecord);
await _sbService.AddUserHighScore(sbRecordDto);
return CreatedAtAction(nameof(Get), new {sbRecordDto}, sbRecordDto);
}
// PUT: /scoreboard/id
[HttpPut("{id}", Name = "Put")]
public async Task<ActionResult<ScoreboardRecord>> Put(int id, [FromBody] ScoreboardRecord sbRecord)
public async Task<ActionResult> Put(int id, [FromBody] ScoreboardRecordDto sbRecordDto)
{
if (id != sbRecord.Id)
if (id != sbRecordDto.Id)
{
return BadRequest();
}
try
{
await _sbService.UpdateScoreboardRecord(sbRecord);
await _sbService.UpdateScoreboardRecord(sbRecordDto);
}
catch (DBConcurrencyException)
catch (DbUpdateConcurrencyException)
{
if (!await _sbService.ScoreboardRecordExists(id))
{

View File

@ -1,4 +1,4 @@
using DatabaseModels.Plain;
using DatabaseModels.InitialObjects;
using Microsoft.EntityFrameworkCore;
namespace Server.Data;

View File

@ -1,4 +1,5 @@
using DatabaseModels.Plain;
using DatabaseModels.DataTransferObjets;
using DatabaseModels.InitialObjects;
using Microsoft.EntityFrameworkCore;
using Server.Data;
@ -15,42 +16,65 @@ public class ScoreboardService
// GET
public async Task<ScoreboardRecord[]> GetScoreboard()
public async Task<ScoreboardRecordDto[]> GetScoreboard()
{
var sbRecords = await _dbContext.Scoreboard
.Include(sbr => sbr.User)
.ToListAsync();
sbRecords.Sort((a, b) => b.Score - a.Score);
sbRecords = sbRecords.DistinctBy(sbr => sbr.User.Id).ToList();
return sbRecords.DistinctBy(sbr => sbr.User.Id).ToArray();
var dto = new List<ScoreboardRecordDto>(sbRecords.Count);
foreach (var sbr in sbRecords)
{
dto.Add(sbr.ToDto());
}
return dto.ToArray();
}
public async Task<ScoreboardRecord?> GetUserHighScore(string username)
public async Task<ScoreboardRecordDto?> GetUserHighScore(string username)
{
var userScoreboardRecords = await _dbContext.Scoreboard
.Include(sbr => sbr.User)
.Where(sbr => sbr.User.Username == username)
.ToListAsync();
return userScoreboardRecords.MaxBy(sbr => sbr.Score);
return userScoreboardRecords.MaxBy(sbr => sbr.Score)?.ToDto();
}
// POST
public async Task AddUserHighScore(ScoreboardRecord sbRecord)
public async Task AddUserHighScore(ScoreboardRecordDto sbRecordDto)
{
var dbUser = await _dbContext.Users.FindAsync(sbRecord.User.Id);
var sbRecord = new ScoreboardRecord {
Score = sbRecordDto.Score,
PostTime = sbRecordDto.PostTime
};
var dbUser = await _dbContext.Users.FindAsync(sbRecordDto.User.Id);
sbRecord.User = dbUser;
await _dbContext.AddAsync(sbRecord);
await _dbContext.SaveChangesAsync();
sbRecordDto.Id = _dbContext.ChangeTracker.Entries<ScoreboardRecord>().First().Entity.Id;
}
// PUT
public async Task UpdateScoreboardRecord(ScoreboardRecord sbRecord)
public async Task UpdateScoreboardRecord(ScoreboardRecordDto sbRecordDto)
{
var sbRecord = new ScoreboardRecord {
Id = sbRecordDto.Id,
Score = sbRecordDto.Score,
PostTime = sbRecordDto.PostTime,
User = new User {
Id = sbRecordDto.User.Id,
Username = sbRecordDto.User.Username
}
};
_dbContext.Entry(sbRecord).State = EntityState.Modified;
await _dbContext.SaveChangesAsync();
}