mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 07:07:31 -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) | ||||
|     { | ||||
|          | ||||
|         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); | ||||
| 
 | ||||
|         $company = $this->company_repo->save($request->all(), $company); | ||||
|  | ||||
| @ -790,4 +790,57 @@ class InvoiceController extends BaseController | ||||
| 
 | ||||
|         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( | ||||
|  *             name="Attribution Assurance License", | ||||
|  *             url="https://opensource.org/licenses/AAL" | ||||
|  *         ) | ||||
|  *         ), | ||||
|  *     ), | ||||
|  *     @OA\Server( | ||||
|  *         description="Example InvoiceNinja base url", | ||||
|  *         url="https://ninja.test" | ||||
|  *         url="https://ninja.test", | ||||
|  *     ), | ||||
|  *     @OA\ExternalDocumentation( | ||||
|  *         description="http://docs.invoiceninja.com", | ||||
|  *         url="http://docs.invoiceninja.com" | ||||
|  *     ) | ||||
|  * ) | ||||
|  *     ), | ||||
|  * ), | ||||
|  */ | ||||
|  | ||||
| @ -143,6 +143,11 @@ class InvoiceService | ||||
|         return (new GetInvoicePdf($this->invoice, $contact))->run(); | ||||
|     } | ||||
| 
 | ||||
|     public function getInvoiceDeliveryNote($contact = null) | ||||
|     { | ||||
|         //stubbed
 | ||||
|     } | ||||
| 
 | ||||
|     public function sendEmail($contact = null) | ||||
|     { | ||||
|         $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::get('invoices/{invoice}/delivery_note', 'InvoiceController@deliveryNote')->name('invoices.delivery_note'); | ||||
| 
 | ||||
|     Route::get('invoices/{invoice}/{action}', 'InvoiceController@action')->name('invoices.action'); | ||||
| 
 | ||||
|     Route::get('invoice/{invitation_key}/download', 'InvoiceController@downloadPdf')->name('invoices.downloadPdf'); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user