feat(m9/T32a): SharedSchema entity + EF config + idempotent migration + repository
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
namespace ZB.MOM.WW.ScadaBridge.Commons.Entities.Schemas;
|
||||
|
||||
/// <summary>
|
||||
/// A reusable, named JSON-Schema library entry (M9 template-level JSON-Schema library,
|
||||
/// Task T32a). Schemas are referenced from inbound-API / template schema definitions via a
|
||||
/// <c>{"$ref":"lib:Name"}</c> pointer resolved against this library (the resolver lands in
|
||||
/// T32b). One row per named schema in the central <c>SharedSchemas</c> MS SQL table.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Persistence-ignorant POCO; the EF Core mapping lives in the Configuration Database
|
||||
/// component (<c>SharedSchemaConfiguration</c>). Mirrors the single-table
|
||||
/// <see cref="ZB.MOM.WW.ScadaBridge.Commons.Entities.Scripts.SharedScript"/> entity/config/
|
||||
/// repository shape — surrogate <c>Id</c>, a unique <see cref="Name"/>, and an unbounded
|
||||
/// text body.
|
||||
/// </remarks>
|
||||
public class SharedSchema
|
||||
{
|
||||
/// <summary>Primary key.</summary>
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>Unique schema name used to reference this entry (e.g. <c>lib:Name</c>).</summary>
|
||||
public required string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Optional scope discriminator for future namespacing/visibility partitioning;
|
||||
/// <c>null</c> means an unscoped (global) library entry.
|
||||
/// </summary>
|
||||
public string? Scope { get; set; }
|
||||
|
||||
/// <summary>The JSON Schema document text.</summary>
|
||||
public required string SchemaJson { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Schemas;
|
||||
|
||||
namespace ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// Data access for the central <c>SharedSchemas</c> JSON-Schema library table
|
||||
/// (M9 template-level JSON-Schema library, Task T32a). One row per named schema; the
|
||||
/// unique <see cref="SharedSchema.Name"/> is the lookup key used by the <c>lib:Name</c>
|
||||
/// <c>$ref</c> resolver (T32b).
|
||||
/// </summary>
|
||||
public interface ISharedSchemaRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// Inserts <paramref name="schema"/> and returns the store-generated
|
||||
/// <see cref="SharedSchema.Id"/>.
|
||||
/// </summary>
|
||||
/// <param name="schema">The schema to persist.</param>
|
||||
/// <param name="ct">Cancellation token.</param>
|
||||
/// <returns>A task that resolves to the generated identity of the inserted row.</returns>
|
||||
Task<int> AddAsync(SharedSchema schema, CancellationToken ct = default);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the row for the given id, or <c>null</c> if none exists.
|
||||
/// </summary>
|
||||
/// <param name="id">The identity to look up.</param>
|
||||
/// <param name="ct">Cancellation token.</param>
|
||||
/// <returns>A task that resolves to the matching <see cref="SharedSchema"/>, or <c>null</c>.</returns>
|
||||
Task<SharedSchema?> GetByIdAsync(int id, CancellationToken ct = default);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the row whose <see cref="SharedSchema.Name"/> matches
|
||||
/// <paramref name="name"/>, or <c>null</c> if none exists.
|
||||
/// </summary>
|
||||
/// <param name="name">The unique schema name to look up.</param>
|
||||
/// <param name="ct">Cancellation token.</param>
|
||||
/// <returns>A task that resolves to the matching <see cref="SharedSchema"/>, or <c>null</c>.</returns>
|
||||
Task<SharedSchema?> GetByNameAsync(string name, CancellationToken ct = default);
|
||||
|
||||
/// <summary>
|
||||
/// Returns all schemas ordered by <see cref="SharedSchema.Name"/>.
|
||||
/// </summary>
|
||||
/// <param name="ct">Cancellation token.</param>
|
||||
/// <returns>A task that resolves to every library entry, name-ordered.</returns>
|
||||
Task<IReadOnlyList<SharedSchema>> ListAsync(CancellationToken ct = default);
|
||||
|
||||
/// <summary>
|
||||
/// Persists the current state of <paramref name="schema"/> (matched by
|
||||
/// <see cref="SharedSchema.Id"/>).
|
||||
/// </summary>
|
||||
/// <param name="schema">The entity whose changes to persist.</param>
|
||||
/// <param name="ct">Cancellation token.</param>
|
||||
/// <returns>A task that represents the asynchronous operation.</returns>
|
||||
Task UpdateAsync(SharedSchema schema, CancellationToken ct = default);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the row with the given id; a no-op if none exists.
|
||||
/// </summary>
|
||||
/// <param name="id">The identity to delete.</param>
|
||||
/// <param name="ct">Cancellation token.</param>
|
||||
/// <returns>A task that represents the asynchronous operation.</returns>
|
||||
Task DeleteAsync(int id, CancellationToken ct = default);
|
||||
}
|
||||
Reference in New Issue
Block a user