Fix API validation errors (#869)

* fix api validation errors

* swaggerize
This commit is contained in:
Echo 2026-01-28 16:09:50 -05:00 committed by GitHub
parent faca661cc9
commit 67eca6e0e2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 101 additions and 100 deletions

View file

@ -150,7 +150,7 @@ RSpec.describe 'Api::Admin::V1::Resources', type: :request do
parameter name: :admin_id, in: :query, type: :string, description: 'Filter by Admin ID', required: false
parameter name: :user_search, in: :query, type: :string, description: 'Search user (fuzzy)', required: false
parameter name: :admin_search, in: :query, type: :string, description: 'Search admin (fuzzy)', required: false
parameter name: :trust_level_filter, in: :query, type: :string, enum: %w[all to_convicted to_trusted to_suspected to_unscored], description: 'Filter by trust level change', required: false
parameter name: :trust_level_filter, in: :query, schema: { type: :string, enum: %w[all to_convicted to_trusted to_suspected to_unscored] }, description: 'Filter by trust level change', required: false
response(200, 'successful') do
let(:Authorization) { "Bearer dev-admin-api-key-12345" }

View file

@ -8,7 +8,7 @@ RSpec.describe 'Admin::Timeline', type: :request do
security [ AdminToken: [] ]
produces 'application/json'
parameter name: :date, in: :query, type: :string, format: :date, description: 'Date for the timeline (YYYY-MM-DD)'
parameter name: :date, in: :query, schema: { type: :string, format: :date }, description: 'Date for the timeline (YYYY-MM-DD)'
parameter name: :user_ids, in: :query, type: :string, description: 'Comma-separated list of User IDs'
parameter name: :slack_uids, in: :query, type: :string, description: 'Comma-separated list of Slack User IDs'
@ -195,7 +195,7 @@ RSpec.describe 'Admin::Timeline', type: :request do
security [ AdminToken: [] ]
produces 'application/json'
parameter name: :period, in: :query, type: :string, enum: [ 'daily', 'last_7_days' ], description: 'Leaderboard period'
parameter name: :period, in: :query, schema: { type: :string, enum: [ 'daily', 'last_7_days' ] }, description: 'Leaderboard period'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-admin-api-key-12345" }

View file

@ -8,7 +8,7 @@ RSpec.describe 'Api::Admin::V1::UserUtils', type: :request do
security [ AdminToken: [] ]
produces 'application/json'
parameter name: :ids, in: :query, type: :array, items: { type: :integer }, description: 'User IDs'
parameter name: :ids, in: :query, schema: { type: :array, items: { type: :integer } }, description: 'User IDs'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-admin-api-key-12345" }

View file

@ -27,7 +27,7 @@ RSpec.describe 'Api::Admin::V1::AdminUsers', type: :request do
produces 'application/json'
parameter name: :user_id, in: :query, type: :string, description: 'User ID'
parameter name: :date, in: :query, type: :string, format: :date, description: 'Date (YYYY-MM-DD)'
parameter name: :date, in: :query, schema: { type: :string, format: :date }, description: 'Date (YYYY-MM-DD)'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-admin-api-key-12345" }

View file

@ -8,8 +8,8 @@ RSpec.describe 'Api::Summary', type: :request do
security [ Bearer: [], ApiKeyAuth: [] ]
produces 'application/json'
parameter name: :start, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD)'
parameter name: :end, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD)'
parameter name: :start, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD)'
parameter name: :end, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD)'
parameter name: :interval, in: :query, type: :string, description: 'Interval (e.g. today, yesterday, week, month)'
parameter name: :project, in: :query, type: :string, description: 'Project name (optional)'
parameter name: :user, in: :query, type: :string, description: 'Slack UID of the user (optional, for admin use)'

View file

@ -44,8 +44,8 @@ RSpec.describe 'Api::V1::Authenticated', type: :request do
security [ Bearer: [], ApiKeyAuth: [] ]
produces 'application/json'
parameter name: :start_date, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD)'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD)'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-api-key-12345" }

View file

@ -155,7 +155,7 @@ RSpec.describe 'Api::V1::External', type: :request do
schema type: :object,
properties: {
error: { type: :string },
conflicts: { type: :array, items: { type: :array } }
conflicts: { type: :array, items: { type: :array, items: { type: :string } } }
}
run_test!
end

View file

