mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 22:26:31 +00:00
gps matcher async
put cryptography lib to fixed version fix race condition bug in queue handler add lock to db writing and backup to file db on each write
This commit is contained in:
@@ -62,7 +62,7 @@ public class FailsafeAnnotationsProducer
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = await _dbFactory.Run(async db =>
|
||||
var (records, annotationsDict) = await _dbFactory.Run(async db =>
|
||||
{
|
||||
var records = await db.AnnotationsQueueRecords.OrderBy(x => x.DateTime).ToListAsync(token: ct);
|
||||
var editedCreatedNames = records
|
||||
@@ -73,69 +73,67 @@ public class FailsafeAnnotationsProducer
|
||||
var annotationsDict = await db.Annotations.LoadWith(x => x.Detections)
|
||||
.Where(x => editedCreatedNames.Contains(x.Name))
|
||||
.ToDictionaryAsync(a => a.Name, token: ct);
|
||||
|
||||
var messages = new List<Message>();
|
||||
foreach (var record in records)
|
||||
{
|
||||
var appProperties = new ApplicationProperties
|
||||
{
|
||||
{ nameof(AnnotationStatus), record.Operation.ToString() },
|
||||
{ nameof(User.Email), _azaionApi.CurrentUser.Email }
|
||||
};
|
||||
|
||||
if (record.Operation.In(AnnotationStatus.Validated, AnnotationStatus.Deleted))
|
||||
{
|
||||
var message = new Message(MessagePackSerializer.Serialize(new AnnotationBulkMessage
|
||||
{
|
||||
AnnotationNames = record.AnnotationNames.ToArray(),
|
||||
AnnotationStatus = record.Operation,
|
||||
Email = _azaionApi.CurrentUser.Email,
|
||||
CreatedDate = record.DateTime
|
||||
})) { ApplicationProperties = appProperties };
|
||||
|
||||
messages.Add(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
var annotation = annotationsDict!.GetValueOrDefault(record.AnnotationNames.FirstOrDefault());
|
||||
if (annotation == null)
|
||||
continue;
|
||||
|
||||
var image = record.Operation == AnnotationStatus.Created
|
||||
? await File.ReadAllBytesAsync(annotation.ImagePath, ct)
|
||||
: null;
|
||||
|
||||
var annMessage = new AnnotationMessage
|
||||
{
|
||||
Name = annotation.Name,
|
||||
OriginalMediaName = annotation.OriginalMediaName,
|
||||
Time = annotation.Time,
|
||||
Role = annotation.CreatedRole,
|
||||
Email = annotation.CreatedEmail,
|
||||
CreatedDate = annotation.CreatedDate,
|
||||
Status = annotation.AnnotationStatus,
|
||||
|
||||
ImageExtension = annotation.ImageExtension,
|
||||
Image = image,
|
||||
Detections = JsonConvert.SerializeObject(annotation.Detections),
|
||||
Source = annotation.Source,
|
||||
};
|
||||
var message = new Message(MessagePackSerializer.Serialize(annMessage)) { ApplicationProperties = appProperties };
|
||||
|
||||
messages.Add(message);
|
||||
}
|
||||
}
|
||||
|
||||
return (messages, records);
|
||||
return (records, annotationsDict);
|
||||
});
|
||||
|
||||
if (result.messages.Any())
|
||||
var messages = new List<Message>();
|
||||
foreach (var record in records)
|
||||
{
|
||||
await _annotationProducer.Send(result.messages, CompressionType.Gzip);
|
||||
var ids = result.records.Select(x => x.Id).ToList();
|
||||
var removed = await _dbFactory.Run(async db => await db.AnnotationsQueueRecords.DeleteAsync(x => ids.Contains(x.Id), token: ct));
|
||||
var appProperties = new ApplicationProperties
|
||||
{
|
||||
{ nameof(AnnotationStatus), record.Operation.ToString() },
|
||||
{ nameof(User.Email), _azaionApi.CurrentUser.Email }
|
||||
};
|
||||
|
||||
if (record.Operation.In(AnnotationStatus.Validated, AnnotationStatus.Deleted))
|
||||
{
|
||||
var message = new Message(MessagePackSerializer.Serialize(new AnnotationBulkMessage
|
||||
{
|
||||
AnnotationNames = record.AnnotationNames.ToArray(),
|
||||
AnnotationStatus = record.Operation,
|
||||
Email = _azaionApi.CurrentUser.Email,
|
||||
CreatedDate = record.DateTime
|
||||
})) { ApplicationProperties = appProperties };
|
||||
|
||||
messages.Add(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
var annotation = annotationsDict!.GetValueOrDefault(record.AnnotationNames.FirstOrDefault());
|
||||
if (annotation == null)
|
||||
continue;
|
||||
|
||||
var image = record.Operation == AnnotationStatus.Created
|
||||
? await File.ReadAllBytesAsync(annotation.ImagePath, ct)
|
||||
: null;
|
||||
|
||||
var annMessage = new AnnotationMessage
|
||||
{
|
||||
Name = annotation.Name,
|
||||
OriginalMediaName = annotation.OriginalMediaName,
|
||||
Time = annotation.Time,
|
||||
Role = annotation.CreatedRole,
|
||||
Email = annotation.CreatedEmail,
|
||||
CreatedDate = annotation.CreatedDate,
|
||||
Status = annotation.AnnotationStatus,
|
||||
|
||||
ImageExtension = annotation.ImageExtension,
|
||||
Image = image,
|
||||
Detections = JsonConvert.SerializeObject(annotation.Detections),
|
||||
Source = annotation.Source,
|
||||
};
|
||||
var message = new Message(MessagePackSerializer.Serialize(annMessage)) { ApplicationProperties = appProperties };
|
||||
|
||||
messages.Add(message);
|
||||
}
|
||||
}
|
||||
|
||||
if (messages.Any())
|
||||
{
|
||||
await _annotationProducer.Send(messages, CompressionType.Gzip);
|
||||
var ids = records.Select(x => x.Id).ToList();
|
||||
var removed = await _dbFactory.RunWrite(async db => await db.AnnotationsQueueRecords.DeleteAsync(x => ids.Contains(x.Id), token: ct));
|
||||
sent = true;
|
||||
_dbFactory.SaveToDisk();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -153,7 +151,7 @@ public class FailsafeAnnotationsProducer
|
||||
{
|
||||
if (_uiConfig.SilentDetection)
|
||||
return;
|
||||
await _dbFactory.Run(async db =>
|
||||
await _dbFactory.RunWrite(async db =>
|
||||
await db.InsertAsync(new AnnotationQueueRecord
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
|
||||
Reference in New Issue
Block a user