рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрд╢рдиред рдХреНрдпрд╛, рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИ?

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рдПрдХ рдмреИрдХрдПрдВрдб (рдФрд░ рдлреНрд░рдВрдЯ-рдПрдВрдб рдХрд╛ рдПрдХ рд╕рд╛) рдХреЛрдб рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЬреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо 3 рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдлреНрд░рдВрдЯреЗрдВрдб рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдмреИрдХрдПрдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реЛрдЧрд╛

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдБ:
1. рд╕рдВрджреЗрд╢ - рд╡рд╕реНрддреБрдПрдВ, рдЬреЛ JSON рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВ, рдлреНрд░рдВрдЯрдПрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рдмреАрдЪ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреА рд╣реИрдВ
2. рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ - URI рдЬреЛ HTTP рд╡рд┐рдзрд┐, рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░, рдЕрдиреБрд░реЛрдз рдмреЙрдбреА рдЯрд╛рдЗрдк рдФрд░ рд░рд┐рд╕реНрдкреЛрдВрдбрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
3. рдПрдВрдЯрд┐рдЯреАрдЬ - рдпреЗ рдРрд╕реЗ рдореИрд╕реЗрдЬ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ Create / Update / List / Delete (рд╢рд╛рдпрдж рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ) рдХреЗ рдорд╛рдирдХ рдорд╛рдирдХ рд╣реИрдВ, рд╡реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ JPA рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ - рдЖрдо рддреМрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣реБрдВрдЪ

рдореИрдВ рдЖрдЧреЗ рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди
1) рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдХреНрд╖рд╛рдПрдВ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ
2) рдмреИрдХрдПрдВрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреИрдХрдПрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред

рдХреЛрдб рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ



рддреЛ, рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рд╕реЗ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ?

1. REST- рдЬреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕
2. рдиреАрд░рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ - json, 'рдбреЗрдЯрд╛' рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкреЗрд▓реЛрдб
3. рдиреАрд░рд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрджрд┐ рдмреИрдХрдПрдВрдб рдкрд░ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реБрдЖ, рддреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рднреА рдЬреЛрдбрд╝рдирд╛ рдЙрдЪрд┐рдд рд╣реИ
4. "рд╕рд╣реА" HTTP рдХреЛрдб - 404 рдпрджрд┐ рдкреБрд╕реНрддрдХ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ, рддреЛ 400 рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдЦрд░рд╛рдм рд╣реИ (рдХрд╣рддреЗ рд╣реИрдВ, рд╡реИрдз рдЬрдВрдЬрд╝ рдирд╣реАрдВ), рдЖрджрд┐ред

рдореИрдВ "рдЕрдкрдиреЗ рджрдо рдкрд░" рдмреИрдХрдПрдВрдб рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реВрдВрдЧрд╛:
1. рдПрдХ рдЬрдЧрд╣ рдкрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐
2. рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд HTTP рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
3. рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдХреБрдЫ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдврд╛рдВрдЪреЗ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
4. рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдмреИрдХрдПрдВрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рд╡рд░реНрдЯреЗрдХреНрд╕ рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рдЗрд╡реЗрдВрдЯ рдмреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдЕрдкрдиреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рднреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рд╕рд╛рдордиреЗ рд╡рд╛рд▓рд╛ рд╣рдореЗрд╢рд╛ рдмреИрдХрдПрдВрдб рднреЗрдЬрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ (рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рднреВрд▓реЗрдВрдЧреЗ)

рд╣рдо рдХреНрдпрд╛ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗ



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдВ рдЬреЛ рдкреБрд╕реНрддрдХреЛрдВ рдХреЛ рд╕рд╣реЗрдЬ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдирдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд╛рдо рд╕реЗ рдЦреЛрдЬ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреЛрдЯрд▓рд┐рди рдмреИрдХрдПрдВрдб, рд╡рд░реНрдЯ.рдПрдХреНрд╕, рдХреЛрд░рдЯрд╛рдЗрдиред рдХреБрдЫ рдРрд╕рд╛ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рд▓реЗрдЦ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ "рд╡рд░реНрдЯреЗрдХреНрд╕ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рддреАрди рдкреНрд░рддрд┐рдорд╛рди"

рдЗрд╕реЗ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдПрдВрдЧреЗред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рд╡рд░реНрдЯ.рдПрдХреНрд╕ рдХреЛ рдорд┐рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ), рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╕ рд╡рд╕рдВрдд рд▓реЗрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдЯрд┐рдЯреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреАрдврд╝реА рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред

рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛



