ΡΠΈΠΌΠΎΡΠ΅Ρ Ρ ΠΈΡΡΡΠ½ΠΎΠ²Π° ΠΌΡΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° python
ΠΠΎΡ ΡΠΆΠ΅ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π»Π΅Ρ Π’ΠΈΠΌΠΎΡΠ΅ΠΉ, ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ ΠΊΠ°ΡΠ΅Π΄ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΊΠΈ ΠΠ€Π’Π, Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΡΠ²ΠΎΠΈ Π»Π΅ΠΊΡΠΈΠΈ ΠΏΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ²ΠΎΡΠΌ Youtube ΠΊΠ°Π½Π°Π»Π΅ Ρ ΠΎΡΠΊΡΡΡΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° python
217 ΠΏΠΎΡΡΠΎΠ² 7.5K ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°
ΠΡΠ°Π²ΠΈΠ»Π° ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°
ΠΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Ρ Π»ΡΠ±ΡΠΌ ΡΠ΅ΠΉΡΠΈΠ½Π³ΠΎΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ!
β’ ΡΠ²Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌ ΠΈ Π°Π²ΡΠΎΡΠ°ΠΌ
β’ ΠΏΡΠΎΡΡΠΎΡΠ° ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ ΠΏΠΎΠ²Π΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ
β’ ΡΠ΅Π³ python2 ΠΈΠ»ΠΈ python3, Π΅ΡΠ»ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ
β’ ΠΊΠΎΠ΄ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΈΡΠ°ΡΡ, Π»ΠΈΠ±ΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΡ
β’ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ ΠΎΡΠΊΠΎΡΠ±Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²ΠΎΠΊΠ°ΡΠΈΠΈ
β’ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΠΎΠ΅ ΠΠ
β’ ΠΏΡΠΎΡΠΈΡΡ ΡΠ΅ΡΠΈΡΡ Π²Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ Π·Π° Π²Π°Ρ
ΠΠΎΠΌΡ-ΡΠΎ ΠΏΠΎΡΠ° ΠΎΡΠ΄ΠΎΡ Π½ΡΡΡ
ΠΠ°ΠΊΠΎΠΉ ΠΊΠ°ΡΠ°Π½ΡΠΈΠ½, Π²Ρ ΡΠ΅Π³ΠΎ?
Π 2020 Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° Π΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΡΡ Π»Π΅ΠΊΡΠΈΡ.
ΠΡΠ°ΠΌΠΎΡΠ½ΠΎ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ.
ΠΠ΅ Π·Π½Π°Ρ, ΠΠΈΡΠΎΠ½ Π½Π΅ ΡΡΠΈΠ», Π½ΠΎ ΠΊΡΡΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π» Ρ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ΠΌ.
Π·Π°ΡΠ΅ΠΌ Ρ ΡΡΠΎ ΡΠΌΠΎΡΡΡ Ρ ΠΆΠ΅ Π΄Π°Π»Π΅ΠΊ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ=)
Π° Π²Π·Π»Π°ΠΌΡΠ²Π°ΡΡ ΠΏΠ΅Π½ΡΠ°Π³ΠΎΠ½ Π½Π°ΡΡΠ°Ρ?)))
ΠΠ΅Π½Ρ ΠΏΠΎΡΠ°Π·ΠΈΠ»ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΠΎΡΠ»Π΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΡΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΏΠΎΠ½ΡΠΎΡΡΡΠ²Π° Π½Π° ΠΊΠ°Π½Π°Π»Π΅, Π½Π΅ Π½Π°ΡΠ΅Π» ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΠ°ΡΡ ΡΠΏΠΎΠ½ΡΠΎΡΠΎΠΌ))
ΠΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ Ρ Π½ΡΠ»Ρ. Π‘Π»ΡΡΠ°ΠΉΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ. Π£ΡΠΎΠΊ 53 ΠΈΠ· 60
ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ by accident ΠΈ by chance, owing to ΠΈ due to.
ΠΠΈΠ΄Π΅ΠΎ Π²Π·ΡΡΡ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ Ρ ΠΠ½Π½ΠΎΠΉ (Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΡΠΎΠΊΠ΅ ΡΠ»ΠΎΠ²Π°, Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° ΡΡΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄, ΠΏΠΈΡΡΠΌΠ΅Π½Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄).
ΠΠ°ΠΊ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠΌΠΎΠ³ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡΡΡ
ΠΠ°ΠΊ ΠΈ ΠΎΠ±Π΅ΡΠ°Π», ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΎΠΏΡΡ #comment_214455065 ΠΈ Π΅ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΡΠ΅ #comment_213570081
ΠΠΎΠ³Π΄Π° Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΡΡΠΏΠΈΠ» Π² ΡΠ½ΠΈΠ²Π΅Ρ, Ρ Π½Π°Ρ Π±ΡΠ» ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ, Π³Π΄Π΅ ΠΈΠ·ΡΡΠ°Π»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. Π’ΠΎΡΠ½ΠΎΠ³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠΌΠ½Ρ.
ΠΠ° ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΠΈΠ· Π·Π°Π½ΡΡΠΈΠΉ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ Π·Π°Π΄Π°Π» Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ ΡΠ°ΠΉΡ.
ΠΠ΅Ρ Ρ 14-15 Ρ Π½Π°ΡΠ°Π» ΡΠ²Π»Π΅ΠΊΠ°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠΡΠΈΡΠΈΠ½ΠΎΠΉ ΡΠΎΠΌΡ ΡΡΠ°Π»ΠΎ, ΡΡΠΎ Ρ ΡΡΡΠ°Π» ΠΈΠ³ΡΠ°ΡΡ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΈΠ³ΡΡ, Ρ.ΠΊ. ΠΊΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π° Π²ΡΡ Π·Π°Π²ΠΈΡΠ΅Π»ΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡ ΡΡΠ΄Π° Π΄Π΅Π½Π΅Π³ Π²Π»ΠΎΠΆΠΈΡΡ.
Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΠ½Π΅ Π½Π°Π΄ΠΎΠ΅Π»ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ³ΡΠΎΠΊΠΎΠ² Π²ΡΡΡΠ½ΡΡ ΠΈ Ρ ΡΡΠ°Π» ΠΈΠ·ΡΡΠ°ΡΡ ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠ°ΠΌΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ. Π’ΡΡ-ΡΠΎ Ρ ΠΈ Π½Π°ΡΠ°Π» ΠΈΠ·ΡΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅.
Π ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ, Π³ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π· 2 Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ ΡΠ°ΠΉΡ, Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ(Π½Π° ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΡΡΠΌΠΎ ΠΠΠ£).
ΠΡΠΎΡ ΡΠ°ΠΉΡ Ρ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π» ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ. ΠΠ½ Π½Π° ΠΌΠ΅Π½Ρ ΡΠ°ΠΊ ΠΈΡΠΊΠΎΡΠ° ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π», ΡΠΈΠΏΠ° «ΠΠ³Π°, ΡΠ°ΠΌ Π½Π°ΠΏΠΈΡΠ°Π»». Π Π½Π°ΡΠ°Π» ΡΠ°ΡΡΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΡΠΎ Π·Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΡΠΎ ΠΎΠ½ΠΈ Π·Π½Π°ΡΠΈΡ. ΠΠΎΠΏΡΠΎΡΠΎΠ² 5-6 Π±ΡΠ»ΠΎ, Π²ΡΡ ΠΎΠ±ΡΡΡΠ½ΠΈΠ». ΠΠ½ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π» Π½Π° ΠΌΠ΅Π½Ρ Ρ ΡΠ²Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΡΠΊΠ°Π·Π°Π»: ΠΠΎΠΆΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π° ΠΌΠΎΠΈ Π·Π°Π½ΡΡΠΈΡ Π½Π΅ Ρ ΠΎΠ΄ΠΈΡΡ. Π’Ρ ΡΡΡ Π½ΠΈΡΠ΅ΠΌΡ Π½ΠΎΠ²ΠΎΠΌΡ Π½Π΅ Π½Π°ΡΡΠΈΡΡΡΡ. Π Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠ΅ΡΡ ΠΏΠΎΠ΄Π·Π°ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΡΠΎ Ρ ΡΠ½ΠΈΠ²Π΅ΡΠ° Π΅ΡΡΡ Π·Π°Π΄Π°ΡΠ°, ΠΊΠΎΡΠΎΡΡΡ Π½Π°Π΄ΠΎ ΡΠ΅ΡΠΈΡΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ Π΄Π°Π» ΠΌΠ½Π΅ ΠΏΠ΅ΡΠ²ΡΡ ΠΎΠΏΠ»Π°ΡΠΈΠ²Π°Π΅ΠΌΡΡ Π·Π°Π΄Π°ΡΡ ΠΏΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π΄Π°Π» ΠΌΠ½Π΅ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡ Π² ΡΠ΅Π±Π΅ ΠΈ ΡΠ²ΠΎΠΈΡ ΡΠΌΠ΅Π½ΠΈΡΡ .
Π ΠΈΡΠΎΠ³Π΅, Π·Π°Π΄Π°ΡΡ Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ», ΠΎΠ½ Π΅Ρ ΠΏΡΠΈΠ½ΡΠ». ΠΠΏΠ»Π°ΡΠΈΠ»ΠΈ ΠΌΠ½Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ(14 Ρ.Ρ., ΡΡΠΎ Π΄Π»Ρ ΡΡΡΠ΄Π΅Π½ΡΠ° ΠΎΠ³ΠΎ-Π³ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅Π½ΡΠ³ΠΈ). Π‘ ΡΠ΅Ρ ΠΏΠΎΡ Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΊΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°ΡΠ°Π±Π°ΡΡΠ²Π°Ρ Π½Π° ΡΠ²ΠΎΡΠΌ Ρ ΠΎΠ±Π±ΠΈ.
ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΠΠ°Π»Π΅ΡΠΈΠΉ ΠΠ»Π΅ΠΊΡΠ°Π½Π΄ΡΠΎΠ²ΠΈΡ ΠΈΠ· Π‘ΠΠ±ΠΠ£Π’
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΡ Π·Π°ΠΌΠ΅ΡΠΎΠΊ Ρ Π½ΡΠ»Ρ. Π§Π°ΡΡΡ 2: REST API Π΄Π»Ρ RESTful API Service + JWT + Swagger
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ΅ΡΠΈΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ² ΠΏΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π·Π°ΠΌΠ΅ΡΠΎΠΊ. Π ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ RESTful API Service Π½Π° Go cΠΎ Swagger ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. ΠΡΠ΄Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π° ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡΠΎΠ².
Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π»ΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΡΡΠ΅Π±ΡΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ.
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π² Π²ΠΈΠ΄Π΅ΠΎ ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ΅ ΠΏΠΎΠ΄ Π½ΠΈΠΌ.
ΠΠ°ΡΠ½ΡΠΌ Ρ ΠΌΠ°ΠΊΠ΅ΡΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΡΠΊΠΈ Π±ΡΠ΄ΡΡ Ρ Π½Π°ΡΠ΅Π³ΠΎ API ΠΈ ΠΊΠ°ΠΊΠΎΠΉ ΡΠΎΡΡΠ°Π² Π΄Π°Π½Π½ΡΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ΄Π°Π²Π°ΡΡ. ΠΠ°ΠΊΠ΅ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠ»Ρ ΠΈ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ½Π»Π°ΠΉΠ½-ΡΠ΅ΡΠ²ΠΈΡ NinjaMock. ΠΠ½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, Π΅ΡΠ»ΠΈ ΠΌΠ°ΠΊΠ΅Ρ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π±ΡΡΡΡΠΎ ΠΈ Π±Π΅Π· Π»ΠΈΡΠ½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
Π‘ΡΡΠ°Π½ΠΈΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΡΠΎΡΡΡΡ, Ρ ΡΠ΅ΡΡΡΡΠΌΡ ΠΏΠΎΠ»ΡΠΌΠΈ: Name, Email, Password ΠΈ Repeat Password. ΠΠ΅ΠΉΠ±Π»Ρ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, ΠΎΠ±ΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ΄Π΅ΡΠ°ΠΌΠΈ. ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎ ΡΠ·Π΅ΡΠ½Π΅ΠΉΠΌΡ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ.
ΠΠΎΡΠ»Π΅ Π²Ρ ΠΎΠ΄Π° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²ΠΈΠ΄ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π·Π°ΠΌΠ΅ΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Ρ Π½Π°ΡΠ΅Π³ΠΎ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
— Π‘Π»Π΅Π²Π° β ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π»ΡΠ±ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΠΈ.
— Π‘ΠΏΡΠ°Π²Π° β ΡΠΏΠΈΡΠΎΠΊ Π·Π°ΠΌΠ΅ΡΠΎΠΊ Π² Π²ΠΈΠ΄Π΅ ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅Π»ΠΈΡΡΡ Π½Π° Π΄Π²Π° ΡΠΏΠΈΡΠΊΠ°: ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½ΡΠ΅ ΠΈ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ.
— ΠΠ°ΠΆΠ΄Π°Ρ ΠΊΠ°ΡΡΠΎΡΠΊΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ΅Π·Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΎΡΠ΅Π½Ρ Π΄Π»ΠΈΠ½Π½ΡΠΉ.
— Π‘ΠΏΡΠ°Π²Π° ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄/ΠΌΠΈΠ½ΡΡ/ΡΠ°ΡΠΎΠ²/Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄ Π±ΡΠ»Π° ΡΠΎΠ·Π΄Π°Π½Π° Π·Π°ΠΌΠ΅ΡΠΊΠ°.
— Π’Π΅Π»ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° β ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½ΡΠΉ Markdown.
— ΠΠ°Π½Π΅Π»Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². Π§Π΅ΡΠ΅Π· Π½Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ²Π΅Ρ, ΠΏΡΠΈΠΊΡΠ΅ΠΏΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ Π·Π°ΠΌΠ΅ΡΠΊΡ.
Π’ΡΡ Π²Π°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠ°ΠΉΠ»Ρ Π·Π°ΠΌΠ΅ΡΠΊΠΈ ΠΌΡ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ ΠΈ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Ρ API Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΎΠΊ.
ΠΠΎΠ»Π½Π°Ρ ΠΊΠ°ΡΡΠΎΡΠΊΠ° ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡ Π½Π° Π·Π°ΠΌΠ΅ΡΠΊΡ. Π’ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ°Π·Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π΄Π»ΠΈΠ½Π½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ. ΠΡΡΠΎΡΠ° Π·Π°ΠΌΠ΅ΡΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠ΅ΠΊΡΡΠ°. ΠΠ»Ρ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΠ΅ΠΊΡΠΈΡ. ΠΡ ΠΈΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΌΠ΅ΡΠΊΡ. Π€Π°ΠΉΠ»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠ°ΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅, ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ².
Π’Π°ΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΎΡΠΊΡΡΡΠ°Ρ Π·Π°ΠΌΠ΅ΡΠΊΠ°
Π Ρ ΠΎΠ΄Π΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ Π·Π°Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ β TagsService. ΠΠ½ Π±ΡΠ΄Π΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ΅Π³Π°ΠΌΠΈ.
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΈΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΡΠ΅ΡΡΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ JWT. Π§ΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠ°Π·Π±Π΅ΡΡΠΌ ΡΡΡΡ ΠΏΠΎΠ·Π΄Π½Π΅Π΅. ΠΠΎΠΊΠ° ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΡΠΈ 3 Π±ΡΠΊΠ²Ρ.
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΏΠΈΡΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΎΠΊ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ /api/categories Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΡΠ΅Π²ΠΎΠ²ΠΈΠ΄Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ ΠΈ /api/notes?category_id=? Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΎΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ. ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡ ΠΏΠΎ Π΄ΡΡΠ³ΠΈΠΌ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π·Π°ΠΌΠ΅ΡΠΊΠΈ Π΄Π»Ρ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ, Π° Π½Π° ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΊΡΡ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅. Π Ρ ΠΎΠ΄Π΅ ΡΠ°Π±ΠΎΡΡ Ρ Π·Π°ΠΌΠ΅ΡΠΊΠ°ΠΌΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΌΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ. ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ POST Π½Π° URL /api/categories. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ΅Π³ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° POST Π½Π° URL /api/tags.
Π§ΡΠΎΠ±Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π·Π°ΠΌΠ΅ΡΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ PATCH Π½Π° URL /api/notes/:uuid Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ. ΠΠ΅Π»Π°Π΅ΠΌ PATCH, Π° Π½Π΅ PUT, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ PUT ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π²ΡΠ΅Ρ ΠΏΠΎΠ»Π΅ΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ HTTP, Π° PATCH ΠΊΠ°ΠΊ ΡΠ°Π· Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ. ΠΠ»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΌΠ΅ΡΠΊΠΈ Π½Π°ΠΌ Π΅ΡΡ Π½ΡΠΆΠ΅Π½ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ /api/notes/:uuid/files Ρ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ POST ΠΈ GET. Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ°ΠΉΠ», ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ GET Π½Π° URL /api/files/:uuid.
Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
Π Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ app Π±ΡΠ΄Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΡΠ²ΠΈΡΠ° (Π΅ΡΠ»ΠΈ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ). ΠΠ° ΡΡΠΎΠ²Π½Π΅ Ρ app Π±ΡΠ΄ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Ρ ΡΡΠΈΠΌ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, MongoDB ΠΈΠ»ΠΈ ELK. ΠΡΠΎΠ΄ΡΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Consul, Π±ΡΠ΄ΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ.
ΠΠΈΡΠ°ΡΡ Π±ΡΠ΄Π΅ΠΌ Π½Π° Go
— ΠΠ΄ΡΠΌ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ.
— ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΡΡΠ»ΠΊΡ Π΄ΠΎ Π°ΡΡ ΠΈΠ²Π°, ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Ρ Π΅Ρ-ΡΡΠΌΠΌΡ.
— Π Π°ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ PATH ΠΏΡΡΡ Π΄ΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΎΠ² Go
— ΠΠΈΡΠ΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π°, Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡ. Π‘ΡΡΡΠΊΡΡΡΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ:
— cmd β ΡΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅,
— internal β Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ,
— pkg β Π΄Π»Ρ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ· ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΠΏΡΠΎΠ΅ΠΊΡ.
Π― ΠΎΡΠ΅Π½Ρ Π»ΡΠ±Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡ ΡΠ²ΠΎΡ ΠΎΠ±ΡΡΡΠΊΡ Π½Π°Π΄ Π»ΠΎΠ³Π΅ΡΠΎΠΌ logrus ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π·Π΄Π΅ΡΡ Init, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ Π»ΠΎΠ³Π΅Ρ, ΠΏΠ°ΠΏΠΊΡ logs ΠΈ Π² Π½Π΅ΠΉ ΡΠ°ΠΉΠ» all.log ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π»ΠΎΠ³Π°ΠΌΠΈ. ΠΡΠΎΠΌΠ΅ ΡΠ°ΠΉΠ»Π° Π»ΠΎΠ³ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡΡ Π² STDOUT. Π’Π°ΠΊΠΆΠ΅ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ°Π·Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Ρ ΡΠ°Π·Π½ΡΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΌΡ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ.
APIService Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅. Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠΎΡΡΠ΅Ρ, Π·Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Π΅Π³ΠΎ ΡΠ»ΡΡΠ°ΡΡ. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠ³Π½Π°Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π» SIGHUP, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ, Π·Π°ΠΊΡΡΠ² Π²ΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΡΠ΅ΡΡΠΈΠΈ. Π₯ΠΎΡΠ΅Π» ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ, Π½ΠΎ Π»ΠΈΠ½ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ os.Kill ΠΈ SIGSTOP ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠΈΡΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ°Π·Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ handler Π΄Π»Ρ ΠΌΠ΅ΡΡΠΈΠΊ. Π― Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ pkg, Π΄Π°Π»Π΅Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ Π² ΡΠΎΡΡΠ΅Ρ. ΠΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΡΡΠ΅ΡΡ Π±ΡΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅.
ΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠΎΡΠΊΡ Π²Ρ ΠΎΠ΄Π° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ cmd ΡΠΎΠ·Π΄Π°ΡΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ main, Π° Π² Π½Π΅ΠΉ β ΡΠ°ΠΉΠ» app.go. Π Π½ΡΠΌ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡ main, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΈ ΡΠΎΠ·Π΄Π°ΡΠΌ Π»ΠΎΠ³Π΅Ρ. Π ΠΎΡΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ΅ΡΠ΅Π· ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ defer, ΡΡΠΎΠ±Ρ ΠΌΠ΅ΡΠΎΠ΄ Init Ρ ΡΠΎΡΡΠ΅ΡΠ° Π²ΡΠ·Π²Π°Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ main. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΡΠΈΡΡΠΊΡ ΡΠ΅ΡΡΡΡΠΎΠ², Π·Π°ΠΊΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠ² ΠΈ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΡΠΊ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π»ΠΎΠ³ΠΈ ΠΈ ΡΠΎΠΊΠ΅Ρ, Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΠΎ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΡ, Π° Π½Π΅ Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅. ΠΠΎΡΡΠΎΠΌΡ Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΏΠΎΡΡΡ Π² Π½Π°Ρ ΡΠΎΡΡΠ΅Ρ. ΠΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³Π°.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° sync.Once. ΠΠΎΠΊΠ° ΡΡΠΎ Π² Π½ΡΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΠΈΠ³. ΠΠΎΠ½ΡΠ΅ΠΊΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΈΠ½Π³Π»ΡΠΎΠ½Π° ΡΠΎΠ·Π΄Π°Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΡΡΠ΅Π±Π½ΡΡ ΡΠ΅Π»ΡΡ , Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΈΠ»Π΅Π½. Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΠΈΠ½Π³Π»ΡΠΎΠ½Ρ β Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π·Π»ΠΎ, Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡΠΆΠ½Ρ. ΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³. ΠΡΠΎ Π±ΡΠ΄Π΅Ρ YAML-ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠ°ΡΡΠΈΡΡ Π² ΡΡΡΡΠΊΡΡΡΡ.
Π ΡΠΎΡΡΠ΅ΡΠ΅ ΠΌΡ Π²ΡΡΠ°ΡΠΊΠΈΠ²Π°Π΅ΠΌ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ ΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ listen.type Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ, Π»ΠΈΠ±ΠΎ Π²Π΅ΡΠ°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡ. ΠΠΎΠ΄ graceful shutdown Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ Π½Π° Π²Ρ ΠΎΠ΄ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² io.Close, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Π΄ΠΎ Π·Π°ΠΊΡΡΠ²Π°ΡΡ. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Ρ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ heartbeat. ΠΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠΌ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ sync.Once, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΡΡ Π² ΡΡΠ΅Π±Π½ΡΡ ΡΠ΅Π»ΡΡ .
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ API. Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π’ΡΡ Π²Π°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Ρ Π½Π°Ρ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π²ΡΠ΅ ΡΡΡΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° /api/users/:uuid. ΠΠΎ Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, ΠΈΠ½Π°ΡΠ΅ Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π·Π°ΠΌΠ΅ΡΠΊΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ: Basic Auth, Digest Auth, JSON Web Token, ΡΠ΅ΡΡΠΈΠΈ ΠΈ OAuth2. Π£ Π²ΡΠ΅Ρ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π΅ΡΡΡ ΡΠ²ΠΎΠΈ ΠΏΠ»ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΡ Π²ΠΎΠ·ΡΠΌΡΠΌ JSON Web Token.
Π Π°Π±ΠΎΡΠ° Ρ JSON Web Token
JSON Web Token (JWT) β ΡΡΠΎ JSON-ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ Π² ΠΎΡΠΊΡΡΡΠΎΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ RFC 7519. ΠΠ½ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°ΠΌΠΈ. ΠΠ»Ρ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (header) Ρ ΠΎΠ±ΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ ΡΠΎΠΊΠ΅Π½Ρ, ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ (payload), ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π΅Π³ΠΎ ΡΠΎΠ»Ρ ΠΈ Ρ.Π΄., Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ (signature).
JWT ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ JWS (Signature) ΠΈ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ JWE (Encrypting). ΠΠΎΠ΄ΠΏΠΈΡΡ Π½Π΅ Π΄Π°ΡΡ ΠΊΠΎΠΌΡ-ΡΠΎ ΠΏΠΎΠ΄Π΄Π΅Π»Π°ΡΡ ΡΠΎΠΊΠ΅Π½ Π±Π΅Π· ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΊΠ»ΡΡΠ΅, Π° ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΠ°Π΅Ρ ΠΎΡ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ΅ΡΡΠΈΠΌΠΈ Π»ΠΈΡΠ°ΠΌΠΈ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΡΠΌΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΡΡ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ β ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡΠΈ. ΠΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π΅ΡΡΡ Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΠ²ΡΠ·ΠΊΠΎΠΉ Π»ΠΎΠ³ΠΈΠ½-ΠΏΠ°ΡΠΎΠ»Ρ Π² Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ°Π² Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ (ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ) Π΄Π°Π½Π½ΡΡ ΠΏΡΠ°Π² ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π»Π΅Π³Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π°Π²ΡΠΎΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ JWT Π½Π΅ ΡΠΊΡΡΠ²Π°Π΅Ρ ΠΈ Π½Π΅ ΠΌΠ°ΡΠΊΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΡΠΈΡΠΈΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ JWT β ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΡΡΠΎ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ»ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ. ΠΠ°Π½Π½ΡΠ΅ Π²Π½ΡΡΡΠΈ JWT Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Ρ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Ρ, Π½ΠΎ Π½Π΅ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Ρ. Π¦Π΅Π»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ β ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ. ΠΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ .
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ JWT Π² Π½Π°ΡΠ΅ΠΌ APIService:
— Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ middleware ΠΈ jwt, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΠΉΠ» jwt.go.
— ΠΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ UserClaims ΠΈ ΡΠ°ΠΌ middlware.
— ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Authorization, ΠΎΡΡΡΠ΄Π° Π±Π΅ΡΡΠΌ ΡΠΎΠΊΠ΅Π½.
— ΠΠ΅ΡΡΠΌ ΡΠ΅ΠΊΡΠ΅Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π°.
— Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ HMAC.
— ΠΠ°ΡΡΠΈΠΌ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠΎΠΊΠ΅Π½.
— ΠΠ½ΠΌΠ°ΡΡΠ°Π»ΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΌΠΎΠ΄Π΅Π»Ρ UserClaims.
— ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ ΡΠΎΠΊΠ΅Π½ Π²Π°Π»ΠΈΠ΄Π½ΡΠΉ Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΡΠΈ Π»ΡΠ±ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΎΡΠ΄Π°ΡΠΌ ΠΎΡΠ²Π΅Ρ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 401 Unauthorized. ΠΡΠ»ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅ Π±ΡΠ»ΠΎ, Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ user_id, ΡΡΠΎΠ±Ρ Π²ΠΎ Π²ΡΠ΅Ρ Ρ Π΅Π½Π΄Π»Π΅ΡΠ°Ρ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ. Π’Π΅ΠΏΠ΅ΡΡ Π½Π°Π΄ΠΎ ΡΡΠΎΡ ΡΠΎΠΊΠ΅Π½ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΡΠΎ Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ Ρ Π΅Π½Π΄Π»Π΅Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ POST ΠΈ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠΌ /api/auth. ΠΠ½ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π΅ΠΉ username ΠΈ password, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ user. ΠΠ΄Π΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ UserService, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠ°ΠΌ ΠΈΡΠΊΠ°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ Π΄Π°Π½Π½ΡΠΌ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΅ΡΡΡ, ΡΠΎ ΡΠΎΠ·Π΄Π°ΡΠΌ Π΄Π»Ρ Π½Π΅Π³ΠΎ UserClaims, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π΄Π»Ρ Π½Π°Ρ Π΄Π°Π½Π½ΡΠ΅. ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠΎΠΊΠ΅Π½Π° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ExpiresAt β Π±Π΅ΡΡΠΌ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ 15 ΡΠ΅ΠΊΡΠ½Π΄. ΠΠΈΠ»Π΄ΠΈΠΌ ΡΠΎΠΊΠ΅Π½ ΠΈ ΠΎΡΠ΄Π°ΡΠΌ Π² Π²ΠΈΠ΄Π΅ JSON Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ token. ΠΠ»ΠΈΠ΅Π½ΡΠ° ΠΊ UserService Ρ Π½Π°Ρ ΠΏΠΎΠΊΠ° Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ Π·Π°Π³Π»ΡΡΠΊΡ.
ΠΠΎΠ±Π°Π²ΠΈΠΌ Π² Ρ Π΅Π½Π΄Π»Π΅Ρ Ρ heartbeat Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ Ρ Π΅Π½Π΄Π»Π΅Ρ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠΈΡΠ΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅ΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ sketch, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² IDE. ΠΠ΅Π»Π°Π΅ΠΌ POST-Π·Π°ΠΏΡΠΎΡ Π½Π° /api/auth, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎΠΊΠ΅Π½ ΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΡΠ²Π΅Ρ ΠΎΡ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ° /api/heartbeat, ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ 5 ΡΠ΅ΠΊΡΠ½Π΄ ΠΌΡ Π½Π°ΡΠ½ΡΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 401 Unauthorized.
ΠΠ°Ρ ΡΠΎΠΊΠ΅Π½ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½ ΠΎΡΠ΅Π½Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. Π‘Π΅ΠΉΡΠ°Ρ ΡΡΠΎ 15 ΡΠ΅ΠΊΡΠ½Π΄, Π° Π±ΡΠ΄Π΅Ρ ΠΌΠΈΠ½ΡΡ 30. ΠΠΎ ΡΡΠΎΠ³ΠΎ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΌΠ°Π»ΠΎ. ΠΠΎΠ³Π΄Π° ΡΠΎΠΊΠ΅Π½ ΠΏΡΠΎΡΡΡ Π½Π΅Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΎΠ²ΠΎ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΡΠ»ΠΈ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΡΠΊΡΠ°Π΄Π΅Ρ ΡΠΎΠΊΠ΅Π½ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π±Π΅ΡΡΡΠΎΡΠ½ΠΎ, ΡΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π°Π».
Π§ΡΠΎΠ±Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ, ΠΏΡΠΈΠΊΡΡΡΠΈΠΌ refresh-ΡΠΎΠΊΠ΅Π½. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΎΠΊΠ΅Π½ Π΄ΠΎΡΡΡΠΏΠ° Π±Π΅Π· Π·Π°ΠΏΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π’Π°ΠΊΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Ρ ΠΆΠΈΠ²ΡΡ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΠ»Π³ΠΎ ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π±Π΅ΡΡΡΠΎΡΠ½ΠΎ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΡΡΠΉ JWT ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ ΠΌΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ API. Π’ΠΎΠ³Π΄Π° ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ refresh-ΡΠΎΠΊΠ΅Π½. ΠΠ°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ Π½ΠΎΠ²Π°Ρ ΠΏΠ°ΡΠ° ΡΠΎΠΊΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ refresh-ΡΠΎΠΊΠ΅Π½Π°.
Π₯ΡΠ°Π½ΠΈΡΡ refresh-ΡΠΎΠΊΠ΅Π½Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π² ΠΊΡΡΠ΅. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΎΠ·ΡΠΌΡΠΌ FreeCache. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΠΎΡ ΠΎΠ±ΡΡΡΠΊΡ Π½Π°Π΄ ΠΊΡΡΠ΅ΠΌ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ FreeCache Π½Π° Π»ΡΠ±ΡΡ Π΄ΡΡΠ³ΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Repository Ρ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ.
ΠΠΎΠΊΠ° ΡΠ°ΡΡΡΠΆΠ΄Π°Π» ΠΏΡΠΎ ΠΊΡΡ, ΡΠ΅ΡΠΈΠ» Π·Π°ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄, ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅ΠΉ ΠΏΡΠΎΠΊΠΈΠ΄ΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π΅Π· dependency injection ΠΈ ΡΠΈΠ½Π³Π»ΡΠΎΠ½ΠΎΠ². ΠΠ±Π΅ΡΠ½ΡΠ» Ρ Π΅Π½Π΄Π»Π΅ΡΡ ΠΈ ΡΠΎΡΡΠ΅Ρ Π² ΡΡΡΡΠΊΡΡΡΡ. Π Ρ Π΅Π½Π΄Π»Π΅ΡΠ°Ρ ΡΠ΄Π΅Π»Π°Π» ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Register, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡ Π΅Π³ΠΎ Π² ΡΠΎΡΡΠ΅ΡΠ΅. ΠΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π² main, Π²Π΅ΡΡ ΡΠΎΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΅Ρ Π°Π» Π² ΠΌΠ΅ΠΉΠ½. Π‘ΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΠ΄Π΅Π»ΠΈΠ»ΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ Π² main-ΡΠ°ΠΉΠ»Π΅. Π’Π΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ Ρ Π΅Π½Π΄Π»Π΅ΡΡ Π½ΡΠΆΠ΅Π½ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, Ρ Π΅Π³ΠΎ ΠΏΡΠΎΡΡΠΎ Π±ΡΠ΄Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΡΡΡΠΊΡΡΡΡ Ρ Π΅Π½Π΄Π»Π΅ΡΠ°, Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π² main. ΠΠ»ΡΡ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠΊΠΈΠ΄ΡΠ²Π°ΡΡ Π²ΡΠ΅ΠΌ Ρ Π΅Π½Π΄Π»Π΅ΡΠ°ΠΌ ΡΠ²ΠΎΠΉ Π»ΠΎΠ³Π΅Ρ. ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠΎΠ»Π΅ trace_id ΠΎΡ Zipkin Π² ΡΡΡΠΎΡΠΊΡ Π»ΠΎΠ³Π°.
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ refresh_token. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΠΊΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ refresh_token ΠΈ ΠΎΡΠ΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΌΠ΅ΡΠΎΠ΄Π° PUT Π΄Π»Ρ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠ° /api/auth, Π° Π² ΡΠ΅Π»Π΅ Π·Π°ΠΏΡΠΎΡΠ° Π±ΡΠ΄Π΅ΠΌ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ refresh_token, ΡΡΠΎΠ±Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΡ ΠΏΠ°ΡΡ ΡΠΎΠΊΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ refresh-ΡΠΎΠΊΠ΅Π½Π°. Refresh-ΡΠΎΠΊΠ΅Π½ ΠΌΡ ΠΊΠ»Π°Π΄ΡΠΌ Π² ΠΊΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΡΡΠ°. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ user_id, ΡΡΠΎΠ±Ρ ΠΏΠΎ Π½Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ UserService ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΎΠΊΠ΅Π½ Π΄ΠΎΡΡΡΠΏΠ°. Refresh-ΡΠΎΠΊΠ΅Π½ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° ΠΈΠ· ΠΊΡΡΠ° ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ.
ΠΠ»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ API Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ OpenAPI 3.0 ΠΈ Swagger β YAML-ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ ΡΡ Π΅ΠΌΡ Π΄Π°Π½Π½ΡΡ ΠΈ Π²ΡΠ΅ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ. ΠΠΎ Π½Π΅ΠΌΡ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ, Ρ Π½Π΅Π³ΠΎ ΠΏΡΠΈΡΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π²ΡΡΡΠ½ΡΡ Π²ΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΡΡΠΎΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΡΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ΄ΠΎΠΌ.
— Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ /api/auth Ρ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ POST ΠΈ PUT Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° ΠΏΠΎ ΡΠ·Π΅ΡΠ½Π΅ΠΉΠΌΡ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ ΠΏΠΎ Refresh-ΡΠΎΠΊΠ΅Π½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
— ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡ Π΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Token ΠΈ User.
— Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΡ /api/users Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ POST Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ»Ρ Π½Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΡ Π΅ΠΌΡ CreateUser.
ΠΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΡΡΠΎ Π·Π°Π±ΡΠ»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Ρ Π΅Π½Π΄Π»Π΅Ρ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ Signup Ρ Ρ Π΅Π½Π»Π΅ΡΠ° Auth ΠΈ ΡΡΡΡΠΊΡΡΡΡ newUser ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ. ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ JWT Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π΅Π³ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π² Auth, ΡΠ°ΠΊ ΠΈ Π² Signup-Ρ Π΅Π½Π΄Π»Π΅ΡΠ°Ρ . Π£ Π½Π°Ρ Π²ΡΡ Π΅ΡΠ΅ Π½Π΅Ρ UserService, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ TODO. ΠΠ°ΠΌ Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΈΡ Π² UserService, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π» ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΎΡΠ²Π΅ΡΠΈΠ» Π½Π°ΠΌ ΠΎΠ± ΡΡΠΏΠ΅Ρ Π΅. ΠΠ°Π»Π΅Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ°ΡΡ ΡΠΎΠΊΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ refresh-ΡΠΎΠΊΠ΅Π½Π° ΠΈ ΠΎΡΠ΄Π°ΡΠΌ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 201.
Π£ Π½Π°Ρ Π΅ΡΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ Swagger-ΡΠ°ΠΉΠ»Π°. ΠΠ° Π΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Ρ Π΅Π½Π΄Π»Π΅ΡΡ. Π’Π°ΠΌ, Π³Π΄Π΅ Π²ΡΠ·ΠΎΠ² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ², Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Ρ TODO.
Π‘ΠΎΠ·Π΄Π°ΡΠΌ Ρ Π΅Π½Π΄Π»Π΅Ρ Π΄Π»Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ URL Π² ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°Ρ . ΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΡΡΡΠΊΡΡΡΡ. ΠΠΏΠΈΡΠ°Π΅ΠΌΡΡ Π½Π° Swagger-ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠ°Π½Π΅Π΅. ΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ°ΠΌ Ρ Π΅Π½Π΄Π»Π΅Ρ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ Register, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π² ΡΠΎΡΡΠ΅ΡΠ΅. ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄Ρ Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΈ ΡΡΠ°Π·Ρ ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅ΡΡ API Π½Π° ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΡΠ²Π°Π³Π³Π΅ΡΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ Π²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌΠΈ: ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅.
ΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Ρ Π΅Π½Π΄Π»Π΅Ρ Π΄Π»Ρ Π·Π°ΠΌΠ΅ΡΠΎΠΊ. ΠΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΡΡΠΎ Π·Π°Π±ΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π΄Π»Ρ Π·Π°ΠΌΠ΅ΡΠΎΠΊ, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ. ΠΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΈΡ Π² Swagger ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Ρ Π² ΠΊΠΎΠ΄Π΅. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ Swagger Π² ΠΎΠ½Π»Π°ΠΉΠ½-ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅.
ΠΠ΄Π΅ΡΡ Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΠ½ΠΎΡΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΊΠΎΠ΄ ΠΎΡΠ²Π΅ΡΠ° 201 ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Location, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ URL Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ½ΠΎΡΡΠΈ. ΠΡΡΡΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°ΡΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ.
Π ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ Π³ΡΠ°ΡΠΎΠ²ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ Neo4j, Π° ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°Π΄ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ CategoryService ΠΈ APIService.
ΠΡΠ°ΠΊΡΠΈΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° Python 3, Π»Π΅ΠΊΡΠΈΡ β4
ΠΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΠ°Π½Π΅Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ β’ 125
ΠΠΎΠ³Π΄Π° Basic Π½Π°ΡΠ°Π»ΠΈ ΡΠ°ΡΠΏΠΈΡΡΠ²Π°ΡΡ ΡΡΡΡ ΡΠ»Π΅Π·Ρ Π½Π΅ ΠΏΡΠΎΡΠΎΠ½ΠΈΠ»
ΠΠ»Π°ΡΡΠ½ΠΎ ΡΠ°ΡΡΠΊΠ°Π·Π°Π» ΠΏΡΠΎ Π‘ΡΡΡΠΊΡΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π’ΠΈΠΌΠΎΡΠ΅ΠΉ Π€ΡΠ΄ΠΎΡΠΎΠ²ΠΈΡ! Π Π°Π·Π³ΠΎΠ²ΠΎΡ Π½Π° ΠΎΡΠ²Π»Π΅ΡΡΠ½Π½ΡΡ ΡΠ΅ΠΌΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ «ΡΠ»ΡΠ΄», Π° «ΡΠ»Π΅ΠΉΠΌ»! Π€Π»ΡΠ΄ ΡΡΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠΎΠΉ ΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ! Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.
ΠΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°Ρ ΡΡΡΠ΄)
ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ?
paint_house(x=100, y=100, width=50, height=50)
ΠΠΈΠ΄Π½ΠΎ ΡΡΠΎ Π·Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈ Π·Π° ΡΡΠΎ ΠΎΡΠ²Π΅ΡΠ°ΡΡ.
ΠΡ ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ docstring,
ΠΠ° ΠΏΡΠΎΡΠ»ΠΎΠΉ Π»Π΅ΠΊΡΠΈΠΈ Π±ΡΠ»ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΡΠ°ΡΠΈΠ·ΠΌΠΎΠΌ, Π² ΡΡΠΎΠΉ ΡΠΆΠ΅ ΡΠ°ΠΌ Π³ΠΎΡΠΏΠΎΠ΄Ρ Π±ΠΎΠ³. Π’Π°ΠΊΠΈΠ΅ ΡΡΠΊΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ π
Π»Π°Π±Ρ Π² ΡΡΡΠ»ΠΊΠ΅ ΠΏΠΎΠ΄ Π²ΠΈΠ΄Π΅ΠΎ)
ΠΡΠΎΡ Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΈΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ°Π±. Π ΠΏΡΠΎΡΠ°Π±Ρ, ΠΊΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, Π΅ΡΠ΅ ΡΠ΅ Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΈΠΊΠΈ)
ΠΠ»Π΅ΡΠΊ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π’ΠΈΠΌΠΎΡΠ΅ΠΉ Π€ΡΠ΄ΠΎΡΠΎΠ²ΠΈΡ. ΠΠΎΠ»ΡΡΠΎΠ΅.
ΠΠ°ΠΉ ΠΠ°ΠΌ ΠΠΎΠ³ Π·Π΄ΠΎΡΠΎΠ²ΡΡ. ΠΠ°ΡΡΠΎΡΡΠΈΠΉ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ. Π£Π²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎ, Π΄ΠΎΡ ΠΎΠ΄ΡΠΈΠ²ΠΎ. Π Π°Π΄ Π·Π° ΠΠ°ΡΠΈΡ ΡΡΠ΅Π½ΠΈΠΊΠΎΠ². ΠΠ°Π΄Π΅ΡΡΡ, ΠΎΠ½ΠΈ ΡΠ΅Π½ΡΡ.
8:18 Π² ΡΠΏΡ ΡΡΠ°Π½ΠΊΠ°Ρ ΠΌΠ°ΠΊΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠ΅ )))
ΠΠ»Π°ΡΡΠ½ΠΎ Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π² Π½Π°ΡΠ΅ΠΌ Π²ΡΠ·Π΅ Π½Π° ΠΏΠ°ΡΡ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ ΠΏΡΠ΅ΠΏΠΎΠ΄Ρ Π° Π½Π΅ ΡΡΡΠ΄Π΅Π½ΡΡ
ΠΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅, ΠΏΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ Π½Π΅ ΠΏΠΈΡΡΡΡΡ, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π° ΡΠ΅ΡΠ΅Π· ΡΡΠΎΠΉΠ½ΡΠ΅ ΠΊΠ°Π²ΡΡΠΊΠΈ?
ΠΡΠΎ ΡΠ°Π·Π½ΡΠ΅ Π²Π΅ΡΠΈ. Π ΠΊΠ°Π²ΡΡΠΊΠ°Ρ ΠΏΠΈΡΠ΅ΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠ»Π°ΡΡΡ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈ ΡΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π².
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π²Π°ΠΌ, ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠ΅ Π»Π΅ΠΊΡΠΈΠΈ
GOTO Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΡΠΆΠΎΠΊ ΠΊ Π½ΠΎΠΌΠ΅ΡΡ ΡΡΡΠΎΠΊΠΈ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΡΠΆΠΎΠΊ ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΌΠ΅ΡΠΊΠ΅.
ΠΠΎΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠΌ (ΠΈ ΠΏΠΎΠΊΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ) ΡΠ·ΡΠΊΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΆΠ΅ Π±ΡΠ» Π±Π΅ΠΉΡΠΈΠΊ. Π Π²ΠΎΡ ΡΠ΅ΡΠΈΠ»Π° Python ΠΈΠ·ΡΡΠΈΡΡ. ΠΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ ΠΌΠΈΡ!
ΠΡΠ»ΠΈ ΠΊΠΎΠΌΡ-ΡΠΎ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π΄ΠΎΠΌΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΡΡΠΏΠ΅Π»ΠΈ Π΄ΠΎΠ΄Π΅Π»Π°ΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠΈ, ΡΠΎ Π²ΠΎΡ ΠΊΠΎΠ΄:
from graph import *
def main():
windowSize(500,600)
paint_house(100, 200, 300, 400)
x = 100
y = 200
width = 300
height = 400
run() # ΠΠ°ΠΏΡΡΠΊΠ°Π΅Ρ Ρ
ΠΎΠ»ΡΡ
def paint_walls(x, y, width, height):
brushColor(«green»)
rectangle(x, y, width, height)
def paint_roof(x, y, width, height):
brushColor(«gold»)
points = ((x, height), (width, height), (height, x), (x, height))
polygon(points)
def paint_window(x, y, width, height):
brushColor(«white»)
rectangle(x, y, width, height)
def paint_house (x, y, width, height):
paint_walls(x, y, width, height)
paint_roof(x, y, width, height//2)
w_height = height // 1.6
w_width = width // 2
paint_window(x + w_width, y//2 + w_height, w_width, w_height)
ΠΠ΅ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΊΡΡΡΠΎΠΉ ΡΡΠ²Π°ΠΊ!)
ΠΠΎΠ±ΡΡΠΉ Π΄Π΅Π½Ρ Π’ΠΈΠΌΠΎΡΠ΅ΠΉ! Π ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΠ°Ρ ΡΡΡΠ΄, ΠΎΡΠ΅Π½Ρ ΠΊΠ»Π°ΡΡΠ½ΡΠ΅ Π»Π΅ΠΊΡΠΈΠΈ! ΠΠΎΠΆΠ½ΠΎ ΠΠ°Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΠ°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΡΠΌ ΡΠ°Π±ΠΎΡΠ°ΠΌ, Ρ ΡΠ΅Π»ΡΡ Π·Π°ΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ»ΡΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°. ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΡΡ Π»Π΅ΠΊΡΠΈΠΉ Π±ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Ρ ΡΠ΅ΡΠ΅ΠΏΠ°ΡΠΊΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΠΎΠ½ΡΡΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π». ΠΠ°Π»ΡΡΠ΅ ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ ΠΆΠ΅ Π·Π°Π΄Π°Π½ΠΈΠΉ Π½Π΅ Π½Π°ΡΠ΅Π». Π― Π΄ΡΠΌΠ°Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΄Π΅Π»Π°Π΅ΡΠ΅ ΠΠ°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΡΠ΅ Π½Π° ΠΏΠ»Π°ΡΠ½ΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Π΅, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ . ΠΡΠ΅ ΡΠ°Π· ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΠ°Ρ ΡΡΡΠ΄.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Ρ Π΄Π°Π½Π½ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Ρ
Π’ΠΈΠΌΠΎΡΠ΅ΠΉ Π€Π΅Π΄ΠΎΡΠΎΠ²ΠΈΡ, Π·Π΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅! Π‘ΠΌΠΎΡΡΡ Π²Π°ΡΠΈ Π»Π΅ΠΊΡΠΈΠΈ, ΠΈ ΡΠ°ΠΌ Π²Ρ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎ Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΡΠ΅. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π³Π΄Π΅-ΡΠΎ ΡΠΊΠ°ΡΠ°ΡΡ Π·Π°Π΄Π°Π½ΠΈΡ Π΄Π»Ρ Π½ΠΈΡ ?
@ΠΠ»Π°Π΄ΠΈΠΌΠΈΡ ΠΠΎΠΊΠ°Ρ Π²ΡΠΎΠ΄Π΅, ΡΡΠΎ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
Π° ΡΡΠΎ Π½Π΅ ΡΠΎ? cs.mipt.ru/python
ΠΠΊΡΠ΄ΠΆΠ°Π²Π° ΠΏΠ΅Π» : «ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΠΎΡΠΊΠ»ΠΈΡΠ°ΡΡ. «, Π° Π²Ρ ΠΏΡΠΎΡΠΈΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠΏΠ»ΠΈΠ½Π°
ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠΎ ΡΡΠΈΡ ΠΈ ΠΠΊΡΠ΄ΠΆΠ°Π²Ρ. Π‘ΠΠΠΠ ΡΠΏΠ΅Π»
56:26 ΠΡΠ΅ΠΌΡΠ΅Ρ ΠΌΠΈΠ½ΠΈΡΡΡ ΠΠ°Π½Π°Π΄Ρ.
ΠΠΎΠΌΠΎΠ³ΠΈΡΠ΅ ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΊΠ°ΠΊ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π²Π΅ΡΡ ΠΊΠΎΡΠ°Π±Π»Ρ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ, Ρ Π΅Π³ΠΎ Π½Π°ΡΠΈΡΠ°Π²Π°Π» Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ:
def lodka(x,y):
penColor(«brown»)
brushColor(«brown»)
rectangle(x, y, x+180, y+50)
polygon([(x+180,y),(x+250,y),(x+180,y+50)])
penColor(«black»)
brushColor(«white»)
circle(x+220,y+10,8)
penColor(«brown»)
brushColor(«brown»)
arc(x+50,y-50,x-40,y+50,start=180,end=270)
Π΄Π°Π»ΡΡΠ΅
x = 50
y = 240
obj = lodka(x,y)
onTimer(update, 50)
ΠΈ ΠΊΡΡΠ° ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΡΠΎΡΠΌΠΈΡΡ?
ΡΠΏΠ°ΡΠΈΠ±ΠΎ, Π’ΠΈΠΌΠΎΡΠ΅ΠΉ Π€ΡΠ΄ΠΎΡΠΎΠ²ΠΈΡ, Π²ΡΡ ΡΡΠ½ΠΎ ΠΈ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ
ΠΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΠ»Π·. ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ main() ΠΈΠ· Π½Π΅Π΅ ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ paint_house(. ), Π° ΠΈΠ· Π½Π΅Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ paint_wall, paint_roof, paint_window, Π½ΠΎ ΡΡΠΈ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅ΡΠ΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½Ρ? ΠΠ»ΠΈ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Π΅ΡΡΡ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ?
ΠΠ° ΡΡΠΎ ΠΆΠ΅ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅, Π²ΡΡ Π²ΡΠ΅ΠΌΡ Ρ Π²Π°ΡΠ°Π΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡ Π»Π΅ΠΊΡΠΈΡ.