configure grpc

This commit is contained in:
2026-01-17 18:08:16 -05:00
parent fc80e50c26
commit b762139243
27 changed files with 467 additions and 500 deletions

View File

@@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Mvc.ModelBinding;
using MongoDB.Bson;
namespace AZKiServer.Models;
public class BsonIdModelBinderProvider : IModelBinderProvider
{
public IModelBinder? GetBinder(ModelBinderProviderContext context)
{
if (context.Metadata.ModelType == typeof(ObjectId))
return new BsonIdModelBinder();
return default;
}
}
public class BsonIdModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value == ValueProviderResult.None)
return Task.CompletedTask;
if (ObjectId.TryParse(value.FirstValue, out var id))
bindingContext.Result = ModelBindingResult.Success(id);
else
bindingContext.Result = ModelBindingResult.Failed();
return Task.CompletedTask;
}
}

View File

@@ -0,0 +1,78 @@
using MaybeError;
using MaybeError.Errors;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System.Text.RegularExpressions;
namespace AZKiServer.Models;
public partial class MediaEntry
{
[BsonId]
public ObjectId Id { get; set; }
public int Version { get; set; }
public MediaType Type { get; set; }
public required string Filepath { get; set; }
public DateTime Date { get; set; }
public int CameraId { get; set; }
public static Maybe<MediaEntry> Parse(string relativePath)
{
var filename = Path.GetFileName(relativePath);
var match = FileParser().Match(filename);
if (!match.Success)
return new Error("Failed to parse file name");
try
{
var src = match.Groups["src"];
var cam = match.Groups["cam"];
var date = match.Groups["date"];
var ext = match.Groups["ext"];
return new MediaEntry
{
CameraId = int.Parse(cam.Value),
Filepath = relativePath,
Date = ParseDate(date.Value),
Type = ext.Value switch
{
"mp4" => MediaType.Video,
_ => MediaType.Image
}
};
}catch(Exception ex)
{
return ex;
}
}
private static DateTime ParseDate(string dateString)
{
var year = dateString[0..4];
var month = dateString[4..6];
var day = dateString[6..8];
var hour = dateString[8..10];
var minute = dateString[10..12];
var sec = dateString[12..];
return new DateTime(int.Parse(year), int.Parse(month), int.Parse(day), int.Parse(hour), int.Parse(minute), int.Parse(sec), DateTimeKind.Local);
}
[GeneratedRegex("(?'src'.+)_(?'cam'\\d+)_(?'date'\\d+).(?'ext'\\w+)")]
private static partial Regex FileParser();
}
[Flags]
public enum MediaType
{
None = 0,
Video = 1,
Image = 2,
All = Video | Image
}