import { CardList } from "docs-ui"

export const metadata = {
  title: `Architectural Modules`,
}

# {metadata.title}

Medusa's architectural functionalities, such as emitting and subscribing to events or caching data, are all implemented in architectural modules. An architectural module is a package that can be installed and used in any Medusa application. These modules allow you to choose and integrate custom services for architectural purposes.

For example, you can use our [Redis Event Module](./event/redis/page.mdx) to handle event functionalities, or create a custom module that implements these functionalities with Memcached. Learn more about Medusa's architecture in [this documentation](!docs!/learn/introduction/architecture).

This section of the documentation showcases official architectural modules and how to configure them in your application.

## Cache Modules

A Cache Module is used to cache the results of computations such as price selection or various tax calculations. Learn more in [this documentation](./cache/page.mdx).

The following modules are provided by Medusa. You can also create your own cache module as explained in [this guide](./cache/create/page.mdx).

<CardList
  items={[
    {
      title: "In-Memory",
      href: "/architectural-modules/cache/in-memory",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "Redis",
      href: "/architectural-modules/cache/redis",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>

---

## Event Modules

An Event Module implements the underlying publish/subscribe system that handles queueing events, emitting them, and executing their subscribers.  Learn more in [this documentation](./event/page.mdx).

The following modules are provided by Medusa. You can also create your own event module as explained in [this guide](./event/create/page.mdx).

<CardList
  items={[
    {
      title: "Local",
      href: "/architectural-modules/event/local",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "Redis",
      href: "/architectural-modules/event/redis",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>

---

## File Module Providers

A file module provider implements the logic of handling uploads and downloads of assets, such as integrating third-party services. Learn more in [this documentation](./file/page.mdx).

The following modules are provided by Medusa. You can also create your own file module as explained in [this guide](/references/file-provider-module).

<CardList
  items={[
    {
      title: "Local",
      href: "/architectural-modules/file/local",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "AWS S3 (and Compatible APIs)",
      href: "/architectural-modules/file/s3",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>

---

## Notification Module Providers

A notification module provider implements the logic of sending notifications, typically through integrating a third-party service. Learn more in [this documentation](./notification/page.mdx).

The following modules are provided by Medusa. You can also create your own file module as explained in [this guide](/references/notification-provider-module).

<CardList
  items={[
    {
      title: "Local",
      href: "/architectural-modules/notification/local",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "SendGrid",
      href: "/architectural-modules/notification/sendgrid",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>

### Notification Module Provider Guides

<CardList
  items={[
    {
      title: "Send Notification",
      href: "/architectural-modules/notification/send-notification"
    },
    {
      title: "Create Notification Provider",
      href: "/references/notification-provider-module"
    },
    {
      title: "Resend",
      href: "/integrations/guides/resend",
      badge: {
        variant: "blue",
        children: "Integration"
      }
    }
  ]}
/>

---

## Workflow Engine Modules

Workflow engine modules handle tracking and recording the transactions and statuses of workflows and their steps. Learn more in [this documentation](./workflow-engine/page.mdx).

The following modules are provided by Medusa.

<CardList
  items={[
    {
      title: "In-Memory",
      href: "/architectural-modules/workflow-engine/in-memory",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "Redis",
      href: "/architectural-modules/workflow-engine/redis",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>
