MisterZurg / avito-tech-internship-2023

πŸ“Backend trainee assignment (Summer 2023)

Home Page:https://start.avito.ru/tech

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

БСрвис динамичСского сСгмСнтирования ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

Important

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π’ Авито часто проводятся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ экспСримСнты β€” тСсты Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², тСсты интСрфСйса, скидочныС ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. На Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠΌ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚Π΅ приняли Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ экспСримСнтами ΠΈ вынСсти этот Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвис.

Π—Π°Π΄Π°Ρ‡Π°: ВрСбуСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвис, хранящий ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ сСгмСнты, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ состоит (созданиС, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ сСгмСнтов, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² сСгмСнт)

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

TBA

АрхитСктура ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ

img.png

Как Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ?

Example
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 (Π½Π°Π·Π²Π°Π½ΠΈΠ΅) сСгмСнта.

Example

.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 (Π½Π°Π·Π²Π°Π½ΠΈΠ΅) сСгмСнта.

Example

.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 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Example

.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 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Example

.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}"
    };
  }
}

About

πŸ“Backend trainee assignment (Summer 2023)

https://start.avito.ru/tech


Languages

Language:Go 86.7%Language:Makefile 7.0%Language:Dockerfile 6.3%