Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Magento feat reviews #640

Merged
merged 14 commits into from
Jun 7, 2024
Merged
52 changes: 52 additions & 0 deletions magento/actions/amasty/submitReview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { AppContext } from "../../mod.ts";
import { SubmitReviewAmastyAPI } from "../../utils/client/types.ts";
import { Ratings as RatingsAPI } from "../../utils/client/types.ts";

export interface Props {
/**
* @title Path of the REST API
*/
path: string;
product_id: number;
customer_id: number;
nickname: string;
title: string;
detail: string;
ratings: Array<Ratings>;
}

interface Ratings {
key: string;
value: string;
}

const loader = async (
props: Props,
_req: Request,
ctx: AppContext
): Promise<SubmitReviewAmastyAPI> => {
const { clientAdmin } = ctx;
const ratings = props.ratings.reduce<RatingsAPI>((acc, rating) => {
acc[`${rating.key}`] = rating.value;
return acc;
}, {});

return await clientAdmin["POST /rest/:reviewUrl"](
{
reviewUrl: props.path.replace(/^\/?(rest\/)?/, ""),
},
{
body: {
product_id: props.product_id,
customer_id: props.customer_id,
nickname: props.nickname,
title: props.title,
detail: props.detail,
ratings,
store_id: `${ctx.storeId}`,
},
}
).then((r) => r.json());
};

export default loader;
33 changes: 33 additions & 0 deletions magento/loaders/product/extensions/amasty/detailsPage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { AppContext } from "../../../../mod.ts";
import extend, { Props } from "../extend.ts";
import { ProductDetailsPage } from "../../../../../commerce/types.ts";
import { ExtensionOf } from "../../../../../website/loaders/extension.ts";

/**
* @title Magento Integration Extension - Details Page
* @description Add extra data to your loader. This may harm performance
*/
const loader =
(
props: Omit<Props, "products">,
req: Request,
ctx: AppContext
): ExtensionOf<ProductDetailsPage | null> =>
async (page: ProductDetailsPage | null) => {
if (!page) {
return page;
}

const products = await extend(
{ products: [page.product], ...props },
req,
ctx
);

return {
...page,
product: products[0],
};
};

export default loader;
62 changes: 62 additions & 0 deletions magento/loaders/product/extensions/extend.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { Product } from "../../../../commerce/types.ts";
import { STALE as DecoStale} from "../../../../utils/fetch.ts";
import { AppContext } from "../../../mod.ts";
import { toReviewAmasty } from "../../../utils/transform.ts";

export interface Props {
reviews?: ExtensionProps;
products: Product[];
}


interface ExtensionProps {
active: boolean;
/**
* @title Path of the REST API
*/
path: string;
}

export const cache = "stale-while-revalidate";

export const cacheKey = (props: Props, req: Request, _ctx: AppContext) => {
return `${req.url}-reviews:${
props.reviews?.active ?? false
}-amastyExtensions`;
};

const reviewsExt = async (
products: Product[],
props: ExtensionProps,
ctx: AppContext
): Promise<Product[]> => {
const STALE = ctx.enableCache ? DecoStale : undefined

const reviews = await Promise.all(
products.map(
async (product) =>
await ctx.clientAdmin["GET /rest/:reviewUrl/:productId"](
{
reviewUrl: sanitizePath(props.path),
productId: product!.productID,
},
STALE
).then((review) => review.json())
)
);

return toReviewAmasty(products, reviews);
};
export default async (
{ products, reviews }: Props,
_req: Request,
ctx: AppContext
): Promise<Product[]> => {
if (reviews?.active) {
return await reviewsExt(products, reviews, ctx);
}

return products;
};

const sanitizePath = (path: string) => path.replace(/^\/?(rest\/)?/, "");
58 changes: 32 additions & 26 deletions magento/manifest.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,26 @@
// This file SHOULD be checked into source version control.
// This file is automatically updated during development when running `dev.ts`.

import * as $$$$$$$$$0 from "./actions/cart/addCoupon.ts";
import * as $$$$$$$$$1 from "./actions/cart/addItem.ts";
import * as $$$$$$$$$2 from "./actions/cart/removeCoupon.ts";
import * as $$$$$$$$$3 from "./actions/cart/removeItem.ts";
import * as $$$$$$$$$4 from "./actions/cart/setSimulation.ts";
import * as $$$$$$$$$5 from "./actions/cart/simulation.ts";
import * as $$$$$$$$$6 from "./actions/cart/updateItem.ts";
import * as $$$$$$$$$7 from "./actions/newsletter/subscribe.ts";
import * as $$$$$$$$$0 from "./actions/amasty/submitReview.ts";
import * as $$$$$$$$$1 from "./actions/cart/addCoupon.ts";
import * as $$$$$$$$$2 from "./actions/cart/addItem.ts";
import * as $$$$$$$$$3 from "./actions/cart/removeCoupon.ts";
import * as $$$$$$$$$4 from "./actions/cart/removeItem.ts";
import * as $$$$$$$$$5 from "./actions/cart/setSimulation.ts";
import * as $$$$$$$$$6 from "./actions/cart/simulation.ts";
import * as $$$$$$$$$7 from "./actions/cart/updateItem.ts";
import * as $$$$$$$$$8 from "./actions/newsletter/subscribe.ts";
import * as $0 from "./functions/requestToPathname.ts";
import * as $$$$0 from "./handlers/sitemap.ts";
import * as $$$0 from "./loaders/cart.ts";
import * as $$$1 from "./loaders/product/detailsPage.ts";
import * as $$$2 from "./loaders/product/getId.ts";
import * as $$$3 from "./loaders/product/list.ts";
import * as $$$4 from "./loaders/product/listingPage.ts";
import * as $$$5 from "./loaders/proxy.ts";
import * as $$$6 from "./loaders/user.ts";
import * as $$$2 from "./loaders/product/extensions/amasty/detailsPage.ts";
import * as $$$3 from "./loaders/product/extensions/extend.ts";
import * as $$$4 from "./loaders/product/getId.ts";
import * as $$$5 from "./loaders/product/list.ts";
import * as $$$6 from "./loaders/product/listingPage.ts";
import * as $$$7 from "./loaders/proxy.ts";
import * as $$$8 from "./loaders/user.ts";

