# AyCode.Entities @project { type = "framework" } Abstract base entity implementations for the AyCode domain model. All entities are abstract and generic — concrete implementations live in application-specific projects. Implements the interfaces defined in `AyCode.Interfaces`. ## Folder Structure | Folder | Purpose | |---|---| | `Addresses/` | `AcAddress` — address entity with lat/lng, validation flag | | `Groups/` | `GroupBase` — base group entity with `IsPublic` flag | | `Locations/` | `LocationBase` — read-only location (lat/lng/address) | | `LogItems/` | `AcLogItemClient` — MessagePack-serializable log item DTO | | `Messages/` | `AcEmailMessage`, `AcEmailRecipient` — email messaging system | | `Profiles/` | `AcProfile` — user profile with name, media, address FK | | `ServiceProviders/` | `AcCompany<...>` — company entity with owner, users, commission | | `Users/` | `AcUser<...>`, `AcUserToCompany<...>`, `AcUserTokenBase` — user, junction table, auth tokens | ## Root Files - **`PermissionContextMappingSubjectType.cs`** — Enum: `NotDefined`(0), `User`(5), `Group`(10). - **`AcLogItemWriterBase.cs`** — Generic log writer `AcLogItemWriterBase` extending `AcLogWriterBase`. Thread-safe via mutex. Abstract `WriteLogItemCallback()` for concrete implementations. - **`AcModelDtoExtension.cs`** — Extension methods for entity-to-DTO conversion via `Activator.CreateInstance`. ## Key Design Patterns - **Abstract + Generic** — All entities are `abstract` with generic type parameters for navigation properties (e.g., `AcCompany`). This allows different applications to compose concrete types. - **Interface implementation** — Each entity implements its corresponding `AyCode.Interfaces` interface. - **Timestamps** — All entities implement `ITimeStampInfo` (`Created`, `Modified`). - **Guid PKs** — Most entities use `Guid Id` as primary key; `AcUserTokenBase` uses `int Id` (auto-increment). ## Dependencies | Dependency | Purpose | |---|---| | `AyCode.Interfaces` | Interface contracts this project implements | | `MessagePack.Annotations` | `[MessagePackObject]` on `AcLogItemClient` |