Skip to content

service to accumulate points and redeem depending on a campaign

Notifications You must be signed in to change notification settings

andres06-hub/loyalty-service

Repository files navigation

loyalty-service

Levantar server

  1. Crear el archivo .env (colocar toas las envs que hay en el archivo .env.example)
  2. Primero se debe levantar el environment
    • Aca corren migraciones y seeders si no hay nada en la DB (LA DB ya es una que esta en un cluster, se suminstrara la URI para observas los registros)
    ./start-environment.sh upb
    • Y para tumbar el ambiente ejecute
    ./start-environment.sh down

Importante: Los seeders tendran fechas en las campañas viejas, esto para primero validar y ver que se realiza la validaicon de ACTIVACION de campaña

Si se quiere ya realizar el proceso, hay que actualizar la campaña, con fechas actuales

Ejemplo: Datos actuales (ir al cURL de actualización)

{
    "startDate": "2024-09-15",
    "endDate": "2024-09-30",
    "bonusType": "double",
    "bonusValue": 2.00
}

Realizar peticiones en modo cURL

Rewards

Acumular puntos

  • POST /api/rewards
curl --location 'http://localhost:8888/api/rewards' \
--header 'Content-Type: application/json' \
--data '{
  "userId": "79f1ed5d-fb02-480f-8430-caabf42ce630",
  "branchId": "51968d08-9018-4a5c-94e6-9c7181359ef7",
  "purchaseAmount": 20000
}'

Redimir puntos

  • POST /api/rewards/redeem
curl --location 'http://localhost:8888/api/rewards/redeem' \
--header 'Content-Type: application/json' \
--data '{
  "userId": "79f1ed5d-fb02-480f-8430-caabf42ce630",
  "branchId": "51968d08-9018-4a5c-94e6-9c7181359ef7",
  "rewardType": "points",
  "rewardValue": 10000
}'

Camapaigns

Obtener campañas

  • GET /api/campaigns
curl --location 'http://localhost:8888/api/campaigns'

Obtener las campañas de una sucursal

  • GET /api/campaigns?branchId={id}
curl --location 'http://localhost:8888/api/campaigns?branchId=51968d08-9018-4a5c-94e6-9c7181359ef7'

Actualizar campaña

  • PUT /api/campaigns/:campaignId
curl --location --request PUT 'http://localhost:8888/api/campaigns/bdbc9716-217b-427e-80d0-a1e5f09bd3c4' \
--header 'Content-Type: application/json' \
--data '{
    "startDate": "2024-09-15",
    "endDate": "2024-09-30",
    "bonusType": "double",
    "bonusValue": 2.00
}'

Unit Testing

  • Para correr las pruebas unitarias solo se debe ejecutar
make test

Esto correra los test, y la covertura y generara una ruta local para ver las coverturas

Postman

Aca se encuentran los endpoints de loyalty

Postman

Technologies and tools

Swagger

Diagramas

Acumulación de Recompensas - Diagrama de Secuencia

sequenceDiagram
    participant User
    participant API
    participant RewardsService
    participant CampaignsRepository
    participant RewardsRepository
    participant PurchasesRepository
    
    User->>+API: Request Accumulate Reward (userId, branchId, purchaseAmount)
    API->>+RewardsService: AccumulateReward(data)
    RewardsService->>+CampaignsRepository: FindOneByBranchId(branchId)
    CampaignsRepository-->>-RewardsService: Return campaign details (if active)

    alt Campaign Active
        RewardsService->>RewardsService: Calculate reward based on campaign
    else No Campaign
        RewardsService->>RewardsService: Calculate reward based on default rule
    end

    RewardsService->>+RewardsRepository: CreateRewards(newRewardData)
    RewardsRepository-->>-RewardsService: Reward created

    RewardsService->>+PurchasesRepository: CreatePurchase(newPurchaseData)
    PurchasesRepository-->>-RewardsService: Purchase created

    RewardsService-->>-API: Return RewardsAccumulateResponse

    API-->>-User: Send response (reward earned, campaign applied)
Loading

Get campaigns

sequenceDiagram
    participant User
    participant API
    participant CampaignService
    participant CampaignRepository

    User->>+API: Request Get Campaigns (branchId: optional)
    API->>+CampaignService: GetCampaigns(branchId)

    alt BranchId provided
        CampaignService->>+CampaignRepository: FindCampaignsByBranchId(branchId)
        CampaignRepository-->>-CampaignService: Return campaigns for branchId
    else No BranchId provided
        CampaignService->>+CampaignRepository: FindAllCampaigns()
        CampaignRepository-->>-CampaignService: Return all campaigns
    end

    CampaignService-->>-API: Return campaigns (filtered by branchId or all)
    API-->>-User: Send campaigns to user
Loading