This commit is contained in:
2026-01-31 13:49:56 +01:00
parent 7074c85672
commit ecfa2d3985
203 changed files with 11592 additions and 0 deletions

BIN
tournme/.DS_Store vendored Normal file

Binary file not shown.

BIN
tournme/collection/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,30 @@
meta {
name: Login
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/v1/login
body: formUrlEncoded
auth: inherit
}
body:form-urlencoded {
grant_type:
username: {{username}}
password: {{password}}
scope:
client_id:
client_secret:
}
script:post-response {
function onResponse(res) {
let data = res.getBody();
bru.setEnvVar("access_token", data.access_token);
bru.setEnvVar("refresh_token", data.refresh_token);
}
onResponse(res);
}

View File

@@ -0,0 +1,17 @@
meta {
name: Refresh Token
type: http
seq: 2
}
post {
url: {{baseUrl}}/api/v1/refresh
body: json
auth: inherit
}
body:json {
{
"refresh_token": "{{refresh_token}}"
}
}

View File

@@ -0,0 +1,3 @@
meta {
name: Authentication
}

View File

@@ -0,0 +1,19 @@
meta {
name: Change Password
type: http
seq: 4
}
post {
url: {{baseUrl}}/api/v1/companies/me/change-password
body: json
auth: inherit
}
body:json {
{
"current_password": "",
"new_password": "",
"confirm_password": ""
}
}

View File