@ -51,8 +51,8 @@ RSpec.describe 'Api::V1::My', type: :request do
security [ Bearer: [], ApiKeyAuth: [] ]
produces 'application/json'
parameter name: :start_time, in: :query, type: :string, format: :date_time, description: 'Start time (ISO 8601)'
parameter name: :end_time, in: :query, type: :string, format: :date_time, description: 'End time (ISO 8601)'
parameter name: :start_time, in: :query, schema: { type: :string, format: :date_time }, description: 'Start time (ISO 8601)'
parameter name: :end_time, in: :query, schema: { type: :string, format: :date_time }, description: 'End time (ISO 8601)'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-api-key-12345" }
@ -81,8 +81,8 @@ RSpec.describe 'Api::V1::My', type: :request do
produces 'application/json'
parameter name: :all_data, in: :query, type: :boolean, description: 'Export all data (true/false)'
parameter name: :start_date, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD)'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD)'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-api-key-12345" }
@ -133,8 +133,8 @@ RSpec.describe 'Api::V1::My', type: :request do
produces 'application/json', 'text/html'
parameter name: :interval, in: :query, type: :string, description: 'Time interval (e.g., daily, weekly). Default: daily'
parameter name: :from, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD)'
parameter name: :to, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD)'
parameter name: :from, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD)'
parameter name: :to, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD)'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-api-key-12345" }
let(:api_key) { 'dev-api-key-12345' }

View file

@ -8,8 +8,8 @@ RSpec.describe 'Api::V1::Stats', type: :request do
security [ Bearer: [], ApiKeyAuth: [] ]
produces 'text/plain'
parameter name: :start_date, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD), defaults to 10 years ago'
parameter name: :end_date, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD), defaults to today'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD), defaults to 10 years ago'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD), defaults to today'
parameter name: :username, in: :query, type: :string, description: 'Filter by username (optional)'
parameter name: :user_email, in: :query, type: :string, description: 'Filter by user email (optional)'
@ -59,8 +59,8 @@ RSpec.describe 'Api::V1::Stats', type: :request do
produces 'application/json'
parameter name: :username, in: :path, type: :string
parameter name: :start_date, in: :query, type: :string, format: :date
parameter name: :end_date, in: :query, type: :string, format: :date
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }
parameter name: :project, in: :query, type: :string, description: 'Filter by single project'
parameter name: :filter_by_project, in: :query, type: :string, description: 'Filter by multiple projects (comma separated)'
@ -142,8 +142,8 @@ RSpec.describe 'Api::V1::Stats', type: :request do
parameter name: :username, in: :path, type: :string
parameter name: :project_name, in: :path, type: :string
parameter name: :start_date, in: :query, type: :string, format: :date
parameter name: :end_date, in: :query, type: :string, format: :date
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }
response(200, 'successful') do
let(:username) { 'testuser' }
@ -174,10 +174,10 @@ RSpec.describe 'Api::V1::Stats', type: :request do
parameter name: :username, in: :path, type: :string
parameter name: :projects, in: :query, type: :string, description: 'Comma-separated project names'
parameter name: :since, in: :query, type: :string, format: :date_time
parameter name: :until, in: :query, type: :string, format: :date_time
parameter name: :start_date, in: :query, type: :string, format: :date
parameter name: :end_date, in: :query, type: :string, format: :date
parameter name: :since, in: :query, schema: { type: :string, format: :date_time }
parameter name: :until, in: :query, schema: { type: :string, format: :date_time }
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }
response(200, 'successful') do
let(:username) { 'testuser' }
@ -219,8 +219,8 @@ RSpec.describe 'Api::V1::Stats', type: :request do
produces 'application/json'
parameter name: :username, in: :path, type: :string, description: 'Username, Slack ID, or User ID'
parameter name: :start_date, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD)'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD)'
parameter name: :limit, in: :query, type: :integer, description: 'Limit number of results'
parameter name: :features, in: :query, type: :string, description: 'Comma-separated list of features to include (e.g., languages,projects)'
parameter name: :filter_by_project, in: :query, type: :string, description: 'Filter results by specific project names (comma-separated)'

View file

