# Response Builders

# What are the available response builders?

## Storefront

Listed below are all the storefront response builders, the vast majority are view page responses or cart action responses:

- `Aero\Store\Http\Responses\AccountOverviewPage`
- `Aero\Store\Http\Response\CartDiscountCodeApply`
- `Aero\Store\Http\Response\CartDiscountCodeRemove`
- `Aero\Store\Http\Response\CartEmpty`
- `Aero\Store\Http\Response\CartItemAdd`
- `Aero\Store\Http\Response\CartItemUpdate`
- `Aero\Store\Http\Response\CartPage`
- `Aero\Store\Http\Response\Error404Page`
- `Aero\Store\Http\Response\FormSubmit`
- `Aero\Store\Http\Response\Homepage`
- `Aero\Store\Http\Response\InformationPage`
- `Aero\Store\Http\Response\ListingsJson`
- `Aero\Store\Http\Response\ListingsPage`
- `Aero\Store\Http\Response\ProductPage`
- `Aero\Store\Http\Response\SearchJson`
- `Aero\Store\Http\Response\SearchPage`

## Admin

Listed below are all the admin response builders, the vast majority are create/edit page responses or store/update responses:

### General

- `Aero\Admin\Http\Responses\RedirectBuyableToEdit`

### Dashboard

- `Aero\Admin\Http\Responses\AdminDashboardPage`

### Catalog Management

- `Aero\Admin\Http\Responses\Catalog\AdminAttributeGroupCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminAttributeGroupEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminAttributeGroupStore`
- `Aero\Admin\Http\Responses\Catalog\AdminAttributeGroupUpdate`
- `Aero\Admin\Http\Responses\Catalog\AdminCategoryCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminCategoryEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminCategoryStore`
- `Aero\Admin\Http\Responses\Catalog\AdminCategoryUpdate`
- `Aero\Admin\Http\Responses\Catalog\AdminCollectionCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminCollectionEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminCollectionStore`
- `Aero\Admin\Http\Responses\Catalog\AdminCollectionUpdate`
- `Aero\Admin\Http\Responses\Catalog\AdminFetchVariantsForProduct`
- `Aero\Admin\Http\Responses\Catalog\AdminManufacturerCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminManufacturerEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminManufacturerStore`
- `Aero\Admin\Http\Responses\Catalog\AdminManufacturerUpdate`
- `Aero\Admin\Http\Responses\Catalog\AdminProductCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminProductEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminProductStore`
- `Aero\Admin\Http\Responses\Catalog\AdminProductUpdate`
- `Aero\Admin\Http\Responses\Catalog\AdminProductTypeCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminProductTypeEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminProductTypeStore`
- `Aero\Admin\Http\Responses\Catalog\AdminProductTypeUpdate`
- `Aero\Admin\Http\Responses\Catalog\AdminTagGroupsCreatePage`
- `Aero\Admin\Http\Responses\Catalog\AdminTagGroupsEditPage`
- `Aero\Admin\Http\Responses\Catalog\AdminTagGroupsStore`
- `Aero\Admin\Http\Responses\Catalog\AdminTagGroupsUpdate`

### Content Management

- `Aero\Admin\Http\Responses\Content\AdminCombinationCreatePage`
- `Aero\Admin\Http\Responses\Content\AdminCombinationEditPage`
- `Aero\Admin\Http\Responses\Content\AdminCombinationStore`
- `Aero\Admin\Http\Responses\Content\AdminCombinationUpdate`
- `Aero\Admin\Http\Responses\Content\AdminPageCreatePage`
- `Aero\Admin\Http\Responses\Content\AdminPageEditPage`
- `Aero\Admin\Http\Responses\Content\AdminPageStore`
- `Aero\Admin\Http\Responses\Content\AdminPageUpdate`

### Customer Management

- `Aero\Admin\Http\Responses\Customers\AdminCustomerCreatePage`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerEditPage`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerStore`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerUpdate`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerGroupCreatePage`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerGroupEditPage`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerGroupStore`
- `Aero\Admin\Http\Responses\Customers\AdminCustomerGroupUpdate`

### Discount Management