@@ -0,0 +1,20 @@
meta {
name: Create Company Admin
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/v1/companies/admin/create
body: json
auth: inherit
}
body:json {
{
"name": "",
"email": "",
"phone_number": "",
"address": ""
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: Get All Companies
type: http
seq: 5
}
get {
url: {{baseUrl}}/api/v1/companies
body: none
auth: inherit
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Company By Login
type: http
seq: 6
}
get {
url: {{baseUrl}}/api/v1/companies/:login
body: none
auth: inherit
}
params:path {
login:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Current Company
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/v1/companies/me
body: none
auth: bearer
}
auth:bearer {
token: {{access_token}}
}

View File

@@ -0,0 +1,21 @@
meta {
name: Update Current Company
type: http
seq: 3
}
patch {
url: {{baseUrl}}/api/v1/companies/me
body: json
auth: inherit
}
body:json {
{
"name": "",
"email": "",
"phone_number": "",
"address": "",
"vat_number": ""
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: Companies
}
auth {
mode: bearer
}
auth:bearer {
token: {{access_token}}
}

View File

@@ -0,0 +1,18 @@
meta {
name: Create Court
type: http
seq: 3
}
post {
url: {{baseUrl}}/api/v1/courts/
body: json
auth: inherit
}
body:json {
{
"name": "CAMPO BELLISSIMO",
"images": ["https://ddlgzcxdeqadinmzpgqu.supabase.co/storage/v1/object/public/padelcourt_dev/34847922/courts/19cdc929-7dcd-4a63-b016-66db8fdabd4a.jpeg?"]
}
}

View File

@@ -0,0 +1,15 @@
meta {
name: Delete Court
type: http
seq: 6
}
delete {
url: {{baseUrl}}/api/v1/courts/:id
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get All Courts
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/v1/courts/
body: none
auth: inherit
}
settings {
encodeUrl: false
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Court By Id
type: http
seq: 4
}
get {
url: {{baseUrl}}/api/v1/courts/:id
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,23 @@
meta {
name: Update Court
type: http
seq: 5
}
put {
url: {{baseUrl}}/api/v1/courts/:id
body: json
auth: inherit
}
params:path {
id:
}
body:json {
{
"id": 0,
"name": "",
"images": ""
}
}

View File

@@ -0,0 +1,19 @@
meta {
name: Upload Image
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/v1/courts/upload_image/
body: multipartForm
auth: inherit
}
params:query {
~folder:
}
body:multipart-form {
files: @file(/Users/ayoublefhim/Downloads/images.jpeg)
}

View File

@@ -0,0 +1,15 @@
meta {
name: Check reset token status
type: http
seq: 4
}
get {
url: {{baseUrl}}/api/v1/password-reset/status/:token
body: none
auth: inherit
}
params:path {
token:
}

View File

@@ -0,0 +1,18 @@
meta {
name: Complete password reset
type: http
seq: 3
}
post {
url: {{baseUrl}}/api/v1/password-reset/complete
body: json
auth: inherit
}
body:json {
{
"token": "",
"new_password": ""
}
}

View File

@@ -0,0 +1,17 @@
meta {
name: Initiate password reset
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/v1/password-reset/initiate
body: json
auth: inherit
}
body:json {
{
"email": ""
}
}

View File

@@ -0,0 +1,18 @@
meta {
name: Verify reset code
type: http
seq: 2
}
post {
url: {{baseUrl}}/api/v1/password-reset/verify
body: json
auth: inherit
}
body:json {
{
"email": "",
"code": ""
}
}

View File

@@ -0,0 +1,18 @@
meta {
name: Create Player From Playtomic
type: http
seq: 3
}
post {
url: {{baseUrl}}/api/v1/players/from-playtomic/
body: json
auth: inherit
}
body:json {
{
"playtomic_id": 0,
"gender": 0
}
}

View File

@@ -0,0 +1,20 @@
meta {
name: Create Player
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/v1/players/
body: json
auth: inherit
}
body:json {
{
"name": "",
"gender": "",
"surname": "",
"nickname": ""
}
}

View File

@@ -0,0 +1,15 @@
meta {
name: Delete Player Association
type: http
seq: 8
}
delete {
url: {{baseUrl}}/api/v1/players/:id
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Player By Id
type: http
seq: 6
}
get {
url: {{baseUrl}}/api/v1/players/:id
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Players
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/v1/players/
body: none
auth: inherit
}
params:query {
~search:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Playtomic Players
type: http
seq: 4
}
get {
url: {{baseUrl}}/api/v1/players/playtomic-player/
body: none
auth: inherit
}
params:query {
~name:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Id
type: http
seq: 5
}
get {
url: {{baseUrl}}/api/v1/players/tournament-id/
body: none
auth: inherit
}
params:query {
~url:
}

View File

@@ -0,0 +1,30 @@
meta {
name: Update Player
type: http
seq: 7
}
put {
url: {{baseUrl}}/api/v1/players/:id
body: json
auth: inherit
}
params:path {
id:
}
body:json {
{
"name": "",
"gender": "",
"surname": "",
"nickname": "",
"id": 0,
"number": "",
"email": "",
"picture": "",
"playtomic_id": "",
"level": ""
}
}

View File

@@ -0,0 +1,22 @@
meta {
name: Initiate company registration
type: http
seq: 2
}
post {
url: {{baseUrl}}/api/v1/register/initiate
body: json
auth: inherit
}
body:json {
{
"email": "",
"password": "",
"name": "",
"address": "",
"phone_number": "",
"vat_number": ""
}
}

View File

@@ -0,0 +1,17 @@
meta {
name: Resend verification code
type: http
seq: 4
}
post {
url: {{baseUrl}}/api/v1/register/resend
body: json
auth: inherit
}
body:json {
{
"email": ""
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: Test Loops API connection
type: http
seq: 1
}
get {
url: {{baseUrl}}/api/v1/register/test-loops
body: none
auth: inherit
}

View File

@@ -0,0 +1,18 @@
meta {
name: Verify email and complete registration
type: http
seq: 3
}
post {
url: {{baseUrl}}/api/v1/register/verify
body: json
auth: inherit
}
body:json {
{
"email": "",
"code": ""
}
}

View File

@@ -0,0 +1,11 @@
meta {
name: Root
type: http
seq: 1
}
get {
url: {{baseUrl}}/
body: none
auth: inherit
}

View File

@@ -0,0 +1,22 @@
meta {
name: Add Couple To Group
type: http
seq: 11
}
post {
url: {{baseUrl}}/api/v1/staging/group/:group_id/couple
body: json
auth: inherit
}
params:path {
group_id:
}
body:json {
{
"group_id": 0,
"couple_id": 0
}
}

View File

@@ -0,0 +1,19 @@
meta {
name: Assign Couples To Groups
type: http
seq: 14
}
post {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/assign-couples
body: none
auth: inherit
}
params:query {
~method:
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,21 @@
meta {
name: Auto Schedule Matches
type: http
seq: 35
}
post {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/auto-schedule
body: none
auth: inherit
}
params:query {
~start_date:
~end_date:
~order_only:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Calculate Stage Match Order
type: http
seq: 29
}
post {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/calculate-match-order
body: none
auth: inherit
}
params:query {
~strategy:
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Calculate Tournament Match Order
type: http
seq: 28
}
post {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/calculate-match-order
body: none
auth: inherit
}
params:query {
~strategy:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,22 @@
meta {
name: Create Tournament Bracket
type: http
seq: 16
}
post {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/bracket
body: json
auth: inherit
}
params:path {
stage_id:
}
body:json {
{
"stage_id": 0,
"bracket_type": ""
}
}

View File

@@ -0,0 +1,22 @@
meta {
name: Create Tournament Group
type: http
seq: 6
}
post {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/group
body: json
auth: inherit
}
params:path {
stage_id:
}
body:json {
{
"stage_id": 0,
"name": ""
}
}

View File

@@ -0,0 +1,25 @@
meta {
name: Create Tournament Stage
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/stage
body: json
auth: inherit
}
params:path {
tournament_id:
}
body:json {
{
"tournament_id": 0,
"name": "",
"stage_type": "",
"order": 0,
"config": {}
}
}

View File

@@ -0,0 +1,15 @@
meta {
name: Delete Tournament Bracket
type: http
seq: 20
}
delete {
url: {{baseUrl}}/api/v1/staging/bracket/:bracket_id
body: none
auth: inherit
}
params:path {
bracket_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Delete Tournament Group
type: http
seq: 10
}
delete {
url: {{baseUrl}}/api/v1/staging/group/:group_id
body: none
auth: inherit
}
params:path {
group_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Delete Tournament Stage
type: http
seq: 5
}
delete {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id
body: none
auth: inherit
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Generate Bracket Matches
type: http
seq: 36
}
post {
url: {{baseUrl}}/api/v1/staging/bracket/:bracket_id/generate-matches
body: json
auth: inherit
}
params:path {
bracket_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Generate Group Matches
type: http
seq: 31
}
post {
url: {{baseUrl}}/api/v1/staging/group/:group_id/generate-matches
body: none
auth: inherit
}
params:path {
group_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Generate Stage Matches
type: http
seq: 21
}
post {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/generate-matches
body: json
auth: inherit
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Bracket By Id
type: http
seq: 18
}
get {
url: {{baseUrl}}/api/v1/staging/bracket/:bracket_id
body: none
auth: inherit
}
params:path {
bracket_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Bracket Matches
type: http
seq: 25
}
get {
url: {{baseUrl}}/api/v1/staging/bracket/:bracket_id/matches
body: none
auth: inherit
}
params:path {
bracket_id:
}

View File

@@ -0,0 +1,20 @@
meta {
name: Get Couple Stats
type: http
seq: 38
}
get {
url: {{baseUrl}}/api/v1/staging/couple/:couple_id/tournament/:tournament_id/stats
body: none
auth: inherit
}
params:query {
~group_id:
}
params:path {
couple_id:
tournament_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get Court Availability
type: http
seq: 34
}
get {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/court-availability
body: none
auth: inherit
}
params:query {
date:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Group By Id
type: http
seq: 8
}
get {
url: {{baseUrl}}/api/v1/staging/group/:group_id
body: none
auth: inherit
}
params:path {
group_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Group Couples
type: http
seq: 12
}
get {
url: {{baseUrl}}/api/v1/staging/group/:group_id/couple
body: none
auth: inherit
}
params:path {
group_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Group Matches
type: http
seq: 24
}
get {
url: {{baseUrl}}/api/v1/staging/group/:group_id/matches
body: none
auth: inherit
}
params:path {
group_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Group Standings With Stats
type: http
seq: 15
}
get {
url: {{baseUrl}}/api/v1/staging/group/:group_id/standings
body: none
auth: inherit
}
params:path {
group_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Match By Id
type: http
seq: 26
}
get {
url: {{baseUrl}}/api/v1/staging/match/:match_id
body: none
auth: inherit
}
params:path {
match_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Stage Brackets
type: http
seq: 17
}
get {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/bracket
body: none
auth: inherit
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Stage By Id
type: http
seq: 3
}
get {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id
body: none
auth: inherit
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Stage Groups
type: http
seq: 7
}
get {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/group
body: none
auth: inherit
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Stage Matches
type: http
seq: 22
}
get {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id/matches
body: none
auth: inherit
}
params:path {
stage_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Match Order Info
type: http
seq: 30
}
get {
url: {{baseUrl}}/api/v1/staging/tournament/{{tournamentId}}/match-order-info
body: none
auth: bearer
}
auth:bearer {
token: {{access_token}}
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Matches
type: http
seq: 23
}
get {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/matches
body: none
auth: inherit
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Stages
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/stage
body: none
auth: inherit
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get Tournament Standings
type: http
seq: 41
}
get {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/standings
body: none
auth: inherit
}
params:query {
~group_id:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get Tournament Stats
type: http
seq: 37
}
get {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/stats
body: none
auth: inherit
}
params:query {
~group_id:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Initialize Missing Couple Stats
type: http
seq: 40
}
post {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/stats/initialize
body: none
auth: inherit
}
params:query {
~group_id:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,19 @@
meta {
name: Recalculate Tournament Stats
type: http
seq: 39
}
post {
url: {{baseUrl}}/api/v1/staging/tournament/:tournament_id/stats/recalculate
body: none
auth: inherit
}
params:query {
~group_id:
}
params:path {
tournament_id:
}

View File

@@ -0,0 +1,16 @@
meta {
name: Remove Couple From Group
type: http
seq: 13
}
delete {
url: {{baseUrl}}/api/v1/staging/group/:group_id/couple/:couple_id
body: none
auth: inherit
}
params:path {
group_id:
couple_id:
}

View File

@@ -0,0 +1,23 @@
meta {
name: Schedule Match
type: http
seq: 32
}
post {
url: {{baseUrl}}/api/v1/staging/match/:match_id/schedule
body: none
auth: inherit
}
params:query {
court_id:
start_time:
~end_time:
~is_time_limited:
~time_limit_minutes:
}
params:path {
match_id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Unschedule Match
type: http
seq: 33
}
delete {
url: {{baseUrl}}/api/v1/staging/match/:match_id/schedule
body: none
auth: inherit
}
params:path {
match_id:
}

View File

@@ -0,0 +1,37 @@
meta {
name: Update Match
type: http
seq: 27
}
put {
url: {{baseUrl}}/api/v1/staging/match/:match_id
body: json
auth: inherit
}
params:path {
match_id:
}
body:json {
{
"winner_couple_id": "",
"games": "",
"stage_id": "",
"group_id": "",
"bracket_id": "",
"court_id": "",
"scheduled_start": "",
"scheduled_end": "",
"is_time_limited": "",
"time_limit_minutes": "",
"match_result_status": "",
"display_order": "",
"order_in_stage": "",
"order_in_group": "",
"bracket_position": "",
"round_number": "",
"priority_score": ""
}
}

View File

@@ -0,0 +1,21 @@
meta {
name: Update Tournament Bracket
type: http
seq: 19
}
put {
url: {{baseUrl}}/api/v1/staging/bracket/:bracket_id
body: json
auth: inherit
}
params:path {
bracket_id:
}
body:json {
{
"bracket_type": ""
}
}

View File

@@ -0,0 +1,21 @@
meta {
name: Update Tournament Group
type: http
seq: 9
}
put {
url: {{baseUrl}}/api/v1/staging/group/:group_id
body: json
auth: inherit
}
params:path {
group_id:
}
body:json {
{
"name": ""
}
}

View File

@@ -0,0 +1,24 @@
meta {
name: Update Tournament Stage
type: http
seq: 4
}
put {
url: {{baseUrl}}/api/v1/staging/stage/:stage_id
body: json
auth: inherit
}
params:path {
stage_id:
}
body:json {
{
"name": "",
"stage_type": "",
"order": "",
"config": ""
}
}

View File

@@ -0,0 +1,23 @@
meta {
name: Add Court To Tournament
type: http
seq: 12
}
post {
url: {{baseUrl}}/api/v1/tournaments/:id/court
body: json
auth: inherit
}
params:path {
id:
}
body:json {
{
"court_id": 0,
"availability_start": "",
"availability_end": ""
}
}

View File

@@ -0,0 +1,22 @@
meta {
name: Add Player To Tournament
type: http
seq: 5
}
post {
url: {{baseUrl}}/api/v1/tournaments/:id/player
body: json
auth: inherit
}
params:path {
id:
}
body:json {
{
"tournament_id": 0,
"player_id": 0
}
}

View File

@@ -0,0 +1,23 @@
meta {
name: Create Tournament Couple
type: http
seq: 8
}
post {
url: {{baseUrl}}/api/v1/tournaments/:id/couple
body: json
auth: inherit
}
params:path {
id:
}
body:json {
{
"first_player_id": 0,
"second_player_id": 0,
"name": ""
}
}

View File

@@ -0,0 +1,23 @@
meta {
name: Create Tournament
type: http
seq: 2
}
post {
url: {{baseUrl}}/api/v1/tournaments/
body: json
auth: inherit
}
body:json {
{
"name": "",
"description": "",
"images": "",
"start_date": "",
"end_date": "",
"players_number": 0,
"full_description": ""
}
}

View File

@@ -0,0 +1,16 @@
meta {
name: Delete Player From Tournament
type: http
seq: 7
}
delete {
url: {{baseUrl}}/api/v1/tournaments/:tournament_id/player/:player_id
body: none
auth: inherit
}
params:path {
tournament_id:
player_id:
}

View File

@@ -0,0 +1,16 @@
meta {
name: Delete Tournament Couple
type: http
seq: 11
}
delete {
url: {{baseUrl}}/api/v1/tournaments/:tournament_id/couple/:couple_id
body: none
auth: inherit
}
params:path {
tournament_id:
couple_id:
}

View File

@@ -0,0 +1,11 @@
meta {
name: Get All Tournaments
type: http
seq: 1
}
get {
url: {{baseUrl}}/api/v1/tournaments/
body: none
auth: inherit
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament By Id
type: http
seq: 3
}
get {
url: {{baseUrl}}/api/v1/tournaments/:id
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Couples
type: http
seq: 9
}
get {
url: {{baseUrl}}/api/v1/tournaments/:id/couple
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Courts
type: http
seq: 13
}
get {
url: {{baseUrl}}/api/v1/tournaments/:id/court
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,15 @@
meta {
name: Get Tournament Players
type: http
seq: 6
}
get {
url: {{baseUrl}}/api/v1/tournaments/:id/player
body: none
auth: inherit
}
params:path {
id:
}

View File

@@ -0,0 +1,16 @@
meta {
name: Remove Court From Tournament
type: http
seq: 15
}
delete {
url: {{baseUrl}}/api/v1/tournaments/:tournament_id/court/:court_id
body: none
auth: inherit
}
params:path {
tournament_id:
court_id:
}

View File

@@ -0,0 +1,25 @@
meta {
name: Update Tournament Couple
type: http
seq: 10
}
put {
url: {{baseUrl}}/api/v1/tournaments/:tournament_id/couple/:couple_id
body: json
auth: inherit
}
params:path {
tournament_id:
couple_id:
}
body:json {
{
"tournament_id": "",
"first_player_id": "",
"second_player_id": "",
"name": ""
}
}

View File

@@ -0,0 +1,23 @@
meta {
name: Update Tournament Court
type: http
seq: 14
}
put {
url: {{baseUrl}}/api/v1/tournaments/:tournament_id/court/:court_id
body: json
auth: inherit
}
params:path {
tournament_id:
court_id:
}
body:json {
{
"availability_start": "",
"availability_end": ""
}
}

View File

@@ -0,0 +1,27 @@
meta {
name: Update Tournament
type: http
seq: 4
}
put {
url: {{baseUrl}}/api/v1/tournaments/:id
body: json
auth: inherit
}
params:path {
id:
}
body:json {
{
"name": "",
"description": "",
"images": "",
"start_date": "",
"end_date": "",
"players_number": "",
"full_description": ""
}
}

View File

@@ -0,0 +1,9 @@
{
"version": "1",
"name": "PadelTour API",
"type": "collection",
"ignore": [
"node_modules",
".git"
]
}

View File

@@ -0,0 +1,7 @@
auth {
mode: bearer
}
auth:bearer {
token: {{access_token}}
}

View File

@@ -0,0 +1,7 @@
vars {
baseUrl: http://localhost:8000
username: test@test.it
password: Pass123!
access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE3NTM4MjY5ODR9.kG1cISeoVJOTwZzPDWJdi1UMTVXiTGsB7HFn9DqItdI
tournamentId: 1
}

View File

@@ -0,0 +1,7 @@
vars {
baseUrl: https://api.tourn.me
username: 02421217
}
vars:secret [
password
]

65
tournme/docs/FEATURES.md Normal file
View File

@@ -0,0 +1,65 @@
# Project Features
This document outlines the main features of the Tourn.me application, a comprehensive platform for managing padel tournaments. The project is divided into a frontend application (`app.tourn.me`) and a backend service (`padeltour`).
## Backend Features (padeltour)
The backend is built with Python and FastAPI, providing a robust API for the frontend.
### Core APIs
- **Authentication**: Handles user login, token refresh, and other authentication-related tasks.
- **Companies**: Manages company information, including admin creation and password changes.
- **Courts**: Provides endpoints for creating, retrieving, updating, and deleting court information.
- **Dashboard**: Offers endpoints to fetch data for the main dashboard, including statistics and overviews.
- **Password Reset**: Manages the password reset process, including token validation and password updates.
- **Players**: Handles player management, including creation, deletion, and association with tournaments.
- **Registration**: Manages the company registration process, including email verification.
- **Tournaments**: Provides comprehensive management of tournaments, from creation to player and court assignments.
- **Tournament Staging**: Manages the different stages of a tournament, including:
- **Brackets**: Handles the creation and management of tournament brackets.
- **Groups**: Manages player groups within a tournament.
- **Matches**: Provides endpoints for match management and scheduling.
- **Scheduling**: Automates the scheduling of matches.
- **Stages**: Manages the different stages of a tournament (e.g., group stage, knockout stage).
- **Stats**: Provides statistics for tournaments.
## Frontend Features (app.tourn.me)
The frontend is a Next.js application that provides a user-friendly interface for managing tournaments.
### Main Sections
- **Dashboard**: The main landing page after login, providing an overview of key metrics.
- **Overview**: Displays statistics related to sales, user activity, and more.
- **Courts**: Allows for the management of padel courts.
- **Players**: A section for managing players, including creation and viewing.
- **Products**: Manages products or services offered.
- **Profile**: Allows users to manage their company profile and settings.
- **Tournament**: The core section for managing tournaments.
### Tournament Management
- **Tournament Creation**: A step-by-step process to create new tournaments.
- **Tournament Overview**: A view of all ongoing and past tournaments.
- **Tournament Details**: A detailed view of a specific tournament, including:
- Player management
- Court assignments
- Match scheduling
- Bracket visualization
### User Authentication
- **Sign In/Register**: Standard user authentication pages.
- **Forgot/Reset Password**: A complete flow for password recovery.
### Other Features
- **Email Service**: Integrated email notifications for events like registration and password recovery.
- **Internationalization (i18n)**: The application supports multiple languages.
- **Real-time Updates**: The application is set up for real-time data fetching and updates.
- **API Documentation**: The project includes a `collection` folder with API requests for easier testing and integration.
- **Monitoring**: The `grafana` folder suggests that the application is set up for monitoring with Grafana dashboards.
- **Database Migrations**: Uses `alembic` for handling database schema migrations.
- **Containerization**: Both the frontend and backend applications are containerized using Docker.

BIN
tournme/email/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,199 @@
<mjml>
<mj-head>
<mj-title>Reimposta la tua Password Tourn.me</mj-title>
<mj-preview>Abbiamo ricevuto una richiesta per reimpostare la password per {DATA_VARIABLE:companyName}...</mj-preview>
<mj-attributes>
<mj-all font-family="'Segoe UI', Tahoma, Geneva, Verdana, sans-serif" />
<mj-text font-size="16px" color="#333333" line-height="1.6" />
<mj-section background-color="#f4f4f4" padding="20px" />
</mj-attributes>
<mj-style inline="inline">
.code-text {
font-size: 32px !important;
font-weight: bold !important;
letter-spacing: 8px !important;
color: #f6b43c !important;
font-family: 'Courier New', monospace !important;
text-align: center !important;
}
.code-label {
font-size: 14px !important;
color: #666666 !important;
text-align: center !important;
margin-bottom: 10px !important;
}
.expiry-text {
color: #dc3545 !important;
font-weight: bold !important;
font-size: 14px !important;
text-align: center !important;
}
.step-item {
margin: 8px 0 !important;
padding-left: 20px !important;
position: relative !important;
}
.step-arrow {
color: #f6b43c !important;
font-weight: bold !important;
}
.warning-icon {
color: #856404 !important;
font-weight: bold !important;
}
@media only screen and (max-width: 600px) {
.code-text {
font-size: 24px !important;
letter-spacing: 4px !important;
}
}
</mj-style>
</mj-head>
<mj-body background-color="#f4f4f4">
<!-- Header Section -->
<mj-section background-color="#ffffff" border-radius="10px 10px 0 0" padding="40px 40px 20px 40px">
<mj-column>
<!-- Spazio per logo SVG -->
<mj-image src="https://app.tourn.me/logo.svg" alt="Tourn.me Logo" width="120px" height="auto" padding-bottom="20px" />
<mj-text align="center" font-size="24px" font-weight="600" color="#e5a332" padding-bottom="20px">
Richiesta di Reset Password
</mj-text>
</mj-column>
</mj-section>
<!-- Greeting Section -->
<mj-section background-color="#ffffff" padding="0 40px">
<mj-column>
<mj-text font-size="16px" line-height="1.6">
Ciao <strong>{DATA_VARIABLE:companyName}</strong>,
</mj-text>
<mj-text font-size="16px" line-height="1.6" padding-bottom="20px">
Abbiamo ricevuto una richiesta per reimpostare la password del tuo account Tourn.me. Se non hai fatto questa richiesta, puoi ignorare tranquillamente questa email.
</mj-text>
</mj-column>
</mj-section>
<!-- Verification Code Section -->
<mj-section background-color="#ffffff" padding="0 40px">
<mj-column>
<mj-wrapper background-color="#f8f9fa" border="0px solid #f8f9fa" border-radius="6px" padding="20px">
<mj-section background-color="transparent" padding="0">
<mj-column>
<mj-text css-class="code-label">
Il tuo codice di verifica a 6 cifre:
</mj-text>
<mj-text css-class="code-text">
{DATA_VARIABLE:verificationCode}
</mj-text>
<mj-text css-class="expiry-text">
⏰ Scade tra {DATA_VARIABLE:expiryMinutes} minuti
</mj-text>
</mj-column>
</mj-section>
</mj-wrapper>
</mj-column>
</mj-section>
<!-- Reset Button Section -->
<mj-section background-color="#ffffff" padding="30px 40px">
<mj-column>
<mj-button
background-color="#f6b43c"
color="#ffffff"
font-size="16px"
font-weight="bold"
border-radius="6px"
padding="15px 30px"
href="{DATA_VARIABLE:resetLink}"
>
Reimposta Password Subito
</mj-button>
<mj-text align="center" font-size="14px" color="#666666" padding-top="10px">
Clicca il pulsante sopra per il reset immediato, o usa il codice nella tua app
</mj-text>
</mj-column>
</mj-section>
<!-- Alternative Method Section -->
<mj-section background-color="#ffffff" padding="0 40px">
<mj-column>
<mj-wrapper background-color="#e9ecef" border-radius="6px" padding="20px">
<mj-section background-color="transparent" padding="0">
<mj-column>
<mj-text font-size="16px" color="#495057" font-weight="bold" padding-bottom="10px">
Prossimi passi
</mj-text>
<mj-text font-size="14px" color="#495057" padding="2px 0">
<span class="step-arrow">→</span> Apri la pagina di reset password
</mj-text>
<mj-text font-size="14px" color="#495057" padding="2px 0">
<span class="step-arrow">→</span> Inserisci il codice a 6 cifre: <strong>{DATA_VARIABLE:verificationCode}</strong>
</mj-text>
<mj-text font-size="14px" color="#495057" padding="2px 0">
<span class="step-arrow">→</span> Crea la tua nuova password
</mj-text>
</mj-column>
</mj-section>
</mj-wrapper>
</mj-column>
</mj-section>
<!-- Security Warning Section -->
<mj-section background-color="#ffffff" padding="20px 40px">
<mj-column>
<mj-wrapper background-color="#fff3cd" border="1px solid #ffeaa7" border-radius="6px" padding="15px">
<mj-section background-color="transparent" padding="0">
<mj-column>
<mj-text font-size="14px" padding-bottom="10px">
<span class="warning-icon">🔒 Avviso di Sicurezza:</span>
</mj-text>
<mj-text font-size="14px" padding="2px 0">
• Questo codice scade tra <strong>{DATA_VARIABLE:expiryMinutes} minuti</strong>
</mj-text>
<mj-text font-size="14px" padding="2px 0">
• Usa questo codice solo se hai richiesto un reset password
</mj-text>
<mj-text font-size="14px" padding="2px 0">
• Non condividere mai questo codice con nessuno
</mj-text>
<mj-text font-size="14px" padding="2px 0">
• Se non hai fatto questa richiesta, contatta subito il supporto
</mj-text>
</mj-column>
</mj-section>
</mj-wrapper>
</mj-column>
</mj-section>
<!-- Troubleshooting Section -->
<mj-section background-color="#ffffff" padding="20px 40px">
<mj-column>
<mj-wrapper background-color="#f8f9fa" border-radius="6px" padding="15px">
<mj-section background-color="transparent" padding="0">
<mj-column>
<mj-text font-size="16px" color="#495057" font-weight="bold" padding-bottom="10px">
💡 Hai problemi?
</mj-text>
<mj-text font-size="14px" color="#666666" padding="2px 0">
• Prova a copiare e incollare il codice se digitarlo non funziona
</mj-text>
<mj-text font-size="14px" color="#666666" padding="2px 0">
• Verifica che la tua connessione internet sia stabile
</mj-text>
<mj-text font-size="14px" color="#666666" padding="2px 0">
• Contatta il nostro team di supporto se i problemi persistono
</mj-text>
</mj-column>
</mj-section>
</mj-wrapper>
</mj-column>
</mj-section>
<!-- Footer Section -->
<mj-section background-color="#ffffff" border-radius="0 0 10px 10px" padding="30px 40px 40px 40px">
<mj-column>
<mj-divider border-color="#e9ecef" border-width="1px" padding="20px 0" />
<mj-text align="center" font-size="14px" color="#666666" padding-bottom="10px">
Questa email ti è stata inviata perché è stato richiesto un reset password per il tuo account Tourn.me.
</mj-text>
<mj-text align="center" font-size="12px" color="#999999" padding-top="15px">
© 2025 Tourn.me. Tutti i diritti riservati.<br/>
Questo è un messaggio automatico, non rispondere a questa email.
</mj-text>
</mj-column>
</mj-section>
</mj-body>
</mjml>

Some files were not shown because too many files have changed in this diff Show More