рдЕрдм рдЖрдкрдХреЛ рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЧреНрд░реЗрдбрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛрдВрдЧреЗред рдЕрдм рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЧрд┐рдд рднрдВрдбрд╛рд░ рдореЗрдВ рдмрдирд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рд╕рднреА рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмреИрдардирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдкрд░ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ, рдЙрдирдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВрдЧреЗред

рддреЛ, рдкрд╣рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд░рд╛рдЙрдЯрд░, HTTP рддрд░реАрдХреЛрдВ рдЖрджрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧреАред рдЗрд╕реЗ рдореЗрдЯреЗрдирдлреЛ рдХрд╣реЗрдВ
рджреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ:
рдХреЛрдбрдЬреЗрди рдФрд░ рдПрдкреА

рдПрдкрд┐ рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдФрд░ рдореИрд╕реЗрдЬ рдХрд╛ рд╡рд░реНрдгрди рд╣реЛрддрд╛ рд╣реИ - рд╡реЗ рдХреНрд▓рд╛рд╕реЗрд╕ рдЬреЛ рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯреЗрдВрдб рдХреЗ рдмреАрдЪ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЬрд╛рдПрдВрдЧреЗ
рдХреЛрдбрдЬреЗрди рдПрдХ рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдЬреЗрдирд░реЗрдЯ рд╣реЛ!) - рдЗрд╕рдореЗрдВ рдПрдкреАрдЖрдИ рдХреНрд▓рд╛рд╕реЗрд╕ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░реНрд╕ рд╕реЗ рдорд┐рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИред
рдЬрдирд░реЗрдЯрд░ рдХреЛ рддрд░реНрдХреЛрдВ рдореЗрдВ рдкреАрдврд╝реА рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ - рдХрд┐рд╕ рдкреИрдХреЗрдЬ рд╕реЗ рд░рд╛рдЙрдЯрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓реЗрдирд╛ рд╣реИ, рдХрд┐рд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИ, рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рд╡реЗрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдХреНрдпрд╛ рдирд╛рдо рд╣реИ - рдЕрд░реНрдерд╛рддреНред metainfo рдФрд░ рдХреЛрдбрдЬреЗрди рдЖрдорддреМрд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЦреИрд░, рджреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рдЬрд┐рдирдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдлреНрд░рдВрдЯрдПрдВрдб-рдЬрдирд░реЗрдЯ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдЯрд▓рд┐рди рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ
рдФрд░ рдмреИрдХрдПрдВрдб - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рдеред

рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдерд╛рдиреАрдп рдорд╛рд╡реЗрди рднрдВрдбрд╛рд░ рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдореЗрдЯрд╛рдлрд╝рд┐рдиреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ :

рдПрдиреЛрдЯреЗрд╢рди рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдкреАрдврд╝реА рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗ - рдПрдВрдбрдкреЗрдВрд╕, рд╕рдВрджреЗрд╢, рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг:
/* Contains a number of endpoints. We will generate Vert.x router or Spring MVC controller from it*/ annotation class EndpointController(val url:String) /* Endpoint inside a controller. Concrete URI and HTTP method. May be has query param */ annotation class Endpoint(val method: HttpMethodName, val param: String = "") /* For empty constructor generation */ annotation class EmptyConstructorMessage /* Make abstract implementation method for endpoint logic asynchronous */ annotation class AsyncHandler /* All the next annotations are for Entities only:*/ annotation class GenerateCreate annotation class GenerateUpdate annotation class GenerateGetById annotation class GenerateList annotation class GenerateDelete /* Make CRUD implementation abstract, so that we will override it*/ annotation class AbstractImplementation /* Generate search by this field in DAO layer */ annotation class FindBy /* This entity is child of another entity, so generate end point like /parent/$id/child to bring all children of concrete parent instead of /child - bring all entities of this type */ annotation class ChildOf(vararg val parents: KClass<*>) enum class HttpMethodName { POST,PUT,GET,DELETE } 

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЦреЗрддреЛрдВ рдкрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЖрдПрдВрдЧреЗ
 annotation class IsString annotation class IsEmail annotation class IsBoolean annotation class MaxLength(val len:Int) 


рдореЗрдЯреЗрдиреЙрдл рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб

рдЖрдкреА рдкрд░рд┐рдпреЛрдЬрдирд╛:

No.rg рдФрд░ jpa plugins рдХреЛ build.gradle рдореЗрдВ рдиреЛрдЯ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдлрдВрддрд╛рд╕реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдХреБрдЫ рдкрд╛рдЧрд▓ рд╡рд┐рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

 @EndpointController("/util") interface SearchRouter { @Endpoint(HttpMethodName.GET, param = "id") fun search(id: String): String @Endpoint(method = HttpMethodName.POST) @AsyncHandler fun search(searchRequest: SearchRequest) // we have no check or response type } data class SearchRequest( @field:IsString val author: String?, @field:IsEmail val someEmail: String, @field:IsString val title: String? ) @GenerateList @GenerateGetById @GenerateUpdate @Entity @AbstractImplementation data class Book( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long?, @field:IsBoolean @Column(name = "is_deleted") var hardcover: Boolean, @field:IsString @field:MaxLength(128) @Column(nullable = false, length = 128) val title: String, @field:IsString @field:MaxLength(128) @Column(nullable = false, length = 255) val author: String ) @GenerateList @GenerateGetById @GenerateUpdate @GenerateDelete @GenerateCreate @Entity @ChildOf(Book::class) data class Chapter( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long?, @Column(nullable = false, name = "book_id") var bookId: Long?, @field:IsString @field:MaxLength(128) @Column(nullable = false, length = 128) @field:FindBy val name: String, @Column(nullable = false) val page:Int ) 


рдЖрдкреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб

рдХреЛрдбрдЧрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ:

рдкрд╣рд▓реЗ рд╣рдо "рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднрд░реЗрдВрдЧреЗ:

 data class EndPoint( val url: String, val input: String?, val param: String?, val output: String, val method: String, val handler: String, val asyncHandler: Boolean ) data class Router(val name: String, val url: String, val endpoints: List<EndPoint>) class Entity( name: String, val parents: List<String>, val abstractVerticle: Boolean, val crudFeatures: CrudFeatures, fields: List<Field>, var children: List<Entity> ) : Message(name, fields) { fun shouldGenerateRouterAndVerticle(): Boolean { return crudFeatures.generateRouterAndVerticle() } override fun toString(): String { return "Entity(parents=$parents, abstractVerticle=$abstractVerticle, crudFeatures=$crudFeatures, children=$children)" } } data class CrudFeatures( val list: Boolean, val create: Boolean, val update: Boolean, val delete: Boolean, val get: Boolean ) { fun generateRouterAndVerticle(): Boolean { return list || create || update || delete || get } } open class Message(val name: String, val fields: List<Field>) data class Field(val name: String, val type: String, val validators: List<Annotation>, val findBy: Boolean) 


рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 class EntitiesCreator(typeMapper: TypeMapper, frontendAnnoPackage:String) { private val messagesDescriptor = MessagesCreator(typeMapper, frontendAnnoPackage) fun createEntities(entitiesPackage: String): List<Entity> { val reflections = Reflections(entitiesPackage, SubTypesScanner(false)) val types = reflections.getSubTypesOf(Object::class.java) return types.map { createEntity(it) } } fun createEntityRestEndpoints(entity: Entity): List<EndPoint> { val name = entity.name val url = name.toLowerCase() val endpoints: MutableList<EndPoint> = mutableListOf() if (entity.crudFeatures.create) { endpoints.add( EndPoint(url, name, null, name, "post", "handleNew$name", false) ) } if (entity.crudFeatures.get) { endpoints.add( EndPoint( "$url/:id", null, "id", name, "get", "handleGet$name", false ) ) } if (entity.crudFeatures.update) { endpoints.add( EndPoint(url, name, null, name, "put", "handleUpdate$name", false) ) } if (entity.crudFeatures.delete) { endpoints.add( EndPoint( "$url/:id", null, "id", "", "delete", "handleDelete$name", false ) ) } if (entity.crudFeatures.list) { if (entity.parents.isEmpty()) { endpoints.add( EndPoint( url, null, null, "List<$name>", "get", "handleGetAllFor$name", false ) ) } } entity.children.forEach { endpoints.add( EndPoint( "$url/:id/${it.name.toLowerCase()}", null, "id", "List<$name>", "get", "handleGet${it.name}For$name", false ) ) } return endpoints } private fun createEntity(aClass: Class<*>): Entity { return Entity( aClass.simpleName, getParents(aClass), isVerticleAbstract(aClass), shouldGenerateCrud(aClass), messagesDescriptor.createFields(aClass), listOf() ) } private fun isVerticleAbstract(aClass: Class<*>): Boolean { return aClass.getDeclaredAnnotation(AbstractImplementation::class.java) != null } private fun getParents(aClass: Class<*>): List<String> { return aClass.getDeclaredAnnotation(ChildOf::class.java)?.parents?.map { it.simpleName }?.requireNoNulls() ?: listOf() } private fun shouldGenerateCrud(aClass: Class<*>): CrudFeatures { val listAnno = aClass.getDeclaredAnnotation(GenerateList::class.java) val createAnno = aClass.getDeclaredAnnotation(GenerateCreate::class.java) val getAnno = aClass.getDeclaredAnnotation(GenerateGetById::class.java) val updateAnno = aClass.getDeclaredAnnotation(GenerateUpdate::class.java) val deleteAnno = aClass.getDeclaredAnnotation(GenerateDelete::class.java) return CrudFeatures( list = listAnno != null, create = createAnno != null, update = updateAnno != null, delete = deleteAnno != null, get = getAnno != null ) } } class MessagesCreator(private val typeMapper: TypeMapper, private val frontendAnnotationsPackageName: String) { fun createMessages(packageName: String): List<Message> { val reflections = Reflections(packageName, SubTypesScanner(false)) return reflections.allTypes.map { Class.forName(it) }.map { createMessages(it) } } private fun createMessages(aClass: Class<*>): Message { return Message(aClass.simpleName, createFields(aClass)) } fun createFields(aClass: Class<*>): List<Field> { return ReflectionUtils.getAllFields(aClass).map { createField(it) } } private fun createField(field: java.lang.reflect.Field): Field { val annotations = field.declaredAnnotations return Field( field.name, typeMapper.map(field.type), createConstraints(annotations), annotations.map { anno -> anno::annotationClass.get() }.contains(FindBy::class) ) } private fun createConstraints(annotations: Array<out Annotation>): List<Annotation> { return annotations.filter { it.toString().startsWith("@$frontendAnnotationsPackageName") } } } class RoutersCreator(private val typeMapper: TypeMapper, private val endpointsPackage:String ) { fun createRouters(): List<Router> { val reflections = Reflections(endpointsPackage, SubTypesScanner(false)) return reflections.allTypes.map { createRouter( Class.forName( it ) ) } } private fun createRouter(aClass: Class<*>): Router { return Router(aClass.simpleName, getUrl(aClass), ReflectionUtils.getAllMethods(aClass).map { createEndpoint(it) }) } private fun getUrl(aClass: Class<*>): String { return aClass.getAnnotation(EndpointController::class.java).url } private fun getEndPointMethodName(declaredAnnotation: Endpoint?): String { val httpMethodName = declaredAnnotation?.method return (httpMethodName ?: HttpMethodName.GET).name.toLowerCase() } private fun getParamName(declaredAnnotation: Endpoint?): String { val paramName = declaredAnnotation?.param return (paramName ?: "id") } private fun createEndpoint(method: Method): EndPoint { val types = method.parameterTypes val declaredAnnotation: Endpoint? = method.getDeclaredAnnotation(Endpoint::class.java) val methodName = getEndPointMethodName(declaredAnnotation) var url = method.name var input: String? = null var param: String? = null val hasInput = types.isNotEmpty() val handlerName = "$methodName${StringUtils.capitalize(url)}" if (hasInput) { val inputType = types[0] val inputTypeName = typeMapper.map(inputType) val createUrlParameterName = inputType == java.lang.String::class.java if (createUrlParameterName) { param = getParamName(declaredAnnotation) url += "/:$param" } else { input = simpleName(inputTypeName) } } return EndPoint( url, input, param, method.returnType.toString(), methodName, handlerName, isHandlerAsync(method) ) } private fun isHandlerAsync(method: Method): Boolean { val declaredAnnotation: AsyncHandler? = method.getDeclaredAnnotation(AsyncHandler::class.java) return declaredAnnotation != null } private fun simpleName(name: String): String { val index = name.lastIndexOf(".") return if (index >= 0) name.substring(index + 1) else name } } 


рдЦреИрд░, "рдореБрдЦреНрдп" рд╡рд░реНрдЧ рднреА рд╣реИрдВ рдЬреЛ рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рдХреМрди рд╕реЗ рдкреИрдХреЗрдЬ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрджрд┐ред
рд╡реЗ рдЗрддрдиреА рд░реБрдЪрд┐ рдирд╣реАрдВ рд╣реИрдВ, рдЖрдк рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реНрд░реЛрдд рдХреЛрдб

рдлреНрд░рдВрдЯрдПрдВрдб-рдЬрдирд░реЗрдЯ рдФрд░ рдмреИрдХрдПрдВрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╣рдо рдЗрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ:
1. рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдПрдкреА рдкрд░ рдирд┐рд░реНрднрд░рддрд╛
2. рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЬ рдкрд░ рдХреЛрдбрдЬреЗрди рдкрд░ рдирд┐рд░реНрднрд░рддрд╛
3. рдЬреЗрдирд░реЗрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрд┐рд▓реНрдбрд╕реНрдХ рдЖрд░реНрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдлрд╛рдЗрд▓ рдФрд░ рдХреЛрдб рдХреЛ рдЧреНрд░реЗрдбрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рдЬрд░реВрд░рдд рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЬ рдкрд░ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдВрдкрдЯреАрд╢рди рдпрд╛ рд░рдирдЯрд╛рдЗрдо рд╕реНрдЯреЗрдЬ рдкрд░ рдирд╣реАрдВред рдпрд╛рдиреА рд╣рдо рдХреЛрдбреЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдкреАрдврд╝реА рдХреЗ рдкреИрдЯрд░реНрди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
4. рджреГрд╢реНрдп -рдЙрддреНрдкрдиреНрди рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ npm рдкреИрдХреЗрдЬ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
5. рдмреИрдХрдПрдВрдб рдореЗрдВ , рд░рд╛рдЙрдЯрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЧреИрд░-рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╕рд╛рд░ рд░рд╛рдЙрдЯрд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИред рд╕рд╛рд░ рд╡рд░реНрдЯрд┐рдХрд▓реНрд╕ рднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдореИрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд╕ рдореЗрдВ рдХреЛрдбреЗрдХреНрд╕ рдФрд░ рдПрдбреНрд░реЗрд╕ рдХрд╛рдВрд╕реНрдЯреЗрдВрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ред
рд╕реНрд░реЛрдд рдХреЛрдб рджреГрд╢реНрдп-рдЙрддреНрдкрдиреНрди рдФрд░ рдмреИрдХрдПрдВрдб

рдлреНрд░рдВрдЯрдПрдВрдб-рдЬрдирд░реЗрдЯ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрд╕ рдкреНрд▓рдЧрдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╕реНрд░реЛрддреЛрдВ рдХреЛ npm рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ IP build.gradle рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдкрдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди inpmpmrc рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
 import { IsString, MaxLength, IsDate, IsArray, } from 'class-validator'; import { Type } from 'class-transformer'; // Entity(parents=[], abstractVerticle=false, crudFeatures=CrudFeatures(list=true, create=true, update=true, delete=true, get=true), children=[]) export class Chapter { // Field(name=bookId, type=number, validators=[], findBy=false) bookId!: number; @IsString() @MaxLength(128) // Field(name=name, type=string, validators=[@com.valapay.test.annotations.frontend.IsString(), @com.valapay.test.annotations.frontend.MaxLength(len=128)], findBy=false) name!: string; // Field(name=id, type=number, validators=[], findBy=false) id!: number; // Field(name=page, type=number, validators=[], findBy=false) page!: number; } 


рд╡рд░реНрдЧ-рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдПрдиреЛрдЯреЗрд╢рди tc рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

рдмреИрдХрдПрдВрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдпрд╣ рдХрд╣рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡рд░реНрдЯрд┐рдХрд▓ рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрд╡рд░реБрджреНрдз рд╣реИ (рдФрд░ рд╡рд░реНрдЯреЗрдХреНрд╕рдПрдХреНрд╕реВрдЯреНрдпреВрдЯрдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдпрд╛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ (рдХреЛрд░рдЖрдЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде), рдпрд╣ рдХрд╣рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдВрдЯрд┐рдЯреА рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЯрд┐рдХрд▓ рд╕рд╛рд░ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдУрд╡рд░рд░рд╛рдЗрдб рд╣реБрдХ рдЬреЛ рдЙрддреНрдкрдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЯрд┐рдХрд▓реНрд╕ рдХреА рддреИрдирд╛рддреА рд╡рд╕рдВрдд рдлрд▓рд┐рдпреЛрдВ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИ - рдареАрдХ рд╣реИ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрд╣рд╛рд░ред

рдФрд░ рдпрд╣ рд╕рдм рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рдФрд░ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рд▓реЙрдЧ-рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХрд╛ рдПрдХ рдЪреЗрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдпрд╣ рднреА рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╡рд░реНрдЯреИрдХреНрд╕ рдЙрддреНрдкрдиреНрди рди рдХрд░реЗрдВ, рди рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдФрд░ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдХреНрдХрд╛-http рднреА, рдпрд╣ рдмреИрдХрдПрдВрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд╛рд╕ рджрд┐рд╢рд╛ рдЕрдзрд┐рдХ рдлреНрд░рдВрдЯ-рдПрдВрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИред

рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреАрдврд╝реА рдмрдирд╛рдиреЗ рдФрд░ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕реЗ рдЗрд▓рджрд╛рд░ рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

Source: https://habr.com/ru/post/hi450100/


All Articles