# Vérification des votes

## Vérifier si un utilisateur est en cooldown de vote

> Vérifie si un utilisateur (via \`discord\_id\` ou \`external\_id\`) a voté \
> pour la guilde associée au token développeur dans la dernière heure.\
> \
> \*\*Important :\*\*\
> \- Un seul identifiant doit être fourni.\
> \- Le cooldown est fixé à \*\*1h\*\*.\
> \- Le token doit être passé en Bearer ou via \`X-Api-Token\`.<br>

```json
{"openapi":"3.0.3","info":{"title":"DiscordTop Developer API - Version 7","version":"7.0"},"tags":[{"name":"Votes","description":"Vérification et gestion des votes utilisateurs."}],"servers":[{"url":"https://api.discordtop.net/v7","description":"API Developer - Production (v7)"}],"security":[{"ApiTokenAuth":[]}],"components":{"securitySchemes":{"ApiTokenAuth":{"type":"http","scheme":"bearer","bearerFormat":"DTOP-Dev-Token"}},"schemas":{"VoteCheckSuccess":{"type":"object","required":["ok","guild_id","has_voted","last_vote_at","next_vote_at"],"properties":{"ok":{"type":"boolean"},"guild_id":{"type":"string"},"has_voted":{"type":"boolean","description":"true  → l’utilisateur est encore dans le cooldown  \nfalse → aucun vote récent OU cooldown terminé\n"},"last_vote_at":{"type":["string","null"],"format":"date-time"},"next_vote_at":{"type":["string","null"],"format":"date-time"},"cooldown_remaining_seconds":{"type":"integer"}}},"ErrorResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"error":{"type":"string"},"message":{"type":"string"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"rule":{"type":"string"},"field":{"type":"string"},"message":{"type":"string"}}}}}},"RateLimitError":{"type":"object","properties":{"message":{"type":"string"}}},"ServerError":{"type":"object","properties":{"message":{"type":"string"}}}}},"paths":{"/vote-check":{"get":{"tags":["Votes"],"operationId":"voteCheck","summary":"Vérifier si un utilisateur est en cooldown de vote","description":"Vérifie si un utilisateur (via `discord_id` ou `external_id`) a voté \npour la guilde associée au token développeur dans la dernière heure.\n\n**Important :**\n- Un seul identifiant doit être fourni.\n- Le cooldown est fixé à **1h**.\n- Le token doit être passé en Bearer ou via `X-Api-Token`.\n","parameters":[{"name":"discord_id","in":"query","required":false,"description":"ID Discord de l'utilisateur à vérifier.","schema":{"type":"string","maxLength":20}},{"name":"external_id","in":"query","required":false,"description":"Identifiant externe de l’utilisateur (site, jeu…).","schema":{"type":"string","maxLength":191}},{"name":"api_token","in":"query","required":false,"description":"Ancienne méthode pour passer le token dans l'URL.\nIl est recommandé d'utiliser `Authorization: Bearer <token>`.\n","schema":{"type":"string"},"deprecated":true},{"name":"locale","in":"query","required":false,"description":"Force la langue de la réponse (`fr`, `en`, etc.).\nSi absent : utilise X-Locale, puis Accept-Language, sinon fallback `en`.\n","schema":{"type":"string"}},{"name":"X-Locale","in":"header","required":false,"description":"Locale forcée (surpasse Accept-Language).","schema":{"type":"string"}},{"name":"Accept-Language","in":"header","required":false,"description":"Détection automatique de la langue.","schema":{"type":"string"}},{"name":"X-Api-Token","in":"header","required":false,"description":"Token développeur alternatif.","schema":{"type":"string"}}],"responses":{"200":{"description":"Résultat de vérification du vote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteCheckSuccess"}}}},"400":{"description":"Erreurs liées aux identifiants fournis.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Erreurs liées au token développeur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Erreurs de validation (Adonis Validator).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Rate limit atteint.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"500":{"description":"Erreur interne de l’API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}}}}}
```

## The VoteCheckSuccess object

```json
{"openapi":"3.0.3","info":{"title":"DiscordTop Developer API - Version 7","version":"7.0"},"components":{"schemas":{"VoteCheckSuccess":{"type":"object","required":["ok","guild_id","has_voted","last_vote_at","next_vote_at"],"properties":{"ok":{"type":"boolean"},"guild_id":{"type":"string"},"has_voted":{"type":"boolean","description":"true  → l’utilisateur est encore dans le cooldown  \nfalse → aucun vote récent OU cooldown terminé\n"},"last_vote_at":{"type":["string","null"],"format":"date-time"},"next_vote_at":{"type":["string","null"],"format":"date-time"},"cooldown_remaining_seconds":{"type":"integer"}}}}}}
```

## The ErrorResponse object

```json
{"openapi":"3.0.3","info":{"title":"DiscordTop Developer API - Version 7","version":"7.0"},"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"error":{"type":"string"},"message":{"type":"string"}}}}}}
```

## The ValidationError object

```json
{"openapi":"3.0.3","info":{"title":"DiscordTop Developer API - Version 7","version":"7.0"},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"rule":{"type":"string"},"field":{"type":"string"},"message":{"type":"string"}}}}}}}}}
```

## The RateLimitError object

```json
{"openapi":"3.0.3","info":{"title":"DiscordTop Developer API - Version 7","version":"7.0"},"components":{"schemas":{"RateLimitError":{"type":"object","properties":{"message":{"type":"string"}}}}}}
```

## The ServerError object

```json
{"openapi":"3.0.3","info":{"title":"DiscordTop Developer API - Version 7","version":"7.0"},"components":{"schemas":{"ServerError":{"type":"object","properties":{"message":{"type":"string"}}}}}}
```
