@atlashub/smartstack-mcp 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlashub/smartstack-mcp",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "MCP Server for SmartStack/AtlasHub - Conventions validation, migrations analysis, scaffolding",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,46 +1,162 @@
1
1
  using System;
2
2
  using System.ComponentModel.DataAnnotations;
3
+ using SmartStack.Domain.Common;
4
+ using SmartStack.Domain.Common.Interfaces;
3
5
 
4
6
  namespace {{namespace}};
5
7
 
6
8
  /// <summary>
7
9
  /// {{name}} entity{{#if baseEntity}} extending {{baseEntity}}{{/if}}
8
10
  /// </summary>
9
- public class {{name}}{{#if baseEntity}} : IHasId{{/if}}
11
+ {{#if isSystemEntity}}
12
+ public class {{name}} : SystemEntity
13
+ {{else}}
14
+ public class {{name}} : BaseEntity
15
+ {{/if}}
10
16
  {
11
- {{#unless baseEntity}}
17
+ {{#if baseEntity}}
12
18
  /// <summary>
13
- /// Unique identifier
19
+ /// Foreign key to {{baseEntity}}
14
20
  /// </summary>
15
- [Key]
16
- public Guid Id { get; set; } = Guid.NewGuid();
21
+ public Guid {{baseEntity}}Id { get; private set; }
17
22
 
18
23
  /// <summary>
19
- /// Creation timestamp
24
+ /// Navigation property to {{baseEntity}}
20
25
  /// </summary>
21
- public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
26
+ public virtual {{baseEntity}}? {{baseEntity}} { get; private set; }
27
+
28
+ {{/if}}
29
+ // === BUSINESS PROPERTIES ===
30
+ // TODO: Add {{name}} specific properties here
22
31
 
23
32
  /// <summary>
24
- /// Last update timestamp
33
+ /// Private constructor for EF Core
25
34
  /// </summary>
26
- public DateTime? UpdatedAt { get; set; }
35
+ private {{name}}() { }
27
36
 
28
- {{/unless}}
29
- {{#if baseEntity}}
30
37
  /// <summary>
31
- /// Foreign key to {{baseEntity}}
38
+ /// Factory method to create a new {{name}}
32
39
  /// </summary>
33
- public Guid {{baseEntity}}Id { get; set; }
40
+ {{#if isSystemEntity}}
41
+ public static {{name}} Create(
42
+ string code,
43
+ string? createdBy = null)
44
+ {
45
+ return new {{name}}
46
+ {
47
+ Id = Guid.NewGuid(),
48
+ Code = code.ToLowerInvariant(),
49
+ CreatedAt = DateTime.UtcNow,
50
+ CreatedBy = createdBy
51
+ };
52
+ }
53
+ {{else}}
54
+ public static {{name}} Create(
55
+ Guid tenantId,
56
+ string code,
57
+ string? createdBy = null)
58
+ {
59
+ return new {{name}}
60
+ {
61
+ Id = Guid.NewGuid(),
62
+ TenantId = tenantId,
63
+ Code = code.ToLowerInvariant(),
64
+ CreatedAt = DateTime.UtcNow,
65
+ CreatedBy = createdBy
66
+ };
67
+ }
68
+ {{/if}}
34
69
 
35
70
  /// <summary>
36
- /// Navigation property to {{baseEntity}}
71
+ /// Update the entity
37
72
  /// </summary>
38
- public virtual {{baseEntity}} {{baseEntity}} { get; set; } = null!;
73
+ public void Update(string? updatedBy = null)
74
+ {
75
+ UpdatedAt = DateTime.UtcNow;
76
+ UpdatedBy = updatedBy;
77
+ }
39
78
 
40
- {{/if}}
41
- // TODO: Add {{name}} specific properties here
79
+ /// <summary>
80
+ /// Soft delete the entity
81
+ /// </summary>
82
+ public void SoftDelete(string? deletedBy = null)
83
+ {
84
+ IsDeleted = true;
85
+ DeletedAt = DateTime.UtcNow;
86
+ DeletedBy = deletedBy;
87
+ }
88
+
89
+ /// <summary>
90
+ /// Restore a soft-deleted entity
91
+ /// </summary>
92
+ public void Restore(string? restoredBy = null)
93
+ {
94
+ IsDeleted = false;
95
+ DeletedAt = null;
96
+ DeletedBy = null;
97
+ UpdatedAt = DateTime.UtcNow;
98
+ UpdatedBy = restoredBy;
99
+ }
100
+ }
101
+
102
+ // ============================================================================
103
+ // Base Entity Classes (SmartStack.Domain.Common)
104
+ // ============================================================================
105
+ /*
106
+ /// <summary>
107
+ /// Base entity for tenant-scoped entities (default)
108
+ /// </summary>
109
+ public abstract class BaseEntity : ITenantEntity, IHasCode, ISoftDeletable, IVersioned
110
+ {
111
+ public Guid Id { get; set; } = Guid.NewGuid();
112
+ public Guid TenantId { get; set; }
113
+
114
+ private string _code = string.Empty;
115
+ public string Code
116
+ {
117
+ get => _code;
118
+ set => _code = value?.ToLowerInvariant() ?? string.Empty;
119
+ }
120
+
121
+ public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
122
+ public DateTime? UpdatedAt { get; set; }
123
+ public string? CreatedBy { get; set; }
124
+ public string? UpdatedBy { get; set; }
125
+
126
+ public bool IsDeleted { get; set; }
127
+ public DateTime? DeletedAt { get; set; }
128
+ public string? DeletedBy { get; set; }
129
+
130
+ public byte[] RowVersion { get; set; } = Array.Empty<byte>();
42
131
  }
43
132
 
133
+ /// <summary>
134
+ /// Base entity for system-wide entities (no tenant isolation)
135
+ /// </summary>
136
+ public abstract class SystemEntity : ISystemEntity, IHasCode, ISoftDeletable, IVersioned
137
+ {
138
+ public Guid Id { get; set; } = Guid.NewGuid();
139
+
140
+ private string _code = string.Empty;
141
+ public string Code
142
+ {
143
+ get => _code;
144
+ set => _code = value?.ToLowerInvariant() ?? string.Empty;
145
+ }
146
+
147
+ public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
148
+ public DateTime? UpdatedAt { get; set; }
149
+ public string? CreatedBy { get; set; }
150
+ public string? UpdatedBy { get; set; }
151
+
152
+ public bool IsDeleted { get; set; }
153
+ public DateTime? DeletedAt { get; set; }
154
+ public string? DeletedBy { get; set; }
155
+
156
+ public byte[] RowVersion { get; set; } = Array.Empty<byte>();
157
+ }
158
+ */
159
+
44
160
  // ============================================================================
45
161
  // EF Core Configuration
46
162
  // ============================================================================
@@ -54,12 +170,40 @@ public class {{name}}Configuration : IEntityTypeConfiguration<{{name}}>
54
170
  {
55
171
  public void Configure(EntityTypeBuilder<{{name}}> builder)
56
172
  {
57
- // Table name with convention prefix
58
- builder.ToTable("{{tablePrefix}}{{name}}s");
173
+ // Table name with schema and domain prefix
174
+ builder.ToTable("{{tablePrefix}}{{name}}s", "{{schema}}");
59
175
 
60
176
  // Primary key
61
177
  builder.HasKey(e => e.Id);
62
178
 
179
+ {{#unless isSystemEntity}}
180
+ // Multi-tenant
181
+ builder.Property(e => e.TenantId).IsRequired();
182
+ builder.HasIndex(e => e.TenantId);
183
+
184
+ // Code: lowercase, unique per tenant (filtered for soft delete)
185
+ builder.Property(e => e.Code).HasMaxLength(100).IsRequired();
186
+ builder.HasIndex(e => new { e.TenantId, e.Code })
187
+ .IsUnique()
188
+ .HasFilter("[IsDeleted] = 0")
189
+ .HasDatabaseName("IX_{{tablePrefix}}{{name}}s_Tenant_Code_Unique");
190
+ {{else}}
191
+ // Code: lowercase, unique (filtered for soft delete)
192
+ builder.Property(e => e.Code).HasMaxLength(100).IsRequired();
193
+ builder.HasIndex(e => e.Code)
194
+ .IsUnique()
195
+ .HasFilter("[IsDeleted] = 0")
196
+ .HasDatabaseName("IX_{{tablePrefix}}{{name}}s_Code_Unique");
197
+ {{/unless}}
198
+
199
+ // Concurrency token
200
+ builder.Property(e => e.RowVersion).IsRowVersion();
201
+
202
+ // Audit fields
203
+ builder.Property(e => e.CreatedBy).HasMaxLength(256);
204
+ builder.Property(e => e.UpdatedBy).HasMaxLength(256);
205
+ builder.Property(e => e.DeletedBy).HasMaxLength(256);
206
+
63
207
  {{#if baseEntity}}
64
208
  // Relationship to {{baseEntity}} (1:1)
65
209
  builder.HasOne(e => e.{{baseEntity}})
@@ -84,4 +228,4 @@ public class {{name}}Configuration : IEntityTypeConfiguration<{{name}}>
84
228
  // ============================================================================
85
229
  // Migration Command
86
230
  // ============================================================================
87
- // dotnet ef migrations add $(date +%Y%m%d)_Core_XXX_Add{{name}}
231
+ // dotnet ef migrations add core_vX.X.X_XXX_Add{{name}} --context ApplicationDbContext