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

feat(medusa, stock-location, inventory): Allow modules to integrate with core #2997

Merged
merged 21 commits into from
Jan 13, 2023
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
98cbc1b
chore: module shared resources
carlos-r-l-rodrigues Jan 11, 2023
9f23db1
Merge branch 'develop' into chore/module-share-resources
carlos-r-l-rodrigues Jan 11, 2023
fb2b2d1
Limit module to use only as shared
carlos-r-l-rodrigues Jan 11, 2023
b4ff7f8
Merge branch 'chore/module-share-resources' of github.com:medusajs/me…
carlos-r-l-rodrigues Jan 11, 2023
d36ac4c
Merge branch 'develop' into chore/module-share-resources
carlos-r-l-rodrigues Jan 11, 2023
3b5a5e6
addressing comments
carlos-r-l-rodrigues Jan 12, 2023
f9c15e0
Merge branch 'chore/module-share-resources' of github.com:medusajs/me…
carlos-r-l-rodrigues Jan 12, 2023
2f73bdf
Merge branch 'develop' into chore/module-share-resources
carlos-r-l-rodrigues Jan 12, 2023
d94330e
fix: findOne param
carlos-r-l-rodrigues Jan 13, 2023
4b0a373
Merge branch 'chore/module-share-resources' of github.com:medusajs/me…
carlos-r-l-rodrigues Jan 13, 2023
f7ae4c3
Merge branch 'develop' into chore/module-share-resources
carlos-r-l-rodrigues Jan 13, 2023
1b3acf5
remove context
carlos-r-l-rodrigues Jan 13, 2023
2f5fcf7
Merge branch 'chore/module-share-resources' of github.com:medusajs/me…
carlos-r-l-rodrigues Jan 13, 2023
9731db4
oas
carlos-r-l-rodrigues Jan 13, 2023
1e7c5da
Create afraid-moles-brake.md
olivermrbl Jan 13, 2023
ba7b065
utils
carlos-r-l-rodrigues Jan 13, 2023
d73ec61
Merge branch 'chore/module-share-resources' of github.com:medusajs/me…
carlos-r-l-rodrigues Jan 13, 2023
e36af54
Merge branch 'develop' into chore/module-share-resources
carlos-r-l-rodrigues Jan 13, 2023
8e5a317
metadata merge
carlos-r-l-rodrigues Jan 13, 2023
a8bf8b0
Merge branch 'chore/module-share-resources' of github.com:medusajs/me…
carlos-r-l-rodrigues Jan 13, 2023
1e12b8b
metadata
carlos-r-l-rodrigues Jan 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/afraid-moles-brake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@medusajs/inventory": patch
"@medusajs/medusa": patch
"@medusajs/stock-location": patch
---

feat(medusa, stock-location, inventory): Allow modules to integrate with core
7 changes: 0 additions & 7 deletions packages/inventory/src/index.js

This file was deleted.

19 changes: 19 additions & 0 deletions packages/inventory/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import ConnectionLoader from "./loaders/connection"
import InventoryService from "./services/inventory"
import * as InventoryModels from "./models"
import * as SchemaMigration from "./migrations/schema-migrations/1665748086258-inventory_setup"
import { ModuleExports } from "@medusajs/medusa"

const service = InventoryService
const migrations = [SchemaMigration]
const loaders = [ConnectionLoader]
const models = Object.values(InventoryModels)

const moduleDefinition: ModuleExports = {
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
service,
migrations,
loaders,
models,
}

export default moduleDefinition
26 changes: 5 additions & 21 deletions packages/inventory/src/loaders/connection.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,6 @@
import { ConfigModule } from "@medusajs/medusa"
import { ConnectionOptions, createConnection } from "typeorm"
import { CONNECTION_NAME } from "../config"
import { ConfigurableModuleDeclaration, LoaderOptions } from "@medusajs/medusa"

import { ReservationItem, InventoryItem, InventoryLevel } from "../models"

