To jest stare API, które zostało wykorzystane do "nowszego" podejścia. Wcześniej nie było tego problemu, ponieważ aplikacja (PWA) była cały czas online, ponieważ było to www. W tym momencie duży nacisk został położony na pracę offline po stronie mobilki, stąd durne synchronizowanie dokumentów (zamówień) w tle. Obawiam się, że kod nic nie powie, ponieważ twierdzę, że to nie jest kwestia API, a tego jak działa Android i jego praca w tle. Przepisywanie API na "poprawne" też nie jest możliwe, ponieważ nie mam czasu, który mógłbym na to poświęcić i tak tylko dokładam więcej bałaganu to już istniejącego.
Logowanie jest zrobione za pomocą NLog
Startup.cs
LogManager.LoadConfiguration(string.Concat(Directory.GetCurrentDirectory(), "/nlog.config"));
Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Debug);
}).UseNLog();
OptimoController.cs
[HttpPost]
public async Task<IActionResult> InsertNewDocument([FromBody] object parameter)
{
// ...
ClaimsIdentity claimsIdentity = User.Identity as ClaimsIdentity;
SysUser u = JsonConvert.DeserializeObject<SysUser>(claimsIdentity.FindFirst("user").Value);
SysUserConfig uu = JsonConvert.DeserializeObject<SysUserConfig>(claimsIdentity.FindFirst("config").Value);
_loggerManager.LogInformation("[INSERTING_USER] " + u.Email);
_loggerManager.LogInformation("[INSERTING_SERIE] " + uu.UserSerie);
_loggerManager.LogInformation("[INSERTING_OBJECT] " + JsonConvert.SerializeObject(parameter));
// ...
await _optimoService.SaveTraNag(trn, db);
OptimoService.cs
public async Task SaveTraNag(TraNag trn, IDbConnection db)
{
var existing = await _sqlService.QuerySingleCompany<int>("select count(*) from CDN.TraNag where TrN_NumerObcy = @Number", new { Number = trn.TrN_NumerObcy });
if (existing == 0)
{
}
}
Tak, wiem, logiki nie powinno być w kontrolerze. Nie chce tego poprawiać i w najbliższej przyszłości nie mam zamiaru. Problem polega na tym, że API nie czeka z przerobieniem danych tylko przyjmuje kolejne, co powoduje duplikacje w bazie. Te same zamówienie wpada po kilka razy, ponieważ if(existing == 0)
zwraca true
, bo tego dokumentu faktycznie jeszcze tam nie ma.
MOBILKA - Flutter (Dart)
Future<void> initPlatformState() async {
await BackgroundFetch.configure(
BackgroundFetchConfig(
requiresBatteryNotLow: false,
requiresCharging: false,
requiresDeviceIdle: false,
requiresStorageNotLow: false,
minimumFetchInterval: 5,
startOnBoot: true,
stopOnTerminate: false,
enableHeadless: true,
forceAlarmManager: true,
requiredNetworkType: NetworkType.ANY), (String taskId) async {
final date = Hive.box<String>(Methods.appSettingsBox).get(Methods.synchronizeDate);
if (DateTime.now().millisecondsSinceEpoch - lastFetchEventAt < 10000) {
BackgroundFetch.finish(taskId);
} else {
if (auth.isAuthenticated() && date != null) {
MainScreen.docController.documentSynchronization();
lastFetchEventAt = DateTime.now().millisecondsSinceEpoch;
}
BackgroundFetch.finish(taskId);
}
}, (String taskId) async {
BackgroundFetch.finish(taskId);
});
}
Temat był drążony z autorem biblioteki.
Posibility to execute same job in two different threads #248