mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 03:17:32 -04:00 
			
		
		
		
	Download purchase order PDF from API
This commit is contained in:
		
							parent
							
								
									83def1f297
								
							
						
					
					
						commit
						a69eae2f66
					
				| @ -762,4 +762,74 @@ class PurchaseOrderController extends BaseController | |||||||
| 
 | 
 | ||||||
|     }  |     }  | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @OA\Get( | ||||||
|  |      *      path="/api/v1/purchase_order/{invitation_key}/download", | ||||||
|  |      *      operationId="downloadPurchaseOrder", | ||||||
|  |      *      tags={"purchase_orders"}, | ||||||
|  |      *      summary="Download a specific purchase order by invitation key", | ||||||
|  |      *      description="Downloads a specific purchase order", | ||||||
|  |      *      @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="invitation_key", | ||||||
|  |      *          in="path", | ||||||
|  |      *          description="The Purchase Order Invitation Key", | ||||||
|  |      *          example="D2J234DFA", | ||||||
|  |      *          required=true, | ||||||
|  |      *          @OA\Schema( | ||||||
|  |      *              type="string", | ||||||
|  |      *              format="string", | ||||||
|  |      *          ), | ||||||
|  |      *      ), | ||||||
|  |      *      @OA\Response( | ||||||
|  |      *          response=200, | ||||||
|  |      *          description="Returns the Purchase Order 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 $invitation_key | ||||||
|  |      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse | ||||||
|  |      */ | ||||||
|  |     public function downloadPdf($invitation_key) | ||||||
|  |     { | ||||||
|  |         $invitation = $this->purchase_order_repository->getInvitationByKey($invitation_key); | ||||||
|  | 
 | ||||||
|  |         if (! $invitation) { | ||||||
|  |             return response()->json(['message' => 'no record found'], 400); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $purchase_order = $invitation->purchase_order; | ||||||
|  | 
 | ||||||
|  |         $file = $purchase_order->service()->getPurchaseOrderPdf(); | ||||||
|  | 
 | ||||||
|  |         $headers = ['Content-Type' => 'application/pdf']; | ||||||
|  | 
 | ||||||
|  |         if (request()->input('inline') == 'true') { | ||||||
|  |             $headers = array_merge($headers, ['Content-Disposition' => 'inline']); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return response()->streamDownload(function () use ($file) { | ||||||
|  |             echo Storage::get($file); | ||||||
|  |         }, basename($file), $headers); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -242,6 +242,12 @@ Route::group(['middleware' => ['throttle:300,1', 'api_db', 'token_auth', 'locale | |||||||
|     Route::post('projects/bulk', [ProjectController::class, 'bulk'])->name('projects.bulk'); |     Route::post('projects/bulk', [ProjectController::class, 'bulk'])->name('projects.bulk'); | ||||||
|     Route::put('projects/{project}/upload', [ProjectController::class, 'upload'])->name('projects.upload'); |     Route::put('projects/{project}/upload', [ProjectController::class, 'upload'])->name('projects.upload'); | ||||||
| 
 | 
 | ||||||
|  |     Route::resource('purchase_orders', PurchaseOrderController::class); | ||||||
|  |     Route::post('purchase_orders/bulk', [PurchaseOrderController::class, 'bulk'])->name('purchase_orders.bulk'); | ||||||
|  |     Route::put('purchase_orders/{purchase_order}/upload', [PurchaseOrderController::class, 'upload']); | ||||||
|  |     Route::get('purchase_orders/{purchase_order}/{action}', [PurchaseOrderController::class, 'action'])->name('purchase_orders.action'); | ||||||
|  |     Route::get('purchase_order/{invitation_key}/download', [PurchaseOrderController::class, 'downloadPdf'])->name('purchase_orders.downloadPdf'); | ||||||
|  | 
 | ||||||
|     Route::resource('quotes', QuoteController::class); // name = (quotes. index / create / show / update / destroy / edit
 |     Route::resource('quotes', QuoteController::class); // name = (quotes. index / create / show / update / destroy / edit
 | ||||||
|     Route::get('quotes/{quote}/{action}', [QuoteController::class, 'action'])->name('quotes.action'); |     Route::get('quotes/{quote}/{action}', [QuoteController::class, 'action'])->name('quotes.action'); | ||||||
|     Route::post('quotes/bulk', [QuoteController::class, 'bulk'])->name('quotes.bulk'); |     Route::post('quotes/bulk', [QuoteController::class, 'bulk'])->name('quotes.bulk'); | ||||||
| @ -316,12 +322,6 @@ Route::group(['middleware' => ['throttle:300,1', 'api_db', 'token_auth', 'locale | |||||||
|     Route::post('vendors/bulk', [VendorController::class, 'bulk'])->name('vendors.bulk'); |     Route::post('vendors/bulk', [VendorController::class, 'bulk'])->name('vendors.bulk'); | ||||||
|     Route::put('vendors/{vendor}/upload', [VendorController::class, 'upload']); |     Route::put('vendors/{vendor}/upload', [VendorController::class, 'upload']); | ||||||
| 
 | 
 | ||||||
|     Route::resource('purchase_orders', PurchaseOrderController::class); |  | ||||||
|     Route::post('purchase_orders/bulk', [PurchaseOrderController::class, 'bulk'])->name('purchase_orders.bulk'); |  | ||||||
|     Route::put('purchase_orders/{purchase_order}/upload', [PurchaseOrderController::class, 'upload']); |  | ||||||
| 
 |  | ||||||
|     Route::get('purchase_orders/{purchase_order}/{action}', [PurchaseOrderController::class, 'action'])->name('purchase_orders.action'); |  | ||||||
| 
 |  | ||||||
|     Route::get('users', [UserController::class, 'index']); |     Route::get('users', [UserController::class, 'index']); | ||||||
|     Route::get('users/create', [UserController::class, 'create'])->middleware('password_protected'); |     Route::get('users/create', [UserController::class, 'create'])->middleware('password_protected'); | ||||||
|     Route::get('users/{user}', [UserController::class, 'show'])->middleware('password_protected'); |     Route::get('users/{user}', [UserController::class, 'show'])->middleware('password_protected'); | ||||||
|  | |||||||
| @ -40,6 +40,21 @@ class PurchaseOrderTest extends TestCase | |||||||
|         $this->makeTestData(); |         $this->makeTestData(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public function testPurchaseOrderDownloadPDF() | ||||||
|  |     { | ||||||
|  |         $i = $this->purchase_order->invitations->first(); | ||||||
|  | 
 | ||||||
|  |         $response = $this->withHeaders([ | ||||||
|  |             'X-API-SECRET' => config('ninja.api_secret'), | ||||||
|  |             'X-API-TOKEN' => $this->token, | ||||||
|  |         ])->get("/api/v1/purchase_order/{$i->key}/download"); | ||||||
|  | 
 | ||||||
|  |         $response->assertStatus(200); | ||||||
|  |         $this->assertTrue($response->headers->get('content-type') == 'application/pdf'); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     public function testPurchaseOrderGetWithClientStatus() |     public function testPurchaseOrderGetWithClientStatus() | ||||||
|     { |     { | ||||||
|         $response = $this->withHeaders([ |         $response = $this->withHeaders([ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user