# 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<T>`, `AcEmailRecipient<T>` — email messaging system |
| `Profiles/` | `AcProfile<TAddress>` — 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<TLogItem>` 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<TUser, TUserToCompany, TProfile, TAddress>`). 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` |