- `Aero\Admin\Http\Responses\Discounts\AdminDiscountCreatePage`
- `Aero\Admin\Http\Responses\Discounts\AdminDiscountEditPage`
- `Aero\Admin\Http\Responses\Discounts\AdminDiscountStore`
- `Aero\Admin\Http\Responses\Discounts\AdminDiscountUpdate`
- `Aero\Admin\Http\Responses\Discounts\AdminVoucherCreatePage`
- `Aero\Admin\Http\Responses\Discounts\AdminVoucherEditPage`
- `Aero\Admin\Http\Responses\Discounts\AdminVoucherStore`
- `Aero\Admin\Http\Responses\Discounts\AdminVoucherUpdate`

### Order Management

- `Aero\Admin\Http\Responses\Orders\AdminOrderCreatePage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderCreateStore`
- `Aero\Admin\Http\Responses\Orders\AdminOrderViewPage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderEditPage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdate`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdateBillingAddress`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdateCustomer`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdateDiscount`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdateShippingMethod`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdateShippingAddress`
- `Aero\Admin\Http\Responses\Orders\AdminOrderUpdateFlags`
- `Aero\Admin\Http\Responses\Orders\AdminOrderFulfillmentCreatePage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderFulfillmentEditPage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderFulfillmentStore`
- `Aero\Admin\Http\Responses\Orders\AdminOrderFulfillmentUpdate`
- `Aero\Admin\Http\Responses\Orders\AdminOrderFulfillmentCancel`
- `Aero\Admin\Http\Responses\Orders\AdminOrderPaymentPage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderPaymentStore`
- `Aero\Admin\Http\Responses\Orders\AdminOrderReturnCreatePage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderReturnStore`
- `Aero\Admin\Http\Responses\Orders\AdminOrderShippingPage`
- `Aero\Admin\Http\Responses\Orders\AdminOrderShippingStore`
- `Aero\Admin\Http\Responses\Orders\AdminOrderItemUpdateFlags`

### Two Factor Authentication

- `Aero\Admin\Http\Responses\TwoFactorAuthentication\FailedTwoFactorAuthenticationResponse`
- `Aero\Admin\Http\Responses\TwoFactorAuthentication\PassedTwoFactorAuthenticationResponse`
- `Aero\Admin\Http\Responses\TwoFactorAuthentication\RecoveryCodesGeneratedResponse`
- `Aero\Admin\Http\Responses\TwoFactorAuthentication\TwoFactorConfirmedResponse`
- `Aero\Admin\Http\Responses\TwoFactorAuthentication\TwoFactorDisabledResponse`
- `Aero\Admin\Http\Responses\TwoFactorAuthentication\TwoFactorEnabledResponse`

### Configuration

- `Aero\Admin\Http\Responses\Configuration\AdminFulfillmentMethodCreatePage`
- `Aero\Admin\Http\Responses\Configuration\AdminFulfillmentMethodEditPage`
- `Aero\Admin\Http\Responses\Configuration\AdminFulfillmentMethodStore`
- `Aero\Admin\Http\Responses\Configuration\AdminFulfillmentMethodUpdate`
- `Aero\Admin\Http\Responses\Configuration\AdminLocationCreatePage`
- `Aero\Admin\Http\Responses\Configuration\AdminLocationEditPage`
- `Aero\Admin\Http\Responses\Configuration\AdminLocationStore`
- `Aero\Admin\Http\Responses\Configuration\AdminLocationUpdate`
- `Aero\Admin\Http\Responses\Configuration\AdminMailCreatePage`
- `Aero\Admin\Http\Responses\Configuration\AdminMailEditPage`
- `Aero\Admin\Http\Responses\Configuration\AdminMailStore`
- `Aero\Admin\Http\Responses\Configuration\AdminMailUpdate`
- `Aero\Admin\Http\Responses\Configuration\AdminShippingMethodCreatePage`
- `Aero\Admin\Http\Responses\Configuration\AdminShippingMethodEditPage`
- `Aero\Admin\Http\Responses\Configuration\AdminShippingMethodStore`
- `Aero\Admin\Http\Responses\Configuration\AdminShippingMethodUpdate`
- `Aero\Admin\Http\Responses\Configuration\AdminUserCreatePage`
- `Aero\Admin\Http\Responses\Configuration\AdminUserEditPage`
- `Aero\Admin\Http\Responses\Configuration\AdminUserStore`
- `Aero\Admin\Http\Responses\Configuration\AdminUserUpdate`

## Checkout

Listed below are all the checkout response builders:

- `Aero\Checkout\Http\Responses\CheckoutBillingAddressSet`
- `Aero\Checkout\Http\Responses\CheckoutCustomerLogin`
- `Aero\Checkout\Http\Responses\CheckoutCustomerPage`
- `Aero\Checkout\Http\Responses\CheckoutCustomerSet`
- `Aero\Checkout\Http\Responses\CheckoutDiscountCodeApply`
- `Aero\Checkout\Http\Responses\CheckoutDiscountCodeRemove`
- `Aero\Checkout\Http\Responses\CheckoutExpressComplete`
- `Aero\Checkout\Http\Responses\CheckoutExpressPage`
- `Aero\Checkout\Http\Responses\CheckoutGuestConvert`
- `Aero\Checkout\Http\Responses\CheckoutIframeFail`
- `Aero\Checkout\Http\Responses\CheckoutIframeSuccess`
- `Aero\Checkout\Http\Responses\CheckoutOrderConfirmationPage`
- `Aero\Checkout\Http\Responses\CheckoutPaymentComplete`
- `Aero\Checkout\Http\Responses\CheckoutPaymentPage`
- `Aero\Checkout\Http\Responses\CheckoutPaymentSet`
- `Aero\Checkout\Http\Responses\CheckoutRedirectToStep`
- `Aero\Checkout\Http\Responses\CheckoutShippingAddressSet`
- `Aero\Checkout\Http\Responses\CheckoutShippingPage`
- `Aero\Checkout\Http\Responses\CheckoutShippingSet`
- `Aero\Checkout\Http\Responses\CheckoutSuccess`

## Account Area

Listed below are all the account area response builders:

- `Aero\AccountArea\Http\Responses\AccountAddressDelete`
- `Aero\AccountArea\Http\Responses\AccountAddressNewPage`
- `Aero\AccountArea\Http\Responses\AccountAddressNewSet`
- `Aero\AccountArea\Http\Responses\AccountAddressEditPage`
- `Aero\AccountArea\Http\Responses\AccountAddressEditSet`
- `Aero\AccountArea\Http\Responses\AddressesPage`
- `Aero\AccountArea\Http\Responses\AddressMakeDefaultSet`
- `Aero\AccountArea\Http\Responses\AccountDetailsPage`
- `Aero\AccountArea\Http\Responses\AccountDetailsSet`
- `Aero\AccountArea\Http\Responses\AccountInvoicePage`
- `Aero\AccountArea\Http\Responses\AccountLoginPage`
- `Aero\AccountArea\Http\Responses\AccountLoginSet`
- `Aero\AccountArea\Http\Responses\AccountLogoutSet`
- `Aero\AccountArea\Http\Responses\AccountOrdersPage`
- `Aero\AccountArea\Http\Responses\AccountOrderViewPage`
- `Aero\AccountArea\Http\Responses\AccountOverviewPage`
- `Aero\AccountArea\Http\Responses\AccountPasswordForgotPage`
- `Aero\AccountArea\Http\Responses\AccountPasswordForgotSet`
- `Aero\AccountArea\Http\Responses\AccountPasswordResetPage`
- `Aero\AccountArea\Http\Responses\AccountPasswordResetSet`
- `Aero\AccountArea\Http\Responses\AccountRegisterPage`
- `Aero\AccountArea\Http\Responses\AccountRegisterSet`
- `Aero\AccountArea\Http\Responses\AccountSubscriptionCancelSet`
- `Aero\AccountArea\Http\Responses\AccountSubscriptionSkipSet`
- `Aero\AccountArea\Http\Responses\AccountSubscriptionsPage`
- `Aero\AccountArea\Http\Responses\AccountSubscriptionsViewPage`
- `Aero\AccountArea\Http\Responses\AccountSubscriptionTogglePauseSet`

# How do I pass data to a response?

The most common task performed when extending responses, is setting additional data. Typically, for HTML responses that render from a view, this involves sending data to the view to be used as a variable. If the response returns JSON, it may be adding additional key/value pairs.

For example, if you needed to obtain customer reviews for a given product and output them on the product page, you could do the following, which passes a product to a 3rd party reviews API and then adds the reviews it returns to the response data, which is then passed to the `product.twig` view file ready to be loop around and outputted:

```php
\Aero\Store\Http\Responses\ProductPage::extend(function (\Aero\Store\Http\Responses\ProductPage $page, \Closure $next) {
    $reviews = ReviewsAPI::forProduct($page->product);

    $page->setData('reviews', $reviews);

    return $next($page);
});
```

Another example is getting the latest 5 blog posts from a blog module and sending them to the homepage to be displayed:

```php
\Aero\Store\Http\Responses\Homepage::extend(function (\Aero\Store\Http\Responses\ProductPage $page, \Closure $next) {
    $posts = \Acme\BlogPosts::latest()->limit(5)->get();

    $page->setData('posts', $posts);

    return $next($page);
});
```

<p class="callout info">You can obtain the existing data set against the response builder using the `getData()` method.</p>

<p class="callout info">You can remove existing data set against the response builder using the `removeData()` method.</p>

# How do I redirect a response?

Sometimes you may wish to redirect the user to another location, either to an external site or within the store. To do so, pass the URL, `route()`, or an `Illuminate\Http\RedirectResponse` instance to the `setRedirect()` method.

For example, if you stored the age of customers (computed from their provided date of birth), and needed to prevent access to those under the age of 18:

```php
\Aero\Store\Http\Responses\ProductPage::extend(function (\Aero\Store\Http\Responses\ProductPage $page, \Closure $next) {
    if ($page->request->customer()->age < 18) {
        $page->setRedirect('/denied');
    }

    return $next($page);
});
```

As extension code is evaluated in the order it's added to the response builder, code that runs after this step may override the redirect.

To force a redirect and prevent execution of the code that follows in the pipeline, you should return an instance of the `redirect()` helper:

```php
\Aero\Store\Http\Responses\ProductPage::extend(function (\Aero\Store\Http\Responses\ProductPage $page, \Closure $next) {
    if (! $page->product->canBeViewedByIp($page->request->ip())) {
        return redirect('/denied');
    }

    return $next($page);
});
```

# How do I set the response status code?

There may be situations where the HTTP response status needs to be altered. By default, the returned status is `200`, however, this can be changed by passing the new status code to the `setStatus()` method:

```php
\Aero\Store\Http\Responses\ProductPage::extend(function (\Aero\Store\Http\Responses\ProductPage $page, \Closure $next) {
    $page->setStatus(403);

    return $next($page);
});
```

# How do I set response headers?

When extending the response builder, you can set HTTP headers to be sent with the response:

```php
\Aero\Store\Http\Responses\ProductPage::extend(function ($page) {
    $page->setHeader('foo', 'bar');
});
```

# How do I attach middleware to a response builder?

Since Aero does not expose the underlying routes and controllers, middleware can be attached directly to the response builder. This allows for code to be executed before the main pipeline is run.

For example, to restrict all products from being accessible to guest visitors, you could register the `auth` middleware to the `ProductPage` response:

```php
\Aero\Store\Http\Responses\ProductPage::middleware('auth');
```

When assigning middleware, you can also pass the fully qualified class name:

```php
\Aero\Store\Http\Responses\ProductPage::middleware(\App\Http\Middleware\CheckAge::class);
```

Alternatively, you can provide a `Closure`.

For example, middleware could be added to the homepage to set a tracking cookie from the referrer:

```php
\Aero\Store\Http\Responses\Homepage::middleware(function (\Illuminate\Http\Request $request, \Closure $next) {
    return tap($next($request), function ($response) use ($request) {
        $response->cookie('referer', $request->header('Referer'));
    });
});
```

Refer to the [Laravel documentation](https://laravel.com/docs/8.x/middleware) for more information on middleware.

# How do I change the response view?

For responses that return HTML, a Twig view file is used. Whilst these are originally defined, the view can be changed. For example, to change the product page view based on product data:

```php
\Aero\Store\Http\Responses\ProductPage::extend(function (\Aero\Store\Http\Responses\ProductPage $page, \Closure $next) {
    if ($view = $page->product->additional('view')) {
        $page->setView($view);
    }

    return $next($page);
});
```

<p class="callout info">Setting the view to `null` will result in a JSON response.</p>

<p class="callout info">You can get the current view for a response using `getView()`.</p>