πΎ Data Access Layer β
Π‘Π»ΠΎΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π±ΡΠ΄Π΅ΠΌ Π½Π°Π·ΡΠ²Π°ΡΡ DAL (Data Access Layer).
ΠΠ°Π½Π½ΡΠΉ ΡΠ΅ΡΠΌΠΈΠ½ ΠΏΠΎΠ·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°Π½ ΠΈΠ· ΠΌΠΈΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ (Π΅ΡΠ»ΠΈ Π΅ΡΠ΅ ΡΠΎΡΠ½Π΅Π΅ β ΠΈΠ· .NET). ΠΠ΄Π½Π°ΠΊΠΎ Π²Π΅ΡΡΠΌΠ° ΡΠ΄Π°ΡΠ½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ Π΄Π°Π½Π½ΡΡ β Π²Π΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠΈΠ²Π°Ρ.
ΠΡΠ΅ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠ° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² ΠΆΠΈΠ²ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΡΠΌΠ°Ρ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ² HTTP-API, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ Π΄Π°Π½Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ HTTP-API ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ socket.io ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ HTTP-API) ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
ΠΡΠΈ ΡΡΠΎΠΌ ΡΠΈΠΏΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΎΠ±Π»Π°Π΄Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ²Π»ΡΡΡΡΡ ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΠ°ΡΠ° Π³Π»Π°Π²Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° β ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΈΡΠ»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²Π½Π΅ΡΡΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ².
ΠΠΎΡΡΠΎΠΌΡ Π²ΡΠ΅ Π·Π½Π°Π½ΠΈΡ ΠΎΠ± ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°Ρ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ DAL.
ΠΠ»Ρ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΠ΅ API Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΌΡΡΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ (ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΡΡΡΠ΅ΠΊΡΠΎΠ² ΠΈ ΡΠ²Π΅Π½ΡΠΎΠ²).
Π‘Π°ΠΌΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠΎ, ΡΡΠΎ Π²Π½Π΅ΡΠ½Π΅Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΠΎΡΠΊΡΠ΄Π° ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ. ΠΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π² Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π°Π·Π²Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ "dal", Π° Π½Π΅ "rest-api" ΠΈΠ»ΠΈ "http".
DAL ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π²Π½ΡΡΡΠΈ ΡΠ΅Π±Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΡ Π΄Π°Π½Π½ΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, JWT access token.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ»ΠΎΡ DAL ΠΈ Π΅Π³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° Π½Π°ΡΠ΅ΠΌ Π΄Π΅ΠΌΠΎ-ΠΏΡΠΈΠΌΠ΅ΡΠ΅.
Π ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ dal/request
Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ:
- Π‘ΡΠΎΡ
$accessToken
. - Π‘ΠΎΠ±ΡΡΠΈΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
initAuthState, resetAuthState
. - Π‘ΠΎΠ±ΡΡΠΈΡ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°
authenticate
ΠΈtokenChanged
(Π½Π° ΡΠ»ΡΡΠ°ΠΉ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΡΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅Π½Π°). - ΠΡΡΠ΅ΠΊΡΡ-ΠΎΠ±Π΅ΡΡΠΊΠΈ Π½Π°Π΄ http-Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ
requestFx
ΠΈauthRequestFx
.
ΠΡΡ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° Π² init.ts ΠΠ΄Π΅ΡΡ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠΎΡ $accessToken
Ρ ΡΠ²Π΅Π½ΡΠ°ΠΌΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π΄Π»Ρ requestFx
ΠΈ authRequestFx
, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π° ΠΈΠ· localStorage
.
ΠΡΡΠ΅ΠΊΡΡ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ API, ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΠΈΠ΅ http-ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ, Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΊΠΎΡΠ½Π΅ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° Π² ΡΠ°ΠΉΠ»Π°Ρ auth.ts ΠΈ products.ts.
ΠΠ»Ρ ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΠΎΡΠ²Π΅ΡΠ° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ attachWrapper ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ @42px/effector-extra.
Π’ΡΡ ΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° forward
Π² auth.ts:
forward({
from: signInReqFx.doneData.map(({ token }) => token),
to: authenticate,
})
ΠΡΠΎΡ forward
Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ $accessToken
ΠΏΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΡΠ΅Π·ΠΎΠ»Π²Π΅ ΡΡΡΠ΅ΠΊΡΠ° signInFx
. ΠΠ½Π΅ΡΠ½Π΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ.
Upd 12.11.23 Π Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ effector (v22) ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
sample
Π²ΠΌΠ΅ΡΡΠΎforward
.
https://effector.dev/docs/api/effector/sample
ΠΡΠ΅ ΡΡΠΎ ΠΎΡΡΠ°Π΅ΡΡΡ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
- ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΠ°ΠΌΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² features/app/model/init.ts.
- ΠΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠ΅ΠΊΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ/ΠΌΡΡΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΊ Π½ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄. ΠΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ sign-in.
ΠΠ°Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ . ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠ»ΠΎΡ DAL ΠΈ Π΅Π³ΠΎ API Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π·Π°Π΄Π°Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π΅Π³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ ΠΈ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΎΠΌΠΈΠΌΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΌΡΡΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ
, ΡΠ»ΠΎΠΉ DAL ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΈΠΏΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ (Π² Π΄Π΅ΠΌΠΎ-ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠΎ src/dal/entities.ts
) ΠΈ ΠΌΠΎΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎΠ΄ΡΡΠΎΠΆΠΈΠΌ:
Π‘Π»ΠΎΠΉ DAL ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡΡΡ ΠΎΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² Π΄Π°Π½Π½ΡΡ ΠΈ ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² API Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΌΡΡΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ , Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΈΠΏΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΈ ΠΌΠΎΠΊΠΈ.