mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-31 01:54:35 -04:00
Add API Documentation to repo
This commit is contained in:
parent
37aaa1fc5b
commit
c995ac5f44
@ -409,7 +409,7 @@ class CompanyController extends BaseController
|
|||||||
public function update(UpdateCompanyRequest $request, Company $company)
|
public function update(UpdateCompanyRequest $request, Company $company)
|
||||||
{
|
{
|
||||||
|
|
||||||
if($request->hasFile('company_logo') || !array_key_exists('company_logo', $request->input('settings')))
|
if($request->hasFile('company_logo') || (is_array($request->input('settings')) && !array_key_exists('company_logo', $request->input('settings'))))
|
||||||
$this->removeLogo($company);
|
$this->removeLogo($company);
|
||||||
|
|
||||||
$company = $this->company_repo->save($request->all(), $company);
|
$company = $this->company_repo->save($request->all(), $company);
|
||||||
|
@ -790,4 +790,57 @@ class InvoiceController extends BaseController
|
|||||||
|
|
||||||
return response()->download($file_path, basename($file_path));
|
return response()->download($file_path, basename($file_path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/invoices/{id}/delivery_note",
|
||||||
|
* operationId="deliveryNote",
|
||||||
|
* tags={"invoices"},
|
||||||
|
* summary="Download a specific invoice delivery notes",
|
||||||
|
* description="Downloads a specific invoice delivery notes",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The Invoice Hahsed Id",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the invoice delivery note pdf",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
* @param $invoice
|
||||||
|
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
|
||||||
|
*/
|
||||||
|
public function deliveryNote(ShowInvoiceRequest $request, Invoice $invoice)
|
||||||
|
{
|
||||||
|
|
||||||
|
$file_path = $invoice->service()->getInvoiceDeliveryNote($invoice->invitations->first()->contact);
|
||||||
|
|
||||||
|
return response()->download($file_path, basename($file_path));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,15 +12,15 @@
|
|||||||
* @OA\License(
|
* @OA\License(
|
||||||
* name="Attribution Assurance License",
|
* name="Attribution Assurance License",
|
||||||
* url="https://opensource.org/licenses/AAL"
|
* url="https://opensource.org/licenses/AAL"
|
||||||
* )
|
* ),
|
||||||
* ),
|
* ),
|
||||||
* @OA\Server(
|
* @OA\Server(
|
||||||
* description="Example InvoiceNinja base url",
|
* description="Example InvoiceNinja base url",
|
||||||
* url="https://ninja.test"
|
* url="https://ninja.test",
|
||||||
* ),
|
* ),
|
||||||
* @OA\ExternalDocumentation(
|
* @OA\ExternalDocumentation(
|
||||||
* description="http://docs.invoiceninja.com",
|
* description="http://docs.invoiceninja.com",
|
||||||
* url="http://docs.invoiceninja.com"
|
* url="http://docs.invoiceninja.com"
|
||||||
* )
|
* ),
|
||||||
* )
|
* ),
|
||||||
*/
|
*/
|
||||||
|
@ -143,6 +143,11 @@ class InvoiceService
|
|||||||
return (new GetInvoicePdf($this->invoice, $contact))->run();
|
return (new GetInvoicePdf($this->invoice, $contact))->run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getInvoiceDeliveryNote($contact = null)
|
||||||
|
{
|
||||||
|
//stubbed
|
||||||
|
}
|
||||||
|
|
||||||
public function sendEmail($contact = null)
|
public function sendEmail($contact = null)
|
||||||
{
|
{
|
||||||
$send_email = new SendEmail($this->invoice, null, $contact);
|
$send_email = new SendEmail($this->invoice, null, $contact);
|
||||||
|
198
config/l5-swagger.php
Normal file
198
config/l5-swagger.php
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'default' => 'default',
|
||||||
|
'documentations' => [
|
||||||
|
'default' => [
|
||||||
|
'api' => [
|
||||||
|
'title' => 'L5 Swagger UI',
|
||||||
|
],
|
||||||
|
|
||||||
|
'routes' => [
|
||||||
|
/*
|
||||||
|
* Route for accessing api documentation interface
|
||||||
|
*/
|
||||||
|
'api' => 'api/documentation',
|
||||||
|
],
|
||||||
|
'paths' => [
|
||||||
|
/*
|
||||||
|
* File name of the generated json documentation file
|
||||||
|
*/
|
||||||
|
'docs_json' => 'api-docs.json',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File name of the generated YAML documentation file
|
||||||
|
*/
|
||||||
|
'docs_yaml' => 'api-docs.yaml',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Absolute paths to directory containing the swagger annotations are stored.
|
||||||
|
*/
|
||||||
|
'annotations' => [
|
||||||
|
base_path('app'),
|
||||||
|
],
|
||||||
|
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'defaults' => [
|
||||||
|
'routes' => [
|
||||||
|
/*
|
||||||
|
* Route for accessing parsed swagger annotations.
|
||||||
|
*/
|
||||||
|
'docs' => 'docs',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Route for Oauth2 authentication callback.
|
||||||
|
*/
|
||||||
|
'oauth2_callback' => 'api/oauth2-callback',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Middleware allows to prevent unexpected access to API documentation
|
||||||
|
*/
|
||||||
|
'middleware' => [
|
||||||
|
'api' => [],
|
||||||
|
'asset' => [],
|
||||||
|
'docs' => [],
|
||||||
|
'oauth2_callback' => [],
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Route Group options
|
||||||
|
*/
|
||||||
|
'group_options' => [],
|
||||||
|
],
|
||||||
|
|
||||||
|
'paths' => [
|
||||||
|
/*
|
||||||
|
* Absolute path to location where parsed annotations will be stored
|
||||||
|
*/
|
||||||
|
'docs' => storage_path('api-docs'),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Absolute path to directory where to export views
|
||||||
|
*/
|
||||||
|
'views' => base_path('resources/views/vendor/l5-swagger'),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Edit to set the api's base path
|
||||||
|
*/
|
||||||
|
'base' => env('L5_SWAGGER_BASE_PATH', null),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Edit to set path where swagger ui assets should be stored
|
||||||
|
*/
|
||||||
|
'swagger_ui_assets_path' => env('L5_SWAGGER_UI_ASSETS_PATH', 'vendor/swagger-api/swagger-ui/dist/'),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Absolute path to directories that should be exclude from scanning
|
||||||
|
*/
|
||||||
|
'excludes' => [],
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* API security definitions. Will be generated into documentation file.
|
||||||
|
*/
|
||||||
|
'securityDefinitions' => [
|
||||||
|
'securitySchemes' => [
|
||||||
|
/*
|
||||||
|
* Examples of Security schemes
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
'api_key_security_example' => [ // Unique name of security
|
||||||
|
'type' => 'apiKey', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
|
||||||
|
'description' => 'A short description for security scheme',
|
||||||
|
'name' => 'api_key', // The name of the header or query parameter to be used.
|
||||||
|
'in' => 'header', // The location of the API key. Valid values are "query" or "header".
|
||||||
|
],
|
||||||
|
'oauth2_security_example' => [ // Unique name of security
|
||||||
|
'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
|
||||||
|
'description' => 'A short description for oauth2 security scheme.',
|
||||||
|
'flow' => 'implicit', // The flow used by the OAuth2 security scheme. Valid values are "implicit", "password", "application" or "accessCode".
|
||||||
|
'authorizationUrl' => 'http://example.com/auth', // The authorization URL to be used for (implicit/accessCode)
|
||||||
|
//'tokenUrl' => 'http://example.com/auth' // The authorization URL to be used for (password/application/accessCode)
|
||||||
|
'scopes' => [
|
||||||
|
'read:projects' => 'read your projects',
|
||||||
|
'write:projects' => 'modify projects in your account',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Open API 3.0 support
|
||||||
|
'passport' => [ // Unique name of security
|
||||||
|
'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
|
||||||
|
'description' => 'Laravel passport oauth2 security.',
|
||||||
|
'in' => 'header',
|
||||||
|
'scheme' => 'https',
|
||||||
|
'flows' => [
|
||||||
|
"password" => [
|
||||||
|
"authorizationUrl" => config('app.url') . '/oauth/authorize',
|
||||||
|
"tokenUrl" => config('app.url') . '/oauth/token',
|
||||||
|
"refreshUrl" => config('app.url') . '/token/refresh',
|
||||||
|
"scopes" => []
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
*/
|
||||||
|
],
|
||||||
|
'security' => [
|
||||||
|
/*
|
||||||
|
* Examples of Securities
|
||||||
|
*/
|
||||||
|
[
|
||||||
|
/*
|
||||||
|
'oauth2_security_example' => [
|
||||||
|
'read',
|
||||||
|
'write'
|
||||||
|
],
|
||||||
|
|
||||||
|
'passport' => []
|
||||||
|
*/
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set this to `true` in development mode so that docs would be regenerated on each request
|
||||||
|
* Set this to `false` to disable swagger generation on production
|
||||||
|
*/
|
||||||
|
'generate_always' => env('L5_SWAGGER_GENERATE_ALWAYS', false),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set this to `true` to generate a copy of documentation in yaml format
|
||||||
|
*/
|
||||||
|
'generate_yaml_copy' => env('L5_SWAGGER_GENERATE_YAML_COPY', false),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Edit to trust the proxy's ip address - needed for AWS Load Balancer
|
||||||
|
* string[]
|
||||||
|
*/
|
||||||
|
'proxy' => false,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configs plugin allows to fetch external configs instead of passing them to SwaggerUIBundle.
|
||||||
|
* See more at: https://github.com/swagger-api/swagger-ui#configs-plugin
|
||||||
|
*/
|
||||||
|
'additional_config_url' => null,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically),
|
||||||
|
* 'method' (sort by HTTP method).
|
||||||
|
* Default is the order returned by the server unchanged.
|
||||||
|
*/
|
||||||
|
'operations_sort' => env('L5_SWAGGER_OPERATIONS_SORT', null),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pass the validatorUrl parameter to SwaggerUi init on the JS side.
|
||||||
|
* A null value here disables validation.
|
||||||
|
*/
|
||||||
|
'validator_url' => null,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Uncomment to add constants which can be used in annotations
|
||||||
|
*/
|
||||||
|
// 'constants' => [
|
||||||
|
// 'L5_SWAGGER_CONST_HOST' => env('L5_SWAGGER_CONST_HOST', 'http://my-default-host.com'),
|
||||||
|
// ],
|
||||||
|
],
|
||||||
|
];
|
0
resources/views/vendor/l5-swagger/.gitkeep
vendored
Normal file
0
resources/views/vendor/l5-swagger/.gitkeep
vendored
Normal file
106
resources/views/vendor/l5-swagger/index.blade.php
vendored
Normal file
106
resources/views/vendor/l5-swagger/index.blade.php
vendored
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<!-- HTML for static distribution bundle build -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{{config('l5-swagger.documentations.'.$documentation.'.api.title')}}</title>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ l5_swagger_asset($documentation, 'swagger-ui.css') }}" >
|
||||||
|
<link rel="icon" type="image/png" href="{{ l5_swagger_asset($documentation, 'favicon-32x32.png') }}" sizes="32x32" />
|
||||||
|
<link rel="icon" type="image/png" href="{{ l5_swagger_asset($documentation, 'favicon-16x16.png') }}" sizes="16x16" />
|
||||||
|
<style>
|
||||||
|
html
|
||||||
|
{
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: -moz-scrollbars-vertical;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
*,
|
||||||
|
*:before,
|
||||||
|
*:after
|
||||||
|
{
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin:0;
|
||||||
|
background: #fafafa;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
|
||||||
|
<defs>
|
||||||
|
<symbol viewBox="0 0 20 20" id="unlocked">
|
||||||
|
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="locked">
|
||||||
|
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="close">
|
||||||
|
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="large-arrow">
|
||||||
|
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="large-arrow-down">
|
||||||
|
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 24 24" id="jump-to">
|
||||||
|
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 24 24" id="expand">
|
||||||
|
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<div id="swagger-ui"></div>
|
||||||
|
|
||||||
|
<script src="{{ l5_swagger_asset($documentation, 'swagger-ui-bundle.js') }}"> </script>
|
||||||
|
<script src="{{ l5_swagger_asset($documentation, 'swagger-ui-standalone-preset.js') }}"> </script>
|
||||||
|
<script>
|
||||||
|
window.onload = function() {
|
||||||
|
// Build a system
|
||||||
|
const ui = SwaggerUIBundle({
|
||||||
|
dom_id: '#swagger-ui',
|
||||||
|
|
||||||
|
url: "{!! $urlToDocs !!}",
|
||||||
|
operationsSorter: {!! isset($operationsSorter) ? '"' . $operationsSorter . '"' : 'null' !!},
|
||||||
|
configUrl: {!! isset($configUrl) ? '"' . $configUrl . '"' : 'null' !!},
|
||||||
|
validatorUrl: {!! isset($validatorUrl) ? '"' . $validatorUrl . '"' : 'null' !!},
|
||||||
|
oauth2RedirectUrl: "{{ route('l5-swagger.'.$documentation.'.oauth2_callback') }}",
|
||||||
|
|
||||||
|
requestInterceptor: function(request) {
|
||||||
|
request.headers['X-CSRF-TOKEN'] = '{{ csrf_token() }}';
|
||||||
|
return request;
|
||||||
|
},
|
||||||
|
|
||||||
|
presets: [
|
||||||
|
SwaggerUIBundle.presets.apis,
|
||||||
|
SwaggerUIStandalonePreset
|
||||||
|
],
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
SwaggerUIBundle.plugins.DownloadUrl
|
||||||
|
],
|
||||||
|
|
||||||
|
layout: "StandaloneLayout"
|
||||||
|
})
|
||||||
|
|
||||||
|
window.ui = ui
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -35,6 +35,8 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
|
|
||||||
Route::resource('invoices', 'InvoiceController'); // name = (invoices. index / create / show / update / destroy / edit
|
Route::resource('invoices', 'InvoiceController'); // name = (invoices. index / create / show / update / destroy / edit
|
||||||
|
|
||||||
|
Route::get('invoices/{invoice}/delivery_note', 'InvoiceController@deliveryNote')->name('invoices.delivery_note');
|
||||||
|
|
||||||
Route::get('invoices/{invoice}/{action}', 'InvoiceController@action')->name('invoices.action');
|
Route::get('invoices/{invoice}/{action}', 'InvoiceController@action')->name('invoices.action');
|
||||||
|
|
||||||
Route::get('invoice/{invitation_key}/download', 'InvoiceController@downloadPdf')->name('invoices.downloadPdf');
|
Route::get('invoice/{invitation_key}/download', 'InvoiceController@downloadPdf')->name('invoices.downloadPdf');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user