@ -148,8 +148,8 @@ RSpec.describe 'Api::V1::Users', type: :request do
parameter name: :username, in: :path, type: :string, description: 'Username'
parameter name: :project_name, in: :path, type: :string, description: 'Project Name'
parameter name: :start_date, in: :query, type: :string, format: :date_time, description: 'Start date (ISO 8601) for stats calculation'
parameter name: :end_date, in: :query, type: :string, format: :date_time, description: 'End date (ISO 8601) for stats calculation'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date_time }, description: 'Start date (ISO 8601) for stats calculation'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date_time }, description: 'End date (ISO 8601) for stats calculation'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-api-key-12345" }
@ -172,10 +172,10 @@ RSpec.describe 'Api::V1::Users', type: :request do
parameter name: :username, in: :path, type: :string, description: 'Username'
parameter name: :projects, in: :query, type: :string, description: 'Comma-separated list of projects to filter'
parameter name: :since, in: :query, type: :string, format: :date_time, description: 'Start time (ISO 8601) for project discovery'
parameter name: :until_date, in: :query, type: :string, format: :date_time, description: 'End time (ISO 8601) for project discovery'
parameter name: :start_date, in: :query, type: :string, format: :date_time, description: 'Start date (ISO 8601) for stats calculation'
parameter name: :end_date, in: :query, type: :string, format: :date_time, description: 'End date (ISO 8601) for stats calculation'
parameter name: :since, in: :query, schema: { type: :string, format: :date_time }, description: 'Start time (ISO 8601) for project discovery'
parameter name: :until_date, in: :query, schema: { type: :string, format: :date_time }, description: 'End time (ISO 8601) for project discovery'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date_time }, description: 'Start date (ISO 8601) for stats calculation'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date_time }, description: 'End date (ISO 8601) for stats calculation'
response(200, 'successful') do
let(:Authorization) { "Bearer dev-api-key-12345" }
@ -199,8 +199,8 @@ RSpec.describe 'Api::V1::Users', type: :request do
produces 'application/json'
parameter name: :username, in: :path, type: :string, description: 'Username'
parameter name: :start_date, in: :query, type: :string, format: :date, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, type: :string, format: :date, description: 'End date (YYYY-MM-DD)'
parameter name: :start_date, in: :query, schema: { type: :string, format: :date }, description: 'Start date (YYYY-MM-DD)'
parameter name: :end_date, in: :query, schema: { type: :string, format: :date }, description: 'End date (YYYY-MM-DD)'
parameter name: :project, in: :query, type: :string, description: 'Filter by specific project'
parameter name: :filter_by_project, in: :query, type: :string, description: 'Filter by multiple projects (comma-separated)'

View file

