Добавить таблицу для учета комментариев и действий пользователя для вывода статистики по ChangeLog #30
@ -54,20 +54,20 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
|
|||||||
|
|
||||||
[HttpDelete]
|
[HttpDelete]
|
||||||
|
|||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> Delete(Guid id, CancellationToken token)
|
public async Task<IActionResult> Delete(Guid id, string comment, CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
var result = await repository.MarkAsDeleted(userId, [id], token);
|
var result = await repository.MarkAsDeleted(userId, [id], comment, token);
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpDelete("range")]
|
[HttpDelete("range")]
|
||||||
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
[ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)]
|
||||||
public async Task<IActionResult> DeleteRange(IEnumerable<Guid> ids, CancellationToken token)
|
public async Task<IActionResult> DeleteRange(IEnumerable<Guid> ids, string comment, CancellationToken token)
|
||||||
{
|
{
|
||||||
var userId = User.GetUserId<Guid>();
|
var userId = User.GetUserId<Guid>();
|
||||||
var result = await repository.MarkAsDeleted(userId, ids, token);
|
var result = await repository.MarkAsDeleted(userId, ids, comment, token);
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"DefaultConnection": "Host=localhost;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True"
|
"DefaultConnection": "Host=localhost:5462;Database=persistence;Username=postgres;Password=postgres;Persist Security Info=True"
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"NeedUseKeyCloak": false,
|
"NeedUseKeyCloak": false,
|
||||||
|
@ -36,7 +36,7 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> MarkAsDeleted(Guid idEditor, IEnumerable<Guid> ids, CancellationToken token)
|
public async Task<int> MarkAsDeleted(Guid idEditor, IEnumerable<Guid> ids, string comment, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = db.Set<ChangeLog>()
|
var query = db.Set<ChangeLog>()
|
||||||
.Where(s => ids.Contains(s.Id))
|
.Where(s => ids.Contains(s.Id))
|
||||||
@ -49,12 +49,12 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
|
|
||||||
var entities = await query.ToArrayAsync(token);
|
var entities = await query.ToArrayAsync(token);
|
||||||
|
|
||||||
var result = await MarkAsObsolete(idEditor, entities, token);
|
var result = await MarkAsObsolete(idEditor, entities, comment, token);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> MarkAsDeleted(Guid idEditor, Guid idDiscriminator, CancellationToken token)
|
public async Task<int> MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token)
|
||||||
{
|
{
|
||||||
var query = db.Set<ChangeLog>()
|
var query = db.Set<ChangeLog>()
|
||||||
.Where(s => s.IdDiscriminator == idDiscriminator)
|
.Where(s => s.IdDiscriminator == idDiscriminator)
|
||||||
@ -62,19 +62,26 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
|
|
||||||
var entities = await query.ToArrayAsync(token);
|
var entities = await query.ToArrayAsync(token);
|
||||||
|
|
||||||
var result = await MarkAsObsolete(idEditor, entities, token);
|
var result = await MarkAsObsolete(idEditor, entities, comment, token);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<int> MarkAsObsolete(Guid idEditor, IEnumerable<ChangeLog> entities, CancellationToken token)
|
private async Task<int> MarkAsObsolete(Guid idEditor, IEnumerable<ChangeLog> entities, string comment, CancellationToken token)
|
||||||
{
|
{
|
||||||
var updateTime = DateTimeOffset.UtcNow;
|
var updateTime = DateTimeOffset.UtcNow;
|
||||||
|
var commit = new ChangeLogCommit() {
|
||||||
|
Comment = comment,
|
||||||
|
Creation = updateTime,
|
||||||
|
Id = Uuid7.Guid(),
|
||||||
|
IdCommitAuthor = idEditor
|
||||||
|
};
|
||||||
|
db.Set<ChangeLogCommit>().Add(commit);
|
||||||
|
|
||||||
foreach (var entity in entities)
|
foreach (var entity in entities)
|
||||||
{
|
{
|
||||||
entity.Obsolete = updateTime;
|
entity.Obsolete = updateTime;
|
||||||
//entity.IdEditor = idEditor;
|
entity.IdDiscriminator = commit.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
ng.frolov
commented
Этот метод должен помечать все записи относящиеся к дискриминатору как удаленные и добавлять новые. Этот метод должен помечать все записи относящиеся к дискриминатору как удаленные и добавлять новые.
|
|||||||
return await db.SaveChangesAsync(token);
|
return await db.SaveChangesAsync(token);
|
||||||
@ -84,14 +91,16 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
{
|
{
|
||||||
var result = 0;
|
var result = 0;
|
||||||
|
|
||||||
|
var changeLogIds = commitDto.ChangeLogItems.Select(c => c.Id);
|
||||||
ng.frolov
commented
Это не то. // arrange Это не то.
Покрой этот метод интеграционным тестом плиз.
// arrange
add some data winth 2 discriminators
// act replace data for 1 discriminaqtor
// assert
check thar othe data with othe discr
|
|||||||
|
var comment = commitDto.Comment;
|
||||||
|
|
||||||
using var transaction = await db.Database.BeginTransactionAsync(token);
|
using var transaction = await db.Database.BeginTransactionAsync(token);
|
||||||
|
|
||||||
result += await MarkAsDeleted(commitDto.IdAuthor, idDiscriminator, token);
|
result += await MarkAsDeleted(commitDto.IdAuthor, changeLogIds, comment, token);
|
||||||
result += await AddRange(idDiscriminator, commitDto, token);
|
result += await AddRange(idDiscriminator, commitDto, token);
|
||||||
|
|
||||||
await transaction.CommitAsync(token);
|
await transaction.CommitAsync(token);
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,15 +113,10 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
.Where(s => updatedIds.Contains(s.Id))
|
.Where(s => updatedIds.Contains(s.Id))
|
||||||
.ToDictionary(s => s.Id);
|
.ToDictionary(s => s.Id);
|
||||||
|
|
||||||
var result = 0;
|
using var transaction = await db.Database.BeginTransactionAsync(token);
|
||||||
|
|
||||||
var commit = CreateCommit(commitDto);
|
var commit = CreateCommit(commitDto);
|
||||||
db.Set<ChangeLogCommit>().Add(commit);
|
db.Set<ChangeLogCommit>().Add(commit);
|
||||||
db.SaveChanges();
|
|
||||||
|
|
||||||
//using var transaction = await db.Database.BeginTransactionAsync(token);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var dto in commitDto.ChangeLogItems)
|
foreach (var dto in commitDto.ChangeLogItems)
|
||||||
{
|
{
|
||||||
@ -122,19 +126,17 @@ public class ChangeLogRepository : IChangeLogRepository
|
|||||||
throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto));
|
throw new ArgumentException($"Entity with id = {dto.Id} doesn't exist in Db", nameof(dto));
|
||||||
}
|
}
|
||||||
|
|
||||||
var newEntity = CreateChangeLogFromDto(commitDto.IdAuthor, updatedEntity.IdDiscriminator, commit.Id, dto);
|
var newEntity = CreateChangeLogFromDto(updatedEntity.IdDiscriminator, commit.Id, commitDto.IdAuthor, dto);
|
||||||
dbSet.Add(newEntity);
|
dbSet.Add(newEntity);
|
||||||
|
|
||||||
updatedEntity.IdNext = newEntity.Id;
|
updatedEntity.IdNext = newEntity.Id;
|
||||||
updatedEntity.Obsolete = DateTimeOffset.UtcNow;
|
updatedEntity.Obsolete = DateTimeOffset.UtcNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = await db.SaveChangesAsync(token);
|
var result = await db.SaveChangesAsync(token);
|
||||||
//await transaction.CommitAsync(token);
|
await transaction.CommitAsync(token);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(
|
public async Task<PaginationContainer<ChangeLogValuesDto>> GetByDate(
|
||||||
|
@ -90,17 +90,19 @@ public interface IChangeLogApi : ISyncWithDiscriminatorApi<ChangeLogValuesDto>
|
|||||||
/// Удалить одну запись
|
/// Удалить одну запись
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id"></param>
|
/// <param name="id"></param>
|
||||||
|
/// <param name="comment">комментарий к удалению</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> Delete(Guid id, CancellationToken token);
|
Task<IActionResult> Delete(Guid id, string comment, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить несколько записей
|
/// Удалить несколько записей
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ids"></param>
|
/// <param name="ids"></param>
|
||||||
|
/// <param name="comment">комментарий к удалению</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IActionResult> DeleteRange(IEnumerable<Guid> ids, CancellationToken token);
|
Task<IActionResult> DeleteRange(IEnumerable<Guid> ids, string comment, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени)
|
/// Получение списка дат, в которые происходили изменения (день, месяц, год, без времени)
|
||||||
|
@ -24,18 +24,20 @@ public interface IChangeLogRepository : ISyncWithDiscriminatorRepository<ChangeL
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idEditor"></param>
|
/// <param name="idEditor"></param>
|
||||||
/// <param name="ids">ключи записей</param>
|
/// <param name="ids">ключи записей</param>
|
||||||
|
/// <param name="comment">комментарий к удалению</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> MarkAsDeleted(Guid idEditor, IEnumerable<Guid> ids, CancellationToken token);
|
Task<int> MarkAsDeleted(Guid idEditor, IEnumerable<Guid> ids, string comment, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Пометить записи как удаленные
|
/// Пометить записи как удаленные
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idEditor"></param>
|
/// <param name="idEditor"></param>
|
||||||
/// <param name="idDiscriminator">дискриминатор таблицы</param>
|
/// <param name="idDiscriminator">дискриминатор таблицы</param>
|
||||||
|
/// <param name="comment">комментарий к удалению</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<int> MarkAsDeleted(Guid idEditor, Guid idDiscriminator, CancellationToken token);
|
Task<int> MarkAsDeleted(Guid idEditor, Guid idDiscriminator, string comment, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Очистить и добавить новые
|
/// Очистить и добавить новые
|
||||||
|
Loading…
Reference in New Issue
Block a user
Скорее всего в ChangeLogCommitDto dtos - лишнее, и помешаются в методе delete например.
Отношение строчек с данными к коммиту делается уже внутри сервиса.