52 lines
9.2 KiB
Python
52 lines
9.2 KiB
Python
from flask import Blueprint, jsonify, Response
|
|
|
|
docs = Blueprint('openapi', __name__)
|
|
|
|
@docs.get('/openapi.json')
|
|
def spec():
|
|
return jsonify({
|
|
'openapi':'3.0.3','info':{'title':'FuelTrack API','version':'0.1.0','description':'REST API FuelTrack. Dla integracji użyj logowania e-mailem i hasłem w OAuth2 Password, które zwraca token Bearer. Interfejs WWW może nadal używać sesji cookie.'},
|
|
'components':{'securitySchemes':{
|
|
'oauth2Password':{'type':'oauth2','flows':{'password':{'tokenUrl':'/api/auth/token','scopes':{}}}},
|
|
'bearerAuth':{'type':'http','scheme':'bearer','bearerFormat':'signed token'},
|
|
'sessionCookie':{'type':'apiKey','in':'cookie','name':'session'}
|
|
},'schemas':{
|
|
'ApiResponse':{'type':'object','properties':{'ok':{'type':'boolean'},'message':{'type':'string'},'data':{}}},
|
|
'User':{'type':'object','properties':{'id':{'type':'integer'},'name':{'type':'string'},'email':{'type':'string','format':'email'},'role':{'type':'string','enum':['user','boss','admin']},'active':{'type':'boolean'}}},
|
|
'Vehicle':{'type':'object','properties':{'id':{'type':'integer'},'name':{'type':'string'},'registration':{'type':'string'},'fuel_type':{'type':'string','enum':['PB95','PB98','DIESEL','LPG']}}}
|
|
}},
|
|
'security':[{'oauth2Password':[]},{'bearerAuth':[]},{'sessionCookie':[]}],
|
|
'paths':{
|
|
'/api/auth/login':{'post':{'tags':['Auth'],'security':[],'summary':'Logowanie','requestBody':{'required':True,'content':{'application/json':{'schema':{'type':'object','required':['email','password'],'properties':{'email':{'type':'string'},'password':{'type':'string'}}}}}},'responses':{'200':{'description':'Zalogowano'},'401':{'description':'Błędne dane'}}}},
|
|
'/api/auth/token':{'post':{'tags':['Auth'],'security':[],'summary':'Pobranie tokenu Bearer','description':'Endpoint zgodny z OAuth2 Password używany przez przycisk Authorize w Swagger UI. W polu username wpisz adres e-mail.','requestBody':{'required':True,'content':{'application/x-www-form-urlencoded':{'schema':{'type':'object','required':['username','password'],'properties':{'username':{'type':'string','format':'email','description':'Adres e-mail'},'password':{'type':'string','format':'password'}}}},'application/json':{'schema':{'type':'object','required':['email','password'],'properties':{'email':{'type':'string','format':'email'},'password':{'type':'string','format':'password'}}}}}},'responses':{'200':{'description':'Token wydany','content':{'application/json':{'schema':{'type':'object','properties':{'access_token':{'type':'string'},'token_type':{'type':'string','example':'Bearer'},'expires_in':{'type':'integer'}}}}}},'401':{'description':'Błędne dane logowania'}}}},
|
|
'/api/auth/logout':{'post':{'tags':['Auth'],'summary':'Wylogowanie','responses':{'200':{'description':'Wylogowano'}}}},
|
|
'/api/me':{'get':{'tags':['Auth'],'summary':'Bieżący użytkownik','responses':{'200':{'description':'Użytkownik'}}}},
|
|
'/api/vehicles':{'get':{'tags':['Vehicles'],'summary':'Lista dostępnych pojazdów','responses':{'200':{'description':'Lista'}}},'post':{'tags':['Vehicles'],'summary':'Dodanie pojazdu','responses':{'201':{'description':'Utworzono'}}}},
|
|
'/api/vehicles/{vehicle_id}/shares':{'post':{'tags':['Vehicles'],'summary':'Udostępnienie pojazdu','parameters':[{'in':'path','name':'vehicle_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Udostępniono'}}}},
|
|
'/api/vehicles/{vehicle_id}/shares/{user_id}':{'delete':{'tags':['Vehicles'],'summary':'Odebranie dostępu','parameters':[{'in':'path','name':'vehicle_id','required':True,'schema':{'type':'integer'}},{'in':'path','name':'user_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Odebrano'}}}},
|
|
'/api/vehicles/{vehicle_id}/fuel-card':{'put':{'tags':['Vehicles'],'summary':'Przypisanie karty paliwowej do pojazdu','parameters':[{'in':'path','name':'vehicle_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/fuel-entries':{'post':{'tags':['Fuel entries'],'summary':'Dodanie tankowania','responses':{'201':{'description':'Utworzono'}}}},
|
|
'/api/orlen/prices':{'get':{'tags':['Orlen'],'summary':'Ceny zapisane w bazie','parameters':[{'in':'query','name':'year','schema':{'type':'integer'}},{'in':'query','name':'fuel','schema':{'type':'array','items':{'type':'string'}}},{'in':'query','name':'region','schema':{'type':'array','items':{'type':'string'}}}],'responses':{'200':{'description':'Lista cen'}}}},
|
|
'/api/orlen/sync':{'post':{'tags':['Orlen'],'summary':'Import cen Orlen','responses':{'200':{'description':'Zaimportowano'}}}},
|
|
'/api/orlen/preview':{'get':{'tags':['Orlen'],'summary':'Cena na dzień','parameters':[{'in':'query','name':'fuel_type','required':True,'schema':{'type':'string'}},{'in':'query','name':'date','required':True,'schema':{'type':'string','format':'date'}}],'responses':{'200':{'description':'Cena'}}}},
|
|
'/api/users':{'get':{'tags':['Users'],'summary':'Lista użytkowników','responses':{'200':{'description':'Lista'}}},'post':{'tags':['Users'],'summary':'Dodanie użytkownika','responses':{'201':{'description':'Utworzono'}}}},
|
|
'/api/users/{user_id}':{'put':{'tags':['Users'],'summary':'Edycja użytkownika','parameters':[{'in':'path','name':'user_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Zapisano'}}},'delete':{'tags':['Users'],'summary':'Usunięcie użytkownika','description':'Nie pozwala usunąć własnego konta, ostatniego aktywnego administratora ani użytkownika z pojazdami lub historią tankowań.','parameters':[{'in':'path','name':'user_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Usunięto'},'409':{'description':'Usunięcie zablokowane'}}}},
|
|
'/api/settings':{'get':{'tags':['Settings'],'summary':'Pobranie ustawień','responses':{'200':{'description':'Ustawienia'}}},'put':{'tags':['Settings'],'summary':'Zapis ustawień','responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/app-settings':{'get':{'tags':['Settings'],'summary':'Ustawienia aplikacji','responses':{'200':{'description':'Ustawienia'}}},'put':{'tags':['Settings'],'summary':'Zmiana motywu aplikacji','responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/fuel-cards':{'get':{'tags':['Fuel cards'],'summary':'Lista kart paliwowych','responses':{'200':{'description':'Lista'}}},'post':{'tags':['Fuel cards'],'summary':'Dodanie karty paliwowej','responses':{'201':{'description':'Utworzono'}}}},
|
|
'/api/fuel-cards/{card_id}':{'put':{'tags':['Fuel cards'],'summary':'Edycja karty paliwowej','parameters':[{'in':'path','name':'card_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/fuel-cards/{card_id}/stations/{station_id}':{'put':{'tags':['Fuel cards'],'summary':'Warunki karty dla stacji: blokada, last price, rabat netto i dopłata','parameters':[{'in':'path','name':'card_id','required':True,'schema':{'type':'integer'}},{'in':'path','name':'station_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/stations':{'get':{'tags':['Stations'],'summary':'Lista firm paliwowych','parameters':[{'in':'query','name':'q','schema':{'type':'string'}},{'in':'query','name':'sort','schema':{'type':'string','enum':['company_name','station_count','nip','regon','selected_region']}},{'in':'query','name':'direction','schema':{'type':'string','enum':['asc','desc']}},{'in':'query','name':'page','schema':{'type':'integer'}}],'responses':{'200':{'description':'Lista'}}}},
|
|
'/api/stations/{station_id}/points':{'get':{'tags':['Stations'],'summary':'Lista fizycznych punktów wybranej firmy paliwowej','parameters':[{'in':'path','name':'station_id','required':True,'schema':{'type':'integer'}},{'in':'query','name':'q','schema':{'type':'string'}},{'in':'query','name':'page','schema':{'type':'integer'}}],'responses':{'200':{'description':'Lista punktów i adresów'}}}},
|
|
'/api/me/favorite-stations':{'put':{'tags':['Stations'],'summary':'Zapis maksymalnie 10 ulubionych sieci bieżącego użytkownika','responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/settings/allowed-stations':{'put':{'tags':['Stations'],'summary':'Zapis listy sieci dozwolonych przez firmę','responses':{'200':{'description':'Zapisano'}}}},
|
|
'/api/stations/sync':{'post':{'tags':['Stations'],'summary':'Import i agregacja URE','responses':{'200':{'description':'Zaimportowano'}}}},
|
|
'/api/stations/{station_id}':{'put':{'tags':['Stations'],'summary':'Edycja firmy paliwowej','parameters':[{'in':'path','name':'station_id','required':True,'schema':{'type':'integer'}}],'responses':{'200':{'description':'Zapisano'}}}}
|
|
}
|
|
})
|
|
|
|
|
|
@docs.get('/docs')
|
|
def swagger_docs():
|
|
return Response("""<!doctype html><html><head><meta charset='utf-8'><title>FuelTrack API Docs</title><link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css'></head><body><div id='swagger-ui'></div><script src='https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js'></script><script>SwaggerUIBundle({url:'/openapi.json',dom_id:'#swagger-ui',deepLinking:true,persistAuthorization:true});</script></body></html>""", mimetype='text/html')
|