const manifest = {
"functions": {
Expand All @@ -27,24 +30,27 @@ const manifest = {
"loaders": {
"magento/loaders/cart.ts": $$$0,
"magento/loaders/product/detailsPage.ts": $$$1,
"magento/loaders/product/getId.ts": $$$2,
"magento/loaders/product/list.ts": $$$3,
"magento/loaders/product/listingPage.ts": $$$4,
"magento/loaders/proxy.ts": $$$5,
"magento/loaders/user.ts": $$$6,
"magento/loaders/product/extensions/amasty/detailsPage.ts": $$$2,
"magento/loaders/product/extensions/extend.ts": $$$3,
"magento/loaders/product/getId.ts": $$$4,
"magento/loaders/product/list.ts": $$$5,
"magento/loaders/product/listingPage.ts": $$$6,
"magento/loaders/proxy.ts": $$$7,
"magento/loaders/user.ts": $$$8,
},
"handlers": {
"magento/handlers/sitemap.ts": $$$$0,
},
"actions": {
"magento/actions/cart/addCoupon.ts": $$$$$$$$$0,
"magento/actions/cart/addItem.ts": $$$$$$$$$1,
"magento/actions/cart/removeCoupon.ts": $$$$$$$$$2,
"magento/actions/cart/removeItem.ts": $$$$$$$$$3,
"magento/actions/cart/setSimulation.ts": $$$$$$$$$4,
"magento/actions/cart/simulation.ts": $$$$$$$$$5,
"magento/actions/cart/updateItem.ts": $$$$$$$$$6,
"magento/actions/newsletter/subscribe.ts": $$$$$$$$$7,
"magento/actions/amasty/submitReview.ts": $$$$$$$$$0,
"magento/actions/cart/addCoupon.ts": $$$$$$$$$1,
"magento/actions/cart/addItem.ts": $$$$$$$$$2,
"magento/actions/cart/removeCoupon.ts": $$$$$$$$$3,
"magento/actions/cart/removeItem.ts": $$$$$$$$$4,
"magento/actions/cart/setSimulation.ts": $$$$$$$$$5,
"magento/actions/cart/simulation.ts": $$$$$$$$$6,
"magento/actions/cart/updateItem.ts": $$$$$$$$$7,
"magento/actions/newsletter/subscribe.ts": $$$$$$$$$8,
},
"name": "magento",
"baseUrl": import.meta.url,
Expand Down
1 change: 1 addition & 0 deletions magento/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ export default function App(props: Props): App<Manifest, State> {
}),
});


const clientGraphql = createGraphqlClient({
fetcher: fetchSafe,
endpoint: `${baseUrl}/graphql`,
Expand Down
19 changes: 19 additions & 0 deletions magento/utils/client/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ import {
MagentoCategory,
MagentoProduct,
NewsletterData,
ReviewsAmastyAPI,
SetShipping,
ShippingMethod,
SubmitReviewAmastyAPI,
SubmitReviewAmastyBody,
User,
} from "./types.ts";

Expand Down Expand Up @@ -136,4 +139,20 @@ export interface API {
response: [];
body: SetShipping;
}

"GET /rest/:reviewUrl/:productId": {
response: ReviewsAmastyAPI
searchParams: {
reviewUrl: string,
productId: string
};
};

"POST /rest/:reviewUrl": {
response: SubmitReviewAmastyAPI
searchParams: {
reviewUrl: string,
};
body: SubmitReviewAmastyBody
}
}
44 changes: 44 additions & 0 deletions magento/utils/client/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -456,3 +456,47 @@ export interface NewsletterData {
sucess: boolean;
message: string;
}

//Custom Interfaces
export interface ReviewsAmastyAPI {
success: boolean;
message: string;
reviews: ReviewAmasty[];
summary: Summary;
}

export interface ReviewAmasty {
review_id: number;
title: string;
detail: string;
nickname: string;
created_at: string;
verified_buyer: boolean;
review_stars: number;
review_stars_percentage: number;
}

export interface Summary {
reviews_count: number;
}

export interface SubmitReviewAmastyAPI {
success: boolean
message: string
reviews: ReviewAmasty[] | null
summary: Summary | null
}

export interface SubmitReviewAmastyBody {
product_id: number
customer_id: number
store_id: string
nickname: string
title: string
detail: string
ratings: Ratings
}

export interface Ratings {
[key: string]: string
}
3 changes: 3 additions & 0 deletions magento/utils/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,6 @@ export const BASE_CURRENCY_CODE = "base_currency_code";
export const SKU = "sku";
export const MEDIA_GALLERY_ENTRIES = "media_gallery_entries";
export const COUNTRY_ID = "BR";

export const MAX_RATING_VALUE = 5
export const MIN_RATING_VALUE = 1
Loading