Skip to content

Commit

Permalink
Merge pull request #722 from mixcore/features/fix-npgsql-cannot-inser…
Browse files Browse the repository at this point in the history
…t-guid

Fix repodb npgsql connection cannot insert / update guid value
  • Loading branch information
nhathoang989 authored Dec 9, 2023
2 parents fea9c92 + 6ab3f5c commit 83059f3
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 26 deletions.
12 changes: 6 additions & 6 deletions src/modules/mix.portal/Controllers/MixDbController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public async Task<ActionResult> Import([FromForm] IFormFile file)
lstDto.Add(await MixDbHelper.ParseImportDtoToEntityAsync(item, _mixDb.Columns, CurrentTenant.Id, _idService.GetClaim(User, MixClaims.Username)));
}

var result = await _repository.InsertManyAsync(lstDto);
var result = await _repository.InsertManyAsync(lstDto, _mixDb);
return Ok(result);
}

Expand Down Expand Up @@ -221,7 +221,7 @@ public async Task<ActionResult<JObject>> UpdatePriority(string dbName, int id, [
foreach (var item in query.OrderBy(m => m[PriorityFieldName]))
{
item.Priority = start;
await _repository.UpdateAsync(item);
await _repository.UpdateAsync(item, _mixDb);
start++;
}

Expand All @@ -230,7 +230,7 @@ public async Task<ActionResult<JObject>> UpdatePriority(string dbName, int id, [
data[PriorityFieldName] = start;
}

await _repository.UpdateAsync(data);
await _repository.UpdateAsync(data, _mixDb);

return Ok();
}
Expand Down Expand Up @@ -354,7 +354,7 @@ public async Task<ActionResult<object>> Create(JObject dto)
{
JObject obj = await MixDbHelper.ParseDtoToEntityAsync(dto, _mixDb.Columns, CurrentTenant.Id, _idService.GetClaim(User, MixClaims.Username));
string username = _idService.GetClaim(User, MixClaims.Username);
var id = await _repository.InsertAsync(obj);
var id = await _repository.InsertAsync(obj, _mixDb);
var resp = await _repository.GetSingleAsync(id);
var result = resp != null ? ReflectionHelper.ParseObject(resp) : obj;
QueueService.PushQueue(CurrentTenant.Id, MixQueueTopics.MixBackgroundTasks, MixQueueActions.MixDbEvent,
Expand All @@ -368,7 +368,7 @@ public async Task<ActionResult<object>> Update(int id, [FromBody] JObject dto)
{
JObject obj = await MixDbHelper.ParseDtoToEntityAsync(dto, _mixDb.Columns, CurrentTenant.Id, _idService.GetClaim(User, MixClaims.Username));
string username = _idService.GetClaim(User, MixClaims.Username);
var data = await _repository.UpdateAsync(obj);
var data = await _repository.UpdateAsync(obj, _mixDb);
if (data != null)
{
var result = await _mixDbService.GetById(_tableName, id, true);
Expand Down Expand Up @@ -479,7 +479,7 @@ private async Task PatchHandler(JObject objDto, CancellationToken cancellationTo
}
}

await _repository.UpdateAsync(objDto);
await _repository.UpdateAsync(objDto, _mixDb);
QueueService.PushQueue(CurrentTenant.Id, MixQueueTopics.MixBackgroundTasks, MixQueueActions.MixDbEvent,
new MixDbEventCommand(username, "PATCH", _tableName, objDto));
}
Expand Down
33 changes: 27 additions & 6 deletions src/platform/mix.repodb/Repositories/MixRepoDbRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.Options;
using Mix.Constant.Constants;
using Mix.Constant.Enums;
using Mix.Database.Entities.Cms;
Expand All @@ -14,6 +15,7 @@
using Mix.Heart.UnitOfWork;
using Mix.RepoDb.Models;
using Mix.RepoDb.Services;
using Mix.RepoDb.ViewModels;
using Mix.Service.Services;
using Mix.Shared.Dtos;
using Mix.Shared.Models;
Expand Down Expand Up @@ -360,12 +362,13 @@ private Operation ParseMixOperator(SearchQueryField field)
}
}

public async Task<long> InsertAsync(JObject obj)
public async Task<long> InsertAsync(JObject obj, RepoDbMixDatabaseViewModel mixDb)
{
try
{
BeginTransaction();
var dicObj = obj.ToObject<Dictionary<string, object>>();
Dictionary<string, object> dicObj = ParseDictionary(obj, mixDb);

var fields = dicObj!.Keys.Select(m => new Field(m)).ToList();
var result = await _connection.InsertAsync<long>(
_tableName,
Expand All @@ -383,7 +386,8 @@ public async Task<long> InsertAsync(JObject obj)
}
}

public async Task<int?> InsertManyAsync(List<JObject> entities)

public async Task<int?> InsertManyAsync(List<JObject> entities, RepoDbMixDatabaseViewModel mixDb)
{
try
{
Expand All @@ -396,7 +400,7 @@ public async Task<long> InsertAsync(JObject obj)

foreach (var entity in entities)
{
var dicObj = entity.ToObject<Dictionary<string, object>>();
var dicObj = ParseDictionary(entity, mixDb);
if (dicObj != null)
{
dicObjs.Add(dicObj);
Expand Down Expand Up @@ -445,15 +449,15 @@ public async Task<long> InsertAsync(JObject obj)
}
}

public async Task<object?> UpdateAsync(JObject entity)
public async Task<object?> UpdateAsync(JObject entity, RepoDbMixDatabaseViewModel mixDb)
{
try
{
BeginTransaction();
int id = entity.Value<int>("Id");
if (_connection.Exists(_tableName, new { Id = id }, transaction: _dbTransaction))
{
object obj = entity.ToObject<Dictionary<string, object>>()!;
var obj = ParseDictionary(entity, mixDb);
var cacheFolder = MixDbDataService.GetCacheFolder(_tableName);
MixFileHelper.EmptyFolder($"{MixFolders.MixCacheFolder}/{cacheFolder}/{id}");
return await _connection.UpdateAsync(_tableName, obj,
Expand Down Expand Up @@ -724,5 +728,22 @@ public void Dispose()
_connection.Close();
}
}

private Dictionary<string, object> ParseDictionary(JObject obj, RepoDbMixDatabaseViewModel mixDb)
{
var dicObj = obj.ToObject<Dictionary<string, object>>();

// npgsql cannot auto parse from string to Guid
var guidCols = mixDb.Columns.Where(c => c.DataType == MixDataType.Guid).ToList();
foreach (var item in guidCols)
{
var colTitle = item.SystemName.ToTitleCase();
if (dicObj.ContainsKey(colTitle) && dicObj[colTitle] != null)
{
dicObj[colTitle] = Guid.Parse(dicObj[colTitle].ToString()!);
}
}
return dicObj;
}
}
}
4 changes: 2 additions & 2 deletions src/platform/mix.repodb/Services/MixDbDataService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public async Task<long> CreateData(string tableName, JObject data)
{
await InitRepository(tableName);
var obj = await ParseDto(tableName, data);
return await _repository.InsertAsync(obj);
return await _repository.InsertAsync(obj, _mixDb);
}
catch (MixException)
{
Expand All @@ -216,7 +216,7 @@ public async Task<long> CreateData(string tableName, JObject data)
{
throw new MixException(MixErrorStatus.NotFound);
}
return await _repository.UpdateAsync(obj);
return await _repository.UpdateAsync(obj, _mixDb);
}
catch (MixException)
{
Expand Down
27 changes: 15 additions & 12 deletions src/platform/mix.repodb/Services/MixDbService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -638,21 +638,24 @@ private void InitBackupRepository(string databaseName)

private async Task<bool> RestoreFromLocal(RepoDbMixDatabaseViewModel database)
{
InitBackupRepository(database.SystemName);
var data = await _backupRepository.GetAllAsync();
if (data is { Count: > 0 })
if (File.Exists($"MixContent/Backup/backup_{database.SystemName}.sqlite"))
{
var dbColumns = database.Columns.Select(c => c.SystemName.ToTitleCase()).Union(DefaultProperties).ToList();
string insertQuery = $"INSERT INTO {database.SystemName} ({string.Join(',', dbColumns.Select(m => $"{_databaseConstant.BacktickOpen}{m}{_databaseConstant.BacktickClose}"))}) VALUES ";
List<string> queries = new();
foreach (var item in data)
InitBackupRepository(database.SystemName);
var data = await _backupRepository.GetAllAsync();
if (data is { Count: > 0 })
{
queries.Add(GetInsertQuery(item, dbColumns));
var dbColumns = database.Columns.Select(c => c.SystemName.ToTitleCase()).Union(DefaultProperties).ToList();
string insertQuery = $"INSERT INTO {database.SystemName} ({string.Join(',', dbColumns.Select(m => $"{_databaseConstant.BacktickOpen}{m}{_databaseConstant.BacktickClose}"))}) VALUES ";
List<string> queries = new();
foreach (var item in data)
{
queries.Add(GetInsertQuery(item, dbColumns));
}
insertQuery += string.Join(',', queries);
_repository.InitTableName(database.SystemName);
var result = await _repository.ExecuteCommand(insertQuery);
return result >= 0;
}
insertQuery += string.Join(',', queries);
_repository.InitTableName(database.SystemName);
var result = await _repository.ExecuteCommand(insertQuery);
return result >= 0;
}
return true;
}
Expand Down

0 comments on commit 83059f3

Please sign in to comment.