import { CardList } from "docs-ui"

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

# {metadata.title}

Medusa's architectural functionalities, such as emitting and subscribing to events or caching data, are all implemented in Infrastructure Modules. An Infrastructure 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 in [the Architecture documentation](!docs!/learn/introduction/architecture).

This section of the documentation showcases Medusa's Infrastructure Modules, how they work, and how to use them in your Medusa application.

## Cache Module

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 Cache 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: "/infrastructure-modules/cache/in-memory",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "Redis",
      href: "/infrastructure-modules/cache/redis",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>

---

## Event Module

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 Event 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: "/infrastructure-modules/event/local",
      badge: {
        variant: "neutral",
        children: "For Development"
      }
    },
    {
      title: "Redis",
      href: "/infrastructure-modules/event/redis",
      badge: {
        variant: "green",
        children: "For Production"
      }
    }
  ]}
/>

---

## File Module

The File Module handles file upload and storage of assets, such as product images. Refer to the [File Module documentation](./file/page.mdx) to learn more about it.

The File Module has module providers that implement the underlying logic of handling uploads and downloads of assets, such as integrating third-party services. The following File Module Providers are provided by Medusa. You can also create a custom provider as explained in the [Create File Module Provider guide](/references/file-provider-module).

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

---

## Locking Module

The Locking Module manages access to shared resources by multiple processes or threads. It prevents conflicts between processes and ensures data consistency. Refer to the [Locking Module documentation](./locking/page.mdx) to learn more about it.

The Locking Module uses module providers that implement the underlying logic of the locking mechanism. The following Locking Module Providers are provided by Medusa. You can also create a custom provider as explained in the [Create Locking Module Provider guide](/references/locking-provider-module).

<CardList
  items={[
    {
      title: "Redis",
      href: "/infrastructure-modules/locking/redis",
      badge: {
        variant: "green",
        children: "Recommended"
      }
    },
    {
      title: "PostgreSQL",
      href: "/infrastructure-modules/locking/postgres",
    }
  ]}
/>

---

## Notification Module

The Notification Module handles sending notifications to users or customers, such as reset password instructions or newsletters. Refer to the [Notifcation Module documentation](./notification/page.mdx) to learn more about it.

The Notification Module has module providers that implement the underlying logic of sending notifications, typically through integrating a third-party service. The following modules are provided by Medusa. You can also create a custom provider as explained in the [Create Notification Module Provider guide](/references/notification-provider-module).

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

### Notification Module Provider Guides

<CardList
  items={[
    {
      title: "Send Notification",
      href: "/infrastructure-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 Module

A Workflow Engine Module handles tracking and recording the transactions and statuses of workflows and their steps. Learn more about it in the [Worklow Engine Module documentation](./workflow-engine/page.mdx).

The following Workflow Engine modules are provided by Medusa.

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