export default async ({
configModule,
}: {
configModule: ConfigModule
}): Promise<void> => {
await createConnection({
name: CONNECTION_NAME,
type: configModule.projectConfig.database_type,
url: configModule.projectConfig.database_url,
database: configModule.projectConfig.database_database,
schema: configModule.projectConfig.database_schema,
extra: configModule.projectConfig.database_extra || {},
entities: [ReservationItem, InventoryLevel, InventoryItem],
logging: configModule.projectConfig.database_logging || false,
} as ConnectionOptions)
}
export default async (
{ configModule }: LoaderOptions,
moduleDeclaration?: ConfigurableModuleDeclaration
): Promise<void> => {}
107 changes: 61 additions & 46 deletions packages/inventory/src/services/inventory-item.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,42 @@
import { ILike, In, getConnection, DeepPartial, EntityManager } from "typeorm"
import { ILike, DeepPartial, EntityManager } from "typeorm"
import { isDefined, MedusaError } from "medusa-core-utils"
import {
FindConfig,
buildQuery,
IEventBusService,
FilterableInventoryItemProps,
CreateInventoryItemInput,
InventoryItemDTO,
TransactionBaseService,
} from "@medusajs/medusa"

import { InventoryItem } from "../models"
import { CONNECTION_NAME } from "../config"

type InjectedDependencies = {
eventBusService: IEventBusService
manager: EntityManager
}

