LibAICORE 1.1.11-alpha-ge694af15d2

A corejob is a task that is:

  • asynchronous, may take seconds, minutes, or hours
  • transient, variables not in db/files/etc are deleted on finish
  • non-importing, files may be GB or TB so files are edited one row at a time (do not import everything into RAM!!)
  • authenticated, users must be checked for permissions before every action - this is done with keycloak (auth.aicore.ca)
  • private, users should have absolutely no access to any information (files, DB, corejobs) from other companies (customers) - any files outside of /AICORE/Customers/[company] should be inaccessible
  • developer maintained, a developer at coredata is expected to modify corejobs according to logic requirements

Victor wanted the last point to be temporary, so customers can eventually be trained to modify corejobs in a low-code environment (AICORE), but this low-code environment of only JSON files was resulting in the least readable code I've ever seen (/AICORE/Customers/Normandeau/Customers/QuoteToInvoice) and this system was completely unreasonable to train a non-technical customer on, while the system took an absurd amount of extra time for coredata developers to test and develop (no if statements or loops, every new command/instruction meant making a new API even if it was only for one customer, the standard IDE was notepad++ with no schema - I would compare the experience to writing x86 assembly code in a raw text editor with no branch/jump instruction) - so I just hacked together a quick replacement for ImecCoreFMS functions that needed to be finished quickly

Logs are async, since every single log message info-level or higher may be sent to the customer via SSE

This library was made for ASP.NET Core 7 using reflection and dependency injection - please read up on both if you want to edit the library

To call corejobs made with the AICORE low-code JSON system, a function ExecuteCMD has been provided

Full example:

public class TestController : ControllerBase
{
    private readonly CorejobRegistry _corejobs;

    public TestController(CorejobRegistry corejobs)
    {
        _corejobs = corejobs;
    }

    [HttpPost]
    [Route("test_registry")]
    public async Task Test()
    {
        await _corejobs.RunCorejobSSE("test_registry", null);
    }
}

public class CorejobRegistryTest : CorejobRegistryBase
{
    // Has access to all services a controller does:
    private readonly ExampleDBContext _db;
    public CorejobRegistryTest(IHttpContextAccessor httpContextAccessor, ILogger<CorejobRegistryTest> logger, IConfiguration configuration, ExampleDBContext db) : base(httpContextAccessor, logger, configuration)
    {
        _db = db;
    }

    [Corejob("test_registry")]
    [Customer("coredata")]
    public async Task<Result> TestRegistry()
    {
        string? username = GetUserName();
        var user = await _db.Users.Where(u => u.username == username).FirstOrDefaultAsync();
        string customer_folder = await GetCustomerRoot();
        await LogInformation("Current user: " + username + " (" + user.email + ")    Customer folder: " + customer_folder);

        // Low-code JSON corejob
        await ExecuteCMD("bf9fb9b6-8c42-495f-a6e6-2da9ed4a8909", new() {
            ["date"] = DateTime.Now.ToString()
        });

        string? customer = GetCustomerName();
        return Result.Ok().WithSuccess("Successfully ran test_registry for customer " + customer);

        // Any exceptions will automatically be caught and replaced with a Result.Fail() with the exception message; no try/catch needed
    }
}

Remember to add this line in Program.cs:

builder.Services.AddCorejobs();

No packages depend on LibAICORE.

Version Downloads Last updated
1.2.15-alpha-g18195b9aa6 2 11/20/2024
1.2.14-alpha-g137bab6a23 1 11/20/2024
1.2.13-alpha-g8f06d48f79 1 11/20/2024
1.2.12-alpha-g94835e8111 5 10/19/2024
1.2.11-alpha-gf518a6e68d 1 08/14/2024
1.2.10-alpha-gb698fdc405 1 08/14/2024
1.2.9-alpha-g7d4b574a88 2 08/12/2024
1.2.8-alpha-g1d9aa3aaa3 1 08/12/2024
1.2.7-alpha-geadfde9bf6 3 08/06/2024
1.2.6-alpha-ge83d37f49e 1 08/06/2024
1.2.5-alpha-g4f8bc05636 1 08/06/2024
1.2.4-alpha-gd918c1e3fa 1 08/06/2024
1.2.3-alpha-g52eb945744 1 08/06/2024
1.2.2-alpha-gb7cdc63e57 1 08/06/2024
1.2.1-alpha-g02ebe3c8a6 4 07/04/2024
1.1.59-alpha-ga23cb6a1f7 1 07/02/2024
1.1.58-alpha-g737c5fc5cc 4 06/06/2024
1.1.57-alpha-g3293dd9c81 1 06/06/2024
1.1.55-alpha-g6e01950464 1 06/05/2024
1.1.54-alpha-g5d726e75eb 1 06/05/2024
1.1.53-alpha-gc625116210 1 06/05/2024
1.1.52-alpha-ga382c9de4e 0 06/04/2024
1.1.51-alpha-g7aa32cf052 1 05/30/2024
1.1.50-alpha-g671aa1ddb6 4 03/29/2024
1.1.49-alpha-g52ed983c51 0 03/29/2024
1.1.48-alpha-g7600133b25 1 03/28/2024
1.1.47-alpha-gbdc3fcaab9 5 03/19/2024
1.1.46-alpha-g43988be0b3 1 03/19/2024
1.1.45-alpha-gb461cdbead 1 03/18/2024
1.1.44-alpha-g2965cc70cc 1 03/18/2024
1.1.43-alpha-gd8844bf21b 0 03/18/2024
1.1.42-alpha-g618b7561a5 1 03/18/2024
1.1.41-alpha-gf164276ac6 1 03/18/2024
1.1.40-alpha-g43a3f07c8b 1 03/12/2024
1.1.39-alpha-g0ada0164a0 0 03/12/2024
1.1.38-alpha-g24a85d878d 0 03/05/2024
1.1.37-alpha-g1bf4e889bf 4 03/05/2024
1.1.36-alpha-g6b4dd1e943 1 03/05/2024
1.1.35-alpha-g224786f9be 1 03/04/2024
1.1.34-alpha-g16a9665225 1 03/02/2024
1.1.32-alpha-g0905098db4 2 02/29/2024
1.1.31-alpha-g41b279f224 1 02/28/2024
1.1.30-alpha-ga3f59b4728 1 02/28/2024
1.1.29-alpha-g6239f3c232 1 02/28/2024
1.1.28-alpha-gf6015f79e0 1 02/28/2024
1.1.27-alpha-g99b57c4f7e 1 02/28/2024
1.1.26-alpha-g3aad192cc3 2 02/24/2024
1.1.25-alpha-gd5c6144537 0 02/23/2024
1.1.24-alpha-gf15dc0cdfc 1 02/23/2024
1.1.23-alpha-gfc025e1ba4 1 02/22/2024
1.1.18-alpha-g20ffcb8b6b 0 02/22/2024
1.1.17-alpha-g389f191b69 0 02/21/2024
1.1.11-alpha-ge694af15d2 2 02/17/2024
1.1.10-alpha-g19850a3f14 1 02/17/2024
1.1.9-alpha-g4d2dbe4e41 1 02/16/2024
1.1.8-alpha-ga6d88e1b1c 1 02/16/2024
1.1.7-alpha-g977a204511 1 02/16/2024
1.1.6-alpha-g0dddc477b5 1 02/16/2024
1.1.5-alpha-gb937332e73 1 02/16/2024
1.1.4-alpha-gf81b1bf205 1 02/16/2024
1.1.2-alpha-g599cc04df5 1 02/16/2024