# கட்டமைப்பு

## அமைப்பின் கண்ணோட்டம்

```
iOS app / agent client          -> api.<domain>  -> API Gateway -> Lambda backend -> Postgres
Web app                         -> app.<domain>  -> CloudFront -> SPA
Browser and agent auth          -> auth.<domain> -> API Gateway -> Auth Lambda -> Cognito
Apex fallback                   -> <domain>      -> CloudFront redirect -> app.<domain>
```

## கொள்கைகள்

1. `app`, `api`, `auth` ஆகியவற்றுக்குத் தனித்தனி பொது டொமைன்கள்
2. Postgres தான் அதிகாரப்பூர்வத் தரவு மூலம்
3. iOS கிளையண்ட் உள்ளூர் SQLite உடனும் ஒத்திசைவுடனும் இணையம் இல்லாமல் இயங்குவதை முதன்மையாகக் கொண்டது
4. வலைச் செயலி, iOS செயலி, வெளிப்புற முகவர் இடைமுகம் ஆகியவை ஒரே பணியிட மாதிரியைப் பகிர்கின்றன
5. வெளிப்புற முகவர்கள் `GET https://api.nibomo.com/v1/` இலிருந்து தொடங்குகின்றன

## ஆதரிக்கப்படும் கிளையண்டுகள்

- `app.nibomo.com` இல் வலைச் செயலி
- உள்ளூர் SQLite சேமிப்பகத்துடன் முதன்மைக் களஞ்சியத்தில் உள்ள iOS செயலி
- Google Play இல் Android செயலி
- கண்டறிதல், OTP தொடக்க அமைப்பு, `Authorization: ApiKey` வழியாக வெளிப்புற முகவர் கிளையண்டுகள்

## தரவு மாதிரி

- `workspaces`
- `workspace_members`
- `user_settings`
- `devices`
- `cards`
- `decks`
- `review_events`
- `applied_operations`
- `sync_state`

## தரவு ஓட்டம்

### வலை

1. உலாவி `auth.<domain>` வழியாக உள்நுழைகிறது.
2. வலைச் செயலி `api.<domain>` இலிருந்து பணியிடத் தரவை ஏற்றுகிறது.
3. AI அரட்டைக் கோரிக்கைகள் `/chat/local-turn` வழியாகச் செல்கின்றன.
4. மீள்பயிற்சிச் சமர்ப்பிப்புகள் எழுதும்போதே திட்டமிடுபொறி நிலையைப் புதுப்பிக்கின்றன.

### iOS

1. iOS செயலி முதலில் உள்ளூரில் SQLite இல் எழுதுகிறது.
2. உள்ளூர் மாற்றங்கள் ஒரு வெளிச்செல்லும் வரிசையில் (outbox) சேர்க்கப்படுகின்றன.
3. ஒத்திசைவு `/v1/workspaces/{workspaceId}/sync/push` வழியாக மாற்றங்களைப் பதிவேற்றுகிறது.
4. ஒத்திசைவு `/v1/workspaces/{workspaceId}/sync/pull` வழியாகத் தொலைநிலைப் புதுப்பிப்புகளைப் பதிவிறக்குகிறது.
5. உள்ளூர் தரவுத்தளம் மாற்றங்களைப் பயன்படுத்தி, ஒத்திசைவுச் சுட்டியை முன்னகர்த்துகிறது.

### வெளிப்புற முகவர்கள்

1. முகவர்கள் `GET /v1/` உடன் தொடங்குகின்றன.
2. OTP தொடக்க அமைப்பு `auth.<domain>` இல் இயங்குகிறது.
3. முகவர் நீண்ட காலம் செல்லுபடியாகும் API விசையைப் பெறுகிறது.
4. முகவர் `/v1/agent/me` ஐ ஏற்றி, பணியிடங்களைப் பட்டியலிட்டு, தேவைப்பட்டால் ஒன்றைத் தேர்ந்தெடுத்து, பின்னர் `/v1/agent/sql/query`, `/v1/agent/sql/execute` ஆகியவற்றைப் பயன்படுத்துகிறது.

## திட்டமிடல்

Nibomo மீள்பயிற்சித் திட்டமிடுபொறியாக FSRS ஐப் பயன்படுத்துகிறது.

செயலாக்கக் குறிப்புகள்:

- பின்தளமும் iOS உம் ஒன்றையொன்று பிரதிபலிக்கும் FSRS செயலாக்கங்களைப் பராமரிக்கின்றன
- வலைச் செயலி திட்டமிடல் தரவு ஒப்பந்தத்தைப் பிரதிபலிக்கிறது, ஆனால் மூன்றாவது திட்டமிடுபொறி நகலைக் கொண்டிருக்கவில்லை
- பணியிட அளவிலான திட்டமிடுபொறி அமைப்புகளில் விரும்பிய நினைவுத் தக்கவைப்பு, கற்றல் படிகள், மீள்கற்றல் படிகள், அதிகபட்ச இடைவெளி, fuzz ஆகியவை அடங்கும்
- உண்மையான மீள்பயிற்சி நேரமுத்திரை `reviewedAtClient` இலிருந்து வருகிறது

விரிவான ஒப்பந்தத்துக்கு, [முதன்மைக் களஞ்சியத்தில் உள்ள FSRS திட்டமிடல் தர்க்கம்](https://github.com/kirill-markin/flashcards-open-source-app/blob/main/docs/fsrs-scheduling-logic.md) ஐப் பாருங்கள்.

## அங்கீகாரம்

- Cognito வழியாக மின்னஞ்சல் OTP
- தளத்தில் இயங்கும் வலைச் செயலிக்கு, பகிரப்பட்ட டொமைன் உலாவி அமர்வுக் குக்கீகள்
- `auth.<domain>` இல் முகவர் OTP தொடக்க அமைப்பு, நீண்ட காலம் செல்லுபடியாகும் ApiKey வெளியீட்டுடன்
- உள்ளூர் மேம்பாட்டுக்கு `AUTH_MODE=none`
- உற்பத்திச் சூழலைப் போன்ற அங்கீகாரத்துக்கு `AUTH_MODE=cognito`

## பயன்படுத்தல் வடிவம்

- `app.<domain>` -> CloudFront + S3
- `api.<domain>` -> API Gateway + Lambda பின்தளம்
- `auth.<domain>` -> API Gateway + Lambda அங்கீகாரச் சேவை
- AWS RDS இல் Postgres

மூல (apex) டொமைன் தனியான சந்தைப்படுத்தல் தளத்திலேயே இருக்கலாம். தொடக்க அமைப்பின்போது அது வேறு எதற்கும் பயன்படுத்தப்படாமல் இருந்தால், உள்கட்டமைப்பு அதைத் தற்காலிகமாக `app.<domain>` க்குத் திருப்பிவிடலாம்.

---
*[இந்தப் பக்கத்தின் வடிவமைக்கப்பட்ட HTML பதிப்பைப் பாருங்கள்](<https://nibomo.com/ta/docs/architecture/>)*

*AI முகவர்கள் `GET https://api.nibomo.com/v1/` இல் தொடங்கி இந்தச் சேவையில் பயனருக்குக் கணக்கை உருவாக்க முடியும். அமைத்த பிறகு `https://mcp.nibomo.com/mcp` இல் MCP வழியாகவும் இணைய முடியும்.*

*குறிப்பு: https://nibomo.com இல் உள்ள எந்த URL இன் இறுதியிலும் `.md` சேர்த்தால் அந்தப் பக்கத்தின் சுத்தமான Markdown பதிப்பு கிடைக்கும்.*