feat: classify Hanvon duplicate-face errors as DUPLICATE_FACE
Parse face is double,id=... separately from upload failures.main
parent
5a1f68077d
commit
c41950a22a
|
|
@ -0,0 +1,44 @@
|
|||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace HanvonF710XAttendanceService
|
||||
{
|
||||
internal sealed class DbToDeviceDuplicateFaceEntry
|
||||
{
|
||||
public DbToDeviceDuplicateFaceEntry(string employeeId, string existingDeviceId, string targetDevice)
|
||||
{
|
||||
EmployeeId = employeeId ?? "";
|
||||
ExistingDeviceId = existingDeviceId ?? "";
|
||||
TargetDevice = targetDevice ?? "";
|
||||
}
|
||||
|
||||
public string EmployeeId { get; }
|
||||
public string ExistingDeviceId { get; }
|
||||
public string TargetDevice { get; }
|
||||
}
|
||||
|
||||
internal static class DbToDeviceFaceErrors
|
||||
{
|
||||
private static readonly Regex DuplicateFaceRegex = new Regex(
|
||||
@"face\s+is\s+double\s*,\s*id\s*=\s*(\d+)",
|
||||
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
|
||||
|
||||
public static bool TryParseDuplicateFace(string errorMessage, out string existingDeviceId)
|
||||
{
|
||||
existingDeviceId = null;
|
||||
if (string.IsNullOrWhiteSpace(errorMessage))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Match match = DuplicateFaceRegex.Match(errorMessage.Trim());
|
||||
if (!match.Success || match.Groups.Count < 2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
existingDeviceId = match.Groups[1].Value?.Trim();
|
||||
return !string.IsNullOrWhiteSpace(existingDeviceId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
using System;
|
||||
|
||||
namespace HanvonF710XAttendanceService
|
||||
{
|
||||
internal static class DbToDeviceFaceErrorsTests
|
||||
{
|
||||
public static int RunAll()
|
||||
{
|
||||
int failed = 0;
|
||||
failed += Run("parse duplicate face error", TestParseDuplicateFace);
|
||||
failed += Run("ignore generic upload error", TestIgnoreGenericError);
|
||||
return failed;
|
||||
}
|
||||
|
||||
private static int Run(string name, Func<bool> test)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!test())
|
||||
{
|
||||
Console.WriteLine("FAIL: " + name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
Console.WriteLine("PASS: " + name);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("FAIL: " + name + " err=" + ex.Message);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool TestParseDuplicateFace()
|
||||
{
|
||||
return DbToDeviceFaceErrors.TryParseDuplicateFace("face is double,id=6400", out string existingId)
|
||||
&& existingId == "6400"
|
||||
&& DbToDeviceFaceErrors.TryParseDuplicateFace("Face is double, id=6475", out string existingId2)
|
||||
&& existingId2 == "6475";
|
||||
}
|
||||
|
||||
private static bool TestIgnoreGenericError()
|
||||
{
|
||||
return !DbToDeviceFaceErrors.TryParseDuplicateFace("no face in picture", out _);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue