Important
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: Π ΠΠ²ΠΈΡΠΎ ΡΠ°ΡΡΠΎ ΠΏΡΠΎΠ²ΠΎΠ΄ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ β ΡΠ΅ΡΡΡ Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ², ΡΠ΅ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΡΠΊΠΈΠ΄ΠΎΡΠ½ΡΠ΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠ΅. ΠΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ Π²ΡΠ½Π΅ΡΡΠΈ ΡΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ.
ΠΠ°Π΄Π°ΡΠ°: Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡ, Ρ ΡΠ°Π½ΡΡΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ ΡΠΎΡΡΠΎΠΈΡ (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ)
TBA
![]()
make run
- protoc mechanism for serializing structured data.
- gRPC-Gateway plugin that reads protobuf service definitions and generates a reverse-proxy server which translates a RESTful HTTP API into gRPC
- sqlx extension on go's standard database/sql
- pgx pure Go driver and toolkit for PostgreSQL
- env simple and zero-dependencies library to parse environment variables into structs
Important
API ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² contract.swagger.json
ΠΠ΅ΡΠΎΠ΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°.
Note
ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ slug (Π½Π°Π·Π²Π°Π½ΠΈΠ΅) ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°.
.http
POST /v1/example/createSegment HTTP/1.1
Host: localhost:8090
Content-Type: application/json
Accept: */*
{
"slug": "AVITO_DISCOUNT_502"
}
.proto
service SegmentsService {
rpc CreateSegment(CreateSegmentRequest) returns (CreateSegmentResponse) {
option (google.api.http) = {
post: "/v1/example/createSegment"
body: "*"
};
// ...
}
ΠΠ΅ΡΠΎΠ΄ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°.
Note
ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ slug (Π½Π°Π·Π²Π°Π½ΠΈΠ΅) ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°.
.http
DELETE /v1/example/deleteSegment/AVITO_DISCOUNT_502 HTTP/1.1
Host: localhost:8090
Content-Type: application/json
Accept: */*
{
"slug": "AVITO_DISCOUNT_502"
}
.proto
service SegmentsService {
// ...
rpc DeleteSegment(DeleteSegmentRequest) returns (DeleteSegmentResponse) {
option (google.api.http) = {
delete: "/v1/example/deleteSegment/{slug}"
};
}
}
ΠΠ΅ΡΠΎΠ΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ.
Note
ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ slug (Π½Π°Π·Π²Π°Π½ΠΈΠΉ) ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΏΠΈΡΠΎΠΊ slug (Π½Π°Π·Π²Π°Π½ΠΈΠΉ) ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
.http
POST /v1/example/addUserToSegment HTTP/1.1
Host: localhost:8090
Content-Type: application/json
Accept: */*
{
"slugsAdd": [
"I_WISH_TO",
"WORK_AT_AVITO"
],
"slugsDel": [
"WITHOUT",
"AVITO_VOICE_MESSAGES"
],
"userId": "10012"
}
.proto
service UsersService {
rpc AddUserToSegment(AddUserToSegmentRequest) returns (AddUserToSegmentResponse) {
option (google.api.http) = {
post: "/v1/example/addUserToSegment"
body: "*"
};
}
// ...
}
ΠΠ΅ΡΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π°ΠΊΡΠΈΠ²Π½ΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Note
ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π° Π²Ρ
ΠΎΠ΄ id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
.http
GET /v1/example/getActiveSegments/1006 HTTP/1.1
Host: localhost:8090
Content-Type: application/json
Accept: */*
{
"user_id": 1006
}
.proto
service UsersService {
// ...
rpc GetActiveSegments(GetActiveSegmentsRequest) returns (GetActiveSegmentsResponse) {
option (google.api.http) = {
get: "/v1/example/getActiveSegments/{user_id}"
};
}
}