@ -197,17 +197,16 @@ paths:
type: string
- name: trust_level_filter
in: query
enum:
- all
- to_convicted
- to_trusted
- to_suspected
- to_unscored
description: "Filter by trust level change:\n * `all` \n * `to_convicted`
\n * `to_trusted` \n * `to_suspected` \n * `to_unscored` \n "
required: false
schema:
type: string
enum:
- all
- to_convicted
- to_trusted
- to_suspected
- to_unscored
description: Filter by trust level change
required: false
responses:
'200':
description: successful
@ -522,10 +521,10 @@ paths:
parameters:
- name: date
in: query
format: date
description: Date for the timeline (YYYY-MM-DD)
schema:
type: string
format: date
description: Date for the timeline (YYYY-MM-DD)
- name: user_ids
in: query
description: Comma-separated list of User IDs
@ -688,12 +687,12 @@ paths:
parameters:
- name: period
in: query
enum:
- daily
- last_7_days
description: "Leaderboard period:\n * `daily` \n * `last_7_days` \n "
schema:
type: string
enum:
- daily
- last_7_days
description: Leaderboard period
responses:
'200':
description: successful
@ -726,11 +725,11 @@ paths:
parameters:
- name: ids
in: query
items:
type: integer
description: User IDs
schema:
type: array
items:
type: integer
description: User IDs
responses:
'200':
description: successful
@ -874,10 +873,10 @@ paths:
type: string
- name: date
in: query
format: date
description: Date (YYYY-MM-DD)
schema:
type: string
format: date
description: Date (YYYY-MM-DD)
responses:
'200':
description: successful
@ -1919,16 +1918,16 @@ paths:
parameters:
- name: start
in: query
format: date
description: Start date (YYYY-MM-DD)
schema:
type: string
format: date
description: Start date (YYYY-MM-DD)
- name: end
in: query
format: date
description: End date (YYYY-MM-DD)
schema:
type: string
format: date
description: End date (YYYY-MM-DD)
- name: interval
in: query
description: Interval (e.g. today, yesterday, week, month)
@ -2053,16 +2052,16 @@ paths:
parameters:
- name: start_date
in: query
format: date
description: Start date (YYYY-MM-DD)
schema:
type: string
format: date
description: Start date (YYYY-MM-DD)
- name: end_date
in: query
format: date
description: End date (YYYY-MM-DD)
schema:
type: string
format: date
description: End date (YYYY-MM-DD)
responses:
'200':
description: successful
@ -2305,6 +2304,8 @@ paths:
type: array
items:
type: array
items:
type: string
requestBody:
content:
application/json:
@ -2485,16 +2486,16 @@ paths:
parameters:
- name: start_time
in: query
format: date_time
description: Start time (ISO 8601)
schema:
type: string
format: date_time
description: Start time (ISO 8601)
- name: end_time
in: query
format: date_time
description: End time (ISO 8601)
schema:
type: string
format: date_time
description: End time (ISO 8601)
responses:
'200':
description: successful
@ -2517,16 +2518,16 @@ paths:
type: boolean
- name: start_date
in: query
format: date
description: Start date (YYYY-MM-DD)
schema:
type: string
format: date
description: Start date (YYYY-MM-DD)
- name: end_date
in: query
format: date
description: End date (YYYY-MM-DD)
schema:
type: string
format: date
description: End date (YYYY-MM-DD)
responses:
'200':
description: successful
@ -2567,16 +2568,16 @@ paths:
type: string
- name: from
in: query
format: date
description: Start date (YYYY-MM-DD)
schema:
type: string
format: date
description: Start date (YYYY-MM-DD)
- name: to
in: query
format: date
description: End date (YYYY-MM-DD)
schema:
type: string
format: date
description: End date (YYYY-MM-DD)
responses:
'200':
description: successful
@ -2710,16 +2711,16 @@ paths:
parameters:
- name: start_date
in: query
format: date
description: Start date (YYYY-MM-DD), defaults to 10 years ago
schema:
type: string
format: date
description: Start date (YYYY-MM-DD), defaults to 10 years ago
- name: end_date
in: query
format: date
description: End date (YYYY-MM-DD), defaults to today
schema:
type: string
format: date
description: End date (YYYY-MM-DD), defaults to today
- name: username
in: query
description: Filter by username (optional)
@ -2761,16 +2762,16 @@ paths:
type: string
- name: start_date
in: query
format: date
description: Start date (YYYY-MM-DD)
schema:
type: string
format: date
description: Start date (YYYY-MM-DD)
- name: end_date
in: query
format: date
description: End date (YYYY-MM-DD)
schema:
type: string
format: date
description: End date (YYYY-MM-DD)
- name: project
in: query
description: Filter by specific project
@ -2896,16 +2897,16 @@ paths:
type: string
- name: start_date
in: query
format: date_time
description: Start date (ISO 8601) for stats calculation
schema:
type: string
format: date_time
description: Start date (ISO 8601) for stats calculation
- name: end_date
in: query
format: date_time
description: End date (ISO 8601) for stats calculation
schema:
type: string
format: date_time
description: End date (ISO 8601) for stats calculation
responses:
'200':
description: successful
@ -2958,28 +2959,28 @@ paths:
type: string
- name: since
in: query
format: date_time
description: Start time (ISO 8601) for project discovery
schema:
type: string
format: date_time
description: Start time (ISO 8601) for project discovery
- name: until_date
in: query
format: date_time
description: End time (ISO 8601) for project discovery
schema:
type: string
format: date_time
description: End time (ISO 8601) for project discovery
- name: start_date
in: query
format: date_time
description: Start date (ISO 8601) for stats calculation
schema:
type: string
format: date_time
description: Start date (ISO 8601) for stats calculation
- name: end_date
in: query
format: date_time
description: End date (ISO 8601) for stats calculation
schema:
type: string
format: date_time
description: End date (ISO 8601) for stats calculation
responses:
'200':
description: successful
@ -3035,16 +3036,16 @@ paths:
type: string
- name: start_date
in: query
format: date
description: Start date (YYYY-MM-DD)
schema:
type: string
format: date
description: Start date (YYYY-MM-DD)
- name: end_date
in: query
format: date
description: End date (YYYY-MM-DD)
schema:
type: string
format: date
description: End date (YYYY-MM-DD)
- name: limit
in: query
description: Limit number of results