| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- import { Args, Mutation, Parent, Query, ResolveProperty, Resolver } from '@nestjs/graphql';
- import {
- AddItemToOrderMutationArgs,
- AddPaymentToOrderMutationArgs,
- AdjustItemQuantityMutationArgs,
- OrderByCodeQueryArgs,
- OrderQueryArgs,
- OrdersQueryArgs,
- Permission,
- RemoveItemFromOrderMutationArgs,
- SetOrderShippingAddressMutationArgs,
- SetOrderShippingMethodMutationArgs,
- ShippingMethodQuote,
- TransitionOrderToStateMutationArgs,
- } from 'shared/generated-types';
- import { PaginatedList } from 'shared/shared-types';
- import { Order } from '../../entity/order/order.entity';
- import { I18nError } from '../../i18n/i18n-error';
- import { OrderState } from '../../service/helpers/order-state-machine/order-state';
- import { AuthService } from '../../service/services/auth.service';
- import { OrderService } from '../../service/services/order.service';
- import { ShippingMethodService } from '../../service/services/shipping-method.service';
- import { IdCodecService } from '../common/id-codec.service';
- import { RequestContext } from '../common/request-context';
- import { Allow } from '../decorators/allow.decorator';
- import { Decode } from '../decorators/decode.decorator';
- import { Ctx } from '../decorators/request-context.decorator';
- @Resolver('Order')
- export class OrderResolver {
- constructor(
- private orderService: OrderService,
- private shippingMethodService: ShippingMethodService,
- private authService: AuthService,
- private idCodecService: IdCodecService,
- ) {}
- @Query()
- @Allow(Permission.ReadOrder)
- orders(@Ctx() ctx: RequestContext, @Args() args: OrdersQueryArgs): Promise<PaginatedList<Order>> {
- return this.orderService.findAll(ctx, args.options || undefined);
- }
- @Query()
- @Allow(Permission.ReadOrder, Permission.Owner)
- async order(@Ctx() ctx: RequestContext, @Args() args: OrderQueryArgs): Promise<Order | undefined> {
- const order = await this.orderService.findOne(ctx, args.id);
- if (order && ctx.authorizedAsOwnerOnly) {
- if (ctx.session && ctx.session.activeOrder && ctx.session.activeOrder.id === order.id) {
- return order;
- } else {
- return;
- }
- }
- return order;
- }
- @ResolveProperty()
- async payments(@Parent() order: Order) {
- const orderId = this.idCodecService.decode(order.id);
- return this.orderService.getOrderPayments(orderId);
- }
- @ResolveProperty()
- async shippingMethod(@Parent() order: Order) {
- if (order.shippingMethodId) {
- // Does not need to be decoded because it is an internal property
- // which is never exposed to the outside world.
- const shippingMethodId = order.shippingMethodId;
- return this.shippingMethodService.findOne(shippingMethodId);
- } else {
- return null;
- }
- }
- @Query()
- @Allow(Permission.Owner)
- async activeOrder(@Ctx() ctx: RequestContext): Promise<Order | undefined> {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx);
- if (sessionOrder) {
- return this.orderService.findOne(ctx, sessionOrder.id);
- } else {
- return;
- }
- }
- }
- @Query()
- @Allow(Permission.Owner)
- async orderByCode(
- @Ctx() ctx: RequestContext,
- @Args() args: OrderByCodeQueryArgs,
- ): Promise<Order | undefined> {
- if (ctx.authorizedAsOwnerOnly) {
- const order = await this.orderService.findOneByCode(ctx, args.code);
- if (order && order.customer.user && order.customer.user.id === ctx.activeUserId) {
- return this.orderService.findOne(ctx, order.id);
- } else {
- throw new I18nError(`error.forbidden`);
- }
- }
- }
- @Mutation()
- @Allow(Permission.Owner)
- async setOrderShippingAddress(
- @Ctx() ctx: RequestContext,
- @Args() args: SetOrderShippingAddressMutationArgs,
- ): Promise<Order | undefined> {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx);
- if (sessionOrder) {
- return this.orderService.setShippingAddress(ctx, sessionOrder.id, args.input);
- } else {
- return;
- }
- }
- }
- @Query()
- @Allow(Permission.Owner)
- async eligibleShippingMethods(@Ctx() ctx: RequestContext): Promise<ShippingMethodQuote[]> {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx);
- if (sessionOrder) {
- return this.orderService.getEligibleShippingMethods(ctx, sessionOrder.id);
- }
- }
- return [];
- }
- @Mutation()
- @Allow(Permission.Owner)
- @Decode('shippingMethodId')
- async setOrderShippingMethod(
- @Ctx() ctx: RequestContext,
- @Args() args: SetOrderShippingMethodMutationArgs,
- ): Promise<Order | undefined> {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx);
- if (sessionOrder) {
- return this.orderService.setShippingMethod(ctx, sessionOrder.id, args.shippingMethodId);
- }
- }
- }
- @Query()
- @Allow(Permission.Owner)
- async nextOrderStates(@Ctx() ctx: RequestContext): Promise<string[]> {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx, true);
- return this.orderService.getNextOrderStates(sessionOrder);
- }
- return [];
- }
- @Mutation()
- @Allow(Permission.Owner)
- async transitionOrderToState(
- @Ctx() ctx: RequestContext,
- @Args() args: TransitionOrderToStateMutationArgs,
- ): Promise<Order | undefined> {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx, true);
- return this.orderService.transitionToState(ctx, sessionOrder.id, args.state as OrderState);
- }
- }
- @Mutation()
- @Allow(Permission.UpdateOrder, Permission.Owner)
- @Decode('productVariantId')
- async addItemToOrder(
- @Ctx() ctx: RequestContext,
- @Args() args: AddItemToOrderMutationArgs,
- ): Promise<Order> {
- const order = await this.getOrderFromContext(ctx, true);
- return this.orderService.addItemToOrder(ctx, order.id, args.productVariantId, args.quantity);
- }
- @Mutation()
- @Allow(Permission.UpdateOrder, Permission.Owner)
- @Decode('orderItemId')
- async adjustItemQuantity(
- @Ctx() ctx: RequestContext,
- @Args() args: AdjustItemQuantityMutationArgs,
- ): Promise<Order> {
- const order = await this.getOrderFromContext(ctx, true);
- return this.orderService.adjustItemQuantity(ctx, order.id, args.orderItemId, args.quantity);
- }
- @Mutation()
- @Allow(Permission.UpdateOrder, Permission.Owner)
- @Decode('orderItemId')
- async removeItemFromOrder(
- @Ctx() ctx: RequestContext,
- @Args() args: RemoveItemFromOrderMutationArgs,
- ): Promise<Order> {
- const order = await this.getOrderFromContext(ctx, true);
- return this.orderService.removeItemFromOrder(ctx, order.id, args.orderItemId);
- }
- @Mutation()
- @Allow(Permission.UpdateOrder, Permission.Owner)
- async addPaymentToOrder(@Ctx() ctx: RequestContext, @Args() args: AddPaymentToOrderMutationArgs) {
- if (ctx.authorizedAsOwnerOnly) {
- const sessionOrder = await this.getOrderFromContext(ctx);
- if (sessionOrder) {
- const order = await this.orderService.addPaymentToOrder(ctx, sessionOrder.id, args.input);
- if (
- order.active === false &&
- ctx.session &&
- ctx.session.activeOrder &&
- ctx.session.activeOrder.id === sessionOrder.id
- ) {
- await this.authService.unsetActiveOrder(ctx.session);
- }
- return order;
- }
- }
- }
- private async getOrderFromContext(ctx: RequestContext): Promise<Order | undefined>;
- private async getOrderFromContext(ctx: RequestContext, createIfNotExists: true): Promise<Order>;
- private async getOrderFromContext(
- ctx: RequestContext,
- createIfNotExists = false,
- ): Promise<Order | undefined> {
- if (!ctx.session) {
- throw new I18nError(`error.no-active-session`);
- }
- let order = ctx.session.activeOrder;
- if (!order) {
- if (ctx.activeUserId) {
- order = (await this.orderService.getActiveOrderForUser(ctx, ctx.activeUserId)) || null;
- }
- if (!order && createIfNotExists) {
- order = await this.orderService.create(ctx.activeUserId);
- }
- if (order) {
- await this.authService.setActiveOrder(ctx.session, order);
- }
- }
- return order || undefined;
- }
- }
|