export default class InventoryItemService {
export default class InventoryItemService extends TransactionBaseService {
static Events = {
CREATED: "inventory-item.created",
UPDATED: "inventory-item.updated",
DELETED: "inventory-item.deleted",
}

protected readonly eventBusService_: IEventBusService
protected manager_: EntityManager
protected transactionManager_: EntityManager | undefined

constructor({ eventBusService, manager }: InjectedDependencies) {
super(arguments[0])

constructor({ eventBusService }: InjectedDependencies) {
this.eventBusService_ = eventBusService
this.manager_ = manager
}

private getManager(): EntityManager {
const connection = getConnection(CONNECTION_NAME)
return connection.manager
return this.transactionManager_ ?? this.manager_
}

/**
Expand All @@ -41,7 +47,7 @@ export default class InventoryItemService {
async list(
selector: FilterableInventoryItemProps = {},
config: FindConfig<InventoryItem> = { relations: [], skip: 0, take: 10 }
): Promise<InventoryItem[]> {
): Promise<InventoryItemDTO[]> {
const queryBuilder = this.getListQuery(selector, config)
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
return await queryBuilder.getMany()
}
Expand Down Expand Up @@ -160,30 +166,33 @@ export default class InventoryItemService {
* @return The newly created inventory item.
*/
async create(data: CreateInventoryItemInput): Promise<InventoryItem> {
const manager = this.getManager()
const itemRepository = manager.getRepository(InventoryItem)
return await this.atomicPhase_(async (manager) => {
const itemRepository = manager.getRepository(InventoryItem)

const inventoryItem = itemRepository.create({
sku: data.sku,
origin_country: data.origin_country,
metadata: data.metadata,
hs_code: data.hs_code,
mid_code: data.mid_code,
material: data.material,
weight: data.weight,
length: data.length,
height: data.height,
width: data.width,
requires_shipping: data.requires_shipping,
})

const inventoryItem = itemRepository.create({
sku: data.sku,
origin_country: data.origin_country,
metadata: data.metadata,
hs_code: data.hs_code,
mid_code: data.mid_code,
material: data.material,
weight: data.weight,
length: data.length,
height: data.height,
width: data.width,
requires_shipping: data.requires_shipping,
})
const result = await itemRepository.save(inventoryItem)

const result = await itemRepository.save(inventoryItem)
await this.eventBusService_
.withTransaction(manager)
.emit(InventoryItemService.Events.CREATED, {
id: result.id,
})

await this.eventBusService_.emit(InventoryItemService.Events.CREATED, {
id: result.id,
return result
})

return result
}

/**
Expand All @@ -198,38 +207,44 @@ export default class InventoryItemService {
"id" | "created_at" | "metadata" | "deleted_at"
>
): Promise<InventoryItem> {
const manager = this.getManager()
const itemRepository = manager.getRepository(InventoryItem)
return await this.atomicPhase_(async (manager) => {
const itemRepository = manager.getRepository(InventoryItem)

const item = await this.retrieve(inventoryItemId)
const item = await this.retrieve(inventoryItemId)

const shouldUpdate = Object.keys(data).some((key) => {
return item[key] !== data[key]
})
const shouldUpdate = Object.keys(data).some((key) => {
return item[key] !== data[key]
})

if (shouldUpdate) {
itemRepository.merge(item, data)
await itemRepository.save(item)
if (shouldUpdate) {
itemRepository.merge(item, data)
await itemRepository.save(item)

await this.eventBusService_.emit(InventoryItemService.Events.UPDATED, {
id: item.id,
})
}
await this.eventBusService_
.withTransaction(manager)
carlos-r-l-rodrigues marked this conversation as resolved.
Show resolved Hide resolved
.emit(InventoryItemService.Events.UPDATED, {
id: item.id,
})
}

return item
return item
})
}

/**
* @param inventoryItemId - The id of the inventory item to delete.
*/
async delete(inventoryItemId: string): Promise<void> {
const manager = this.getManager()
const itemRepository = manager.getRepository(InventoryItem)
await this.atomicPhase_(async (manager) => {
const itemRepository = manager.getRepository(InventoryItem)

await itemRepository.softRemove({ id: inventoryItemId })
await itemRepository.softRemove({ id: inventoryItemId })

await this.eventBusService_.emit(InventoryItemService.Events.DELETED, {
id: inventoryItemId,
await this.eventBusService_
.withTransaction(manager)
.emit(InventoryItemService.Events.DELETED, {
id: inventoryItemId,
})
})
}
}
46 changes: 23 additions & 23 deletions packages/inventory/src/services/inventory-level.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getConnection, DeepPartial, EntityManager } from "typeorm"
import { DeepPartial, EntityManager } from "typeorm"
import { isDefined, MedusaError } from "medusa-core-utils"
import {
FindConfig,
Expand All @@ -10,10 +10,10 @@ import {
} from "@medusajs/medusa"

import { InventoryLevel } from "../models"
import { CONNECTION_NAME } from "../config"

type InjectedDependencies = {
eventBusService: IEventBusService
manager: EntityManager
}

export default class InventoryLevelService extends TransactionBaseService {
Expand All @@ -28,20 +28,15 @@ export default class InventoryLevelService extends TransactionBaseService {

protected readonly eventBusService_: IEventBusService

constructor({ eventBusService }: InjectedDependencies) {
constructor({ eventBusService, manager }: InjectedDependencies) {
super(arguments[0])

this.eventBusService_ = eventBusService
this.manager_ = this.getManager()
this.manager_ = manager
}

private getManager(): EntityManager {
if (this.manager_) {
return this.transactionManager_ ?? this.manager_
}

const connection = getConnection(CONNECTION_NAME)
return connection.manager
return this.transactionManager_ ?? this.manager_
}

/**
Expand Down Expand Up @@ -118,7 +113,7 @@ export default class InventoryLevelService extends TransactionBaseService {
* @return The created inventory level.
*/
async create(data: CreateInventoryLevelInput): Promise<InventoryLevel> {
const result = await this.atomicPhase_(async (manager) => {
return await this.atomicPhase_(async (manager) => {
const levelRepository = manager.getRepository(InventoryLevel)

const inventoryLevel = levelRepository.create({
Expand All @@ -129,14 +124,15 @@ export default class InventoryLevelService extends TransactionBaseService {
incoming_quantity: data.incoming_quantity,
})

return await levelRepository.save(inventoryLevel)
})
const saved = await levelRepository.save(inventoryLevel)
await this.eventBusService_
.withTransaction(manager)
.emit(InventoryLevelService.Events.CREATED, {
id: saved.id,
})

await this.eventBusService_.emit(InventoryLevelService.Events.CREATED, {
id: result.id,
return saved
})

return result
}

/**
Expand Down Expand Up @@ -167,9 +163,11 @@ export default class InventoryLevelService extends TransactionBaseService {
levelRepository.merge(item, data)
await levelRepository.save(item)

await this.eventBusService_.emit(InventoryLevelService.Events.UPDATED, {
id: item.id,
})
await this.eventBusService_
.withTransaction(manager)
.emit(InventoryLevelService.Events.UPDATED, {
id: item.id,
})
}

return item
Expand Down Expand Up @@ -209,10 +207,12 @@ export default class InventoryLevelService extends TransactionBaseService {
const levelRepository = manager.getRepository(InventoryLevel)

await levelRepository.delete({ id: inventoryLevelId })
})

await this.eventBusService_.emit(InventoryLevelService.Events.DELETED, {
id: inventoryLevelId,
await this.eventBusService_
.withTransaction(manager)
.emit(InventoryLevelService.Events.DELETED, {
id: inventoryLevelId,
})
})
}

Expand Down
Loading