Files
mixtape/zero/Numbers/NumberService.cs
T
2022-12-20 15:22:18 +01:00

135 lines
3.0 KiB
C#

using System.Text.RegularExpressions;
using zero.Numbers;
namespace zero.Numbers;
public class NumberService : INumberService
{
protected IZeroNumberStoreDbProvider Db { get; set; }
const string DEFAULT_COUNTER = "Default";
Regex templateRegex = new("{(date|number|year|random):?([a-zA-Z0-9-_]*)}", RegexOptions.IgnoreCase);
Regex containsYearRegex = new("{(date|year|date:([^}]*y+[^}]*))}", RegexOptions.IgnoreCase);
Random random = new();
public NumberService(IZeroNumberStoreDbProvider db, IZeroOptions options)
{
Db = db;
//RegisteredTypes = options.For<FlavorOptions>().GetAll<Number>().Select(x => x as NumberType);
}
/// <inheritdoc />
public async Task<string> Next(string alias, DateTimeOffset? date = null, bool store = true)
{
Number number = await Get(alias);
throw new NotImplementedException();
}
/// <inheritdoc />
public Task Reset(string alias)
{
throw new NotImplementedException();
}
/// <inheritdoc />
public Task ResetAll(string alias)
{
throw new NotImplementedException();
}
/// <inheritdoc />
public string Compile(string alias, long value, DateTimeOffset? date = null)
{
throw new NotImplementedException();
}
/// <summary>
/// Create a new number implementation
/// </summary>
protected async Task<Number> Get(string alias, string template = "{number}", long startNumber = 1, int minLength = 1)
{
string id = Id(alias);
Number number = await Db.Load<Number>(id);
bool exists = number != null;
if (!exists)
{
number = new()
{
Id = id,
Template = template,
StartNumber = startNumber,
MinLength = minLength
};
await Db.Create(number);
}
else
{
bool changed = false;
if (!number.Template.Equals(template))
{
number.Template = template;
changed = true;
}
if (!number.StartNumber.Equals(startNumber))
{
number.StartNumber = startNumber;
changed = true;
}
if (!number.MinLength.Equals(minLength))
{
number.MinLength = minLength;
changed = true;
}
if (changed)
{
await Db.Update(number);
}
}
return number;
}
/// <summary>
/// Generate number ID
/// </summary>
protected string Id(string alias)
{
return "numbers." + alias;
}
}
public interface INumberService
{
/// <summary>
/// Get the next available number for the specified template
/// </summary>
Task<string> Next(string alias, DateTimeOffset? date = null, bool store = true);
/// <summary>
/// Resets the current counter for the specified template
/// </summary>
Task Reset(string alias);
/// <summary>
/// Resets all counters for the specified template
/// </summary>
Task ResetAll(string alias);
/// <summary>
/// Renders the final output from the template and the value
/// </summary>
string Compile(string alias, long value, DateTimeOffset? date = null);
}