fix(medusa): Remove deps mongoose + mongodb (#1218)

* fix(medusa): Remove deps mongoose, mongodb and transaction service + base model

* chore: delete permissions+add-ons legacy plugins

Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
This commit is contained in:
Oliver Windall Juhl
2022-07-04 09:10:32 +02:00
committed by GitHub
parent 8fe5fb5503
commit c76e23e84d
52 changed files with 28 additions and 9053 deletions

View File

@@ -49,7 +49,6 @@ A basic Medusa server installed with the `medusa new` command has dependencies s
"medusa-interfaces": "^1.3.0",
"medusa-payment-manual": "^1.0.16",
"medusa-payment-stripe": "^1.1.38",
"mongoose": "^5.13.3",
"typeorm": "^0.2.36"
},
"devDependencies": {
@@ -169,10 +168,10 @@ const plugins = [
{
resolve: `medusa-plugin-custom`,
options: {
name: 'My Store'
}
}
];
name: "My Store",
},
},
]
```
Then, you can have access to your plugin configuration in the constructor of services in your plugin:
@@ -195,11 +194,11 @@ export default (rootDirectory, options) => {
router.get("/hello-world", (req, res) => {
res.json({
message: `Welcome to ${options.name ? options.name : 'Medusa'}!`
message: `Welcome to ${options.name ? options.name : "Medusa"}!`,
})
})
return router;
return router
}
```
@@ -249,10 +248,10 @@ const plugins = [
resolve: `medusa-plugin-custom`,
//if your plugin has configurations
options: {
name: 'My Store'
}
}
];
name: "My Store",
},
},
]
```
:::note
@@ -269,7 +268,7 @@ npm run start
## NPM Ignore File
Not all files that you use while developing your plugin are necessary to be published.
Not all files that you use while developing your plugin are necessary to be published.
For example, the files you add in the `src` directory are compiled to a `dist` directory before publishing. Then, when a developer installs your plugin, theyll just be using the files under the `dist` directory.

View File

@@ -40,7 +40,6 @@
"lerna": "^3.22.1",
"lint-staged": "^11.2.3",
"microbundle": "^0.13.3",
"mongoose": "^5.10.15",
"pg-god": "^1.0.11",
"prettier": "^2.1.1",
"resolve-cwd": "^3.0.0",

View File

@@ -1,153 +0,0 @@
import mongoose from "mongoose"
/**
* Interface for data models. The default data layer uses an internal mongoose
* model and is as such compatible with MongoDB.
* @interface
*/
class BaseModel {
constructor() {
/** @const the underlying mongoose model used for queries */
this.mongooseModel_ = this.createMongooseModel_()
}
/**
* Returns the model schema. The child class must implement the static schema
* property.
* @return {string} the models schema
*/
getSchema() {
if (!this.constructor.schema) {
throw new Error("Schema not defined")
}
return this.constructor.schema
}
/**
* Returns the model name. The child class must implement the static modelName
* property.
* @return {string} the name of the model
*/
getModelName() {
if (!this.constructor.modelName) {
throw new Error("Every model must have a static modelName property")
}
return this.constructor.modelName
}
/**
* Returns the schema options defined in child class.
* @return {object} the schema options
*/
getSchemaOptions() {
if (!this.constructor.schemaOptions) {
return {}
}
return this.constructor.schemaOptions
}
/**
* @private
* Creates a mongoose model based on schema, schema options and model name.
* @return {Mongooose.Model} the mongoose model
*/
createMongooseModel_() {
const schema = this.getSchema()
const options = this.getSchemaOptions()
const mongooseSchema = new mongoose.Schema(schema, options)
return mongoose.model(this.getModelName(), mongooseSchema)
}
/**
*/
startSession() {
return this.mongooseModel_.startSession()
}
/**
* Queries the mongoose model via the mongoose's findOne.
* @param query {object} a mongoose selector query
* @param options {?object=} mongoose options
* @return {?mongoose.Document} the retreived mongoose document or null.
*/
findOne(query, options = {}) {
return this.mongooseModel_.findOne(query, options).lean()
}
/**
* Queries the mongoose model via the mongoose's find.
* @param query {object} a mongoose selector query
* @param options {?object=} mongoose options
* @return {Array<mongoose.Document>} the retreived mongoose documents or
* an empty array
*/
find(query, options, offset, limit) {
return this.mongooseModel_
.find(query, options)
.skip(offset)
.limit(limit)
.lean()
}
count() {
return this.mongooseModel_.count({})
}
/**
* Update a model via the mongoose model's updateOne.
* @param query {object} a mongoose selector query
* @param update {object} mongoose update object
* @param options {?object=} mongoose options
* @return {object} mongoose result
*/
updateOne(query, update, options = {}) {
options.new = true
return this.mongooseModel_.findOneAndUpdate(query, update, options).lean()
}
/**
* Update a model via the mongoose model's update.
* @param query {object} a mongoose selector query
* @param update {object} mongoose update object
* @param options {?object=} mongoose options
* @return {object} mongoose result
*/
update(query, update, options) {
return this.mongooseModel_.update(query, update, options)
}
/**
* Creates a document in the mongoose model's collection via create.
* @param object {object} the value of the document to be created
* @param options {?object=} mongoose options
* @return {object} mongoose result
*/
create(object, options) {
return this.mongooseModel_.create(object, options)
}
/**
* Deletes a document in the mongoose model's collection
* @param query {object} the value of the document to be created
* @param options {?object=} mongoose options
* @return {object} mongoose result
*/
deleteOne(query, options) {
return this.mongooseModel_.deleteOne(query, options)
}
/**
* Deletes many document in the mongoose model's collection
* @param query {object} the value of the document to be created
* @param options {?object=} mongoose options
* @return {object} mongoose result
*/
delete(query, options) {
return this.mongooseModel_.deleteMany(query, options)
}
}
export default BaseModel

View File

@@ -1,8 +1,7 @@
export { default as BaseService } from "./base-service"
export { default as BaseModel } from "./base-model"
export { default as PaymentService } from "./payment-service"
export { default as FulfillmentService } from "./fulfillment-service"
export { default as FileService } from "./file-service"
export { default as FulfillmentService } from "./fulfillment-service"
export { default as NotificationService } from "./notification-service"
export { default as OauthService } from "./oauth-service"
export { default as PaymentService } from "./payment-service"
export { default as SearchService } from "./search-service"

View File

@@ -1,13 +0,0 @@
{
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-transform-instanceof",
"@babel/plugin-transform-classes"
],
"presets": ["@babel/preset-env"],
"env": {
"test": {
"plugins": ["@babel/plugin-transform-runtime"]
}
}
}

View File

@@ -1,15 +0,0 @@
/lib
node_modules
.DS_store
.env*
/*.js
!index.js
/dist
/api
/services
/models
/subscribers
/loaders

View File

@@ -1,8 +0,0 @@
/lib
node_modules
.DS_store
.env*
/*.js
!index.js
yarn.lock
/src

View File

@@ -1,222 +0,0 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [1.2.0](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.37...medusa-plugin-add-ons@1.2.0) (2022-05-01)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.37](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.36...medusa-plugin-add-ons@1.1.37) (2022-01-11)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.36](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.35...medusa-plugin-add-ons@1.1.36) (2021-12-29)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.35](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.34...medusa-plugin-add-ons@1.1.35) (2021-12-17)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.34](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.33...medusa-plugin-add-ons@1.1.34) (2021-12-08)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.33](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.32...medusa-plugin-add-ons@1.1.33) (2021-11-23)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.32](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.31...medusa-plugin-add-ons@1.1.32) (2021-11-22)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.31](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.30...medusa-plugin-add-ons@1.1.31) (2021-11-19)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.30](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.29...medusa-plugin-add-ons@1.1.30) (2021-11-19)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.29](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.28...medusa-plugin-add-ons@1.1.29) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.28](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.27...medusa-plugin-add-ons@1.1.28) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.27](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.25...medusa-plugin-add-ons@1.1.27) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.26](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.25...medusa-plugin-add-ons@1.1.26) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.25](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.24...medusa-plugin-add-ons@1.1.25) (2021-09-15)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.24](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.23...medusa-plugin-add-ons@1.1.24) (2021-09-14)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.23](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.22...medusa-plugin-add-ons@1.1.23) (2021-08-05)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.22](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.21...medusa-plugin-add-ons@1.1.22) (2021-07-26)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.21](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.19...medusa-plugin-add-ons@1.1.21) (2021-07-15)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.20](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.19...medusa-plugin-add-ons@1.1.20) (2021-07-15)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.19](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.18...medusa-plugin-add-ons@1.1.19) (2021-07-02)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.18](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.17...medusa-plugin-add-ons@1.1.18) (2021-06-22)
### Bug Fixes
- release assist ([668e8a7](https://github.com/medusajs/medusa/commit/668e8a740200847fc2a41c91d2979097f1392532))
## [1.1.17](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.16...medusa-plugin-add-ons@1.1.17) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.16](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.15...medusa-plugin-add-ons@1.1.16) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.15](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.14...medusa-plugin-add-ons@1.1.15) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.14](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.13...medusa-plugin-add-ons@1.1.14) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.13](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.12...medusa-plugin-add-ons@1.1.13) (2021-06-08)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.12](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.9...medusa-plugin-add-ons@1.1.12) (2021-04-28)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.11](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.10...medusa-plugin-add-ons@1.1.11) (2021-04-20)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.10](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.9...medusa-plugin-add-ons@1.1.10) (2021-04-20)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.9](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.8...medusa-plugin-add-ons@1.1.9) (2021-04-13)
### Bug Fixes
- merge develop ([2982a8e](https://github.com/medusajs/medusa/commit/2982a8e682e90beb4549d969d9d3b04d78a46a2d))
- merge develop ([a468c45](https://github.com/medusajs/medusa/commit/a468c451e82c68f41b5005a2e480057f6124aaa6))
## [1.1.8](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.7...medusa-plugin-add-ons@1.1.8) (2021-04-13)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.7](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.6...medusa-plugin-add-ons@1.1.7) (2021-03-30)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.6](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.5...medusa-plugin-add-ons@1.1.6) (2021-03-17)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.5](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.3...medusa-plugin-add-ons@1.1.5) (2021-03-17)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.4](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.3...medusa-plugin-add-ons@1.1.4) (2021-03-17)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.3](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.2...medusa-plugin-add-ons@1.1.3) (2021-02-17)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.2](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.1...medusa-plugin-add-ons@1.1.2) (2021-02-03)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.1.1](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.1.0...medusa-plugin-add-ons@1.1.1) (2021-01-27)
**Note:** Version bump only for package medusa-plugin-add-ons
# [1.1.0](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.8...medusa-plugin-add-ons@1.1.0) (2021-01-26)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.8](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.7...medusa-plugin-add-ons@1.0.8) (2020-12-17)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.7](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.6...medusa-plugin-add-ons@1.0.7) (2020-11-24)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.6](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.5...medusa-plugin-add-ons@1.0.6) (2020-10-19)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.5](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.4...medusa-plugin-add-ons@1.0.5) (2020-10-12)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.4](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.3...medusa-plugin-add-ons@1.0.4) (2020-10-09)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.3](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.2...medusa-plugin-add-ons@1.0.3) (2020-10-05)
### Bug Fixes
- **medusa-plugin-add-ons:** fixes add-on decorator ([5071f36](https://github.com/medusajs/medusa/commit/5071f362e4e140d11a1342a5058e8ad2efaa1ed4))
- **medusa-plugin-addon:** Fixes admin endpoints, Adds flag to avoid merging add-on line-items ([d8483cd](https://github.com/medusajs/medusa/commit/d8483cd1352ecc587112723786b7c31882f9416e))
## [1.0.2](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.1...medusa-plugin-add-ons@1.0.2) (2020-09-09)
**Note:** Version bump only for package medusa-plugin-add-ons
## [1.0.1](https://github.com/medusajs/medusa/compare/medusa-plugin-add-ons@1.0.0...medusa-plugin-add-ons@1.0.1) (2020-09-09)
**Note:** Version bump only for package medusa-plugin-add-ons
# 1.0.0 (2020-09-09)
### Features
- **plugins:** Adds add-on plugin ([3de1e6d](https://github.com/medusajs/medusa/commit/3de1e6dd4ad4a2a48d4d8116ebdd011efce2b22a))

View File

@@ -1 +0,0 @@
// noop

View File

@@ -1,44 +0,0 @@
{
"name": "medusa-plugin-add-ons",
"version": "1.2.0",
"description": "Add-on plugin for Medusa Commerce",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/medusajs/medusa",
"directory": "packages/medusa-plugin-add-ons"
},
"author": "Oliver Juhl",
"license": "AGPL-3.0-or-later",
"devDependencies": {
"@babel/cli": "^7.7.5",
"@babel/core": "^7.7.5",
"@babel/node": "^7.7.4",
"@babel/plugin-proposal-class-properties": "^7.7.4",
"@babel/plugin-transform-classes": "^7.9.5",
"@babel/plugin-transform-instanceof": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.7.6",
"@babel/preset-env": "^7.7.5",
"@babel/register": "^7.7.4",
"@babel/runtime": "^7.9.6",
"client-sessions": "^0.8.0",
"cross-env": "^7.0.2",
"eslint": "^6.8.0",
"jest": "^25.5.2",
"medusa-test-utils": "^1.1.37"
},
"scripts": {
"build": "babel src -d . --ignore **/__tests__",
"prepare": "cross-env NODE_ENV=production npm run build",
"watch": "babel -w src --out-dir . --ignore **/__tests__",
"test": "jest"
},
"dependencies": {
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"medusa-core-utils": "^1.1.31",
"redis": "^3.0.2"
},
"gitHead": "81a7ff73d012fda722f6e9ef0bd9ba0232d37808"
}

View File

@@ -1,12 +0,0 @@
import { Router } from "express"
import admin from "./routes/admin"
import store from "./routes/store"
export default (rootDirectory) => {
const app = Router()
store(app, rootDirectory)
admin(app, rootDirectory)
return app
}

View File

@@ -1 +0,0 @@
export default (fn) => (...args) => fn(...args).catch(args[2])

View File

@@ -1,5 +0,0 @@
import { default as wrap } from "./await-middleware"
export default {
wrap,
}

View File

@@ -1,29 +0,0 @@
import { Validator, MedusaError } from "medusa-core-utils"
export default async (req, res) => {
const schema = Validator.object().keys({
name: Validator.string().required(),
prices: Validator.array()
.items({
currency_code: Validator.string(),
amount: Validator.number(),
})
.required(),
valid_for: Validator.array().items(),
metadata: Validator.object().optional(),
})
const { value, error } = schema.validate(req.body)
if (error) {
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
}
try {
const addOnService = req.scope.resolve("addOnService")
const addOn = await addOnService.create(value)
res.status(200).json({ addOn })
} catch (err) {
throw err
}
}

View File

@@ -1,16 +0,0 @@
export default async (req, res) => {
const { id } = req.params
const addOnService = req.scope.resolve("addOnService")
try {
await addOnService.delete(id)
res.status(200).send({
id,
object: "addOn",
deleted: true,
})
} catch (err) {
throw err
}
}

View File

@@ -1,17 +0,0 @@
export default async (req, res) => {
const { id } = req.params
try {
const addOnService = req.scope.resolve("addOnService")
let addOn = await addOnService.retrieve(id)
addOn = await addOnService.decorate(
addOn,
["name", "valid_for", "prices"],
["valid_for"]
)
res.json({ add_on: addOn })
} catch (err) {
throw err
}
}

View File

@@ -1,55 +0,0 @@
import { Router } from "express"
import bodyParser from "body-parser"
import cors from "cors"
import middlewares from "../../middlewares"
import { getConfigFile } from "medusa-core-utils"
const route = Router()
export default (app, rootDirectory) => {
const { configModule } = getConfigFile(rootDirectory, `medusa-config`)
const config = (configModule && configModule.projectConfig) || {}
const adminCors = config.admin_cors || ""
route.use(
cors({
origin: adminCors.split(","),
credentials: true,
})
)
app.use("/admin", route)
route.post(
"/add-ons",
bodyParser.json(),
middlewares.wrap(require("./create-add-on").default)
)
route.post(
"/add-ons/:id",
bodyParser.json(),
middlewares.wrap(require("./update-add-on").default)
)
route.get(
"/add-ons",
bodyParser.json(),
middlewares.wrap(require("./list-add-ons").default)
)
route.get(
"/add-ons/:id",
bodyParser.json(),
middlewares.wrap(require("./get-add-on").default)
)
route.delete(
"/add-ons/:id",
bodyParser.json(),
middlewares.wrap(require("./delete-add-on").default)
)
return app
}

View File

@@ -1,20 +0,0 @@
export default async (req, res) => {
try {
const addOnService = req.scope.resolve("addOnService")
let addOns = await addOnService.list({})
addOns = await Promise.all(
addOns.map((ao) =>
addOnService.decorate(
ao,
["name", "valid_for", "prices"],
["valid_for"]
)
)
)
res.status(200).json({ add_ons: addOns })
} catch (err) {
console.log(err)
throw err
}
}

View File

@@ -1,39 +0,0 @@
import { Validator, MedusaError } from "medusa-core-utils"
export default async (req, res) => {
const { id } = req.params
const schema = Validator.object().keys({
name: Validator.string().optional(),
prices: Validator.array()
.items({
currency_code: Validator.string().required(),
amount: Validator.number().required(),
})
.optional(),
valid_for: Validator.array().optional(),
metadata: Validator.object().optional(),
})
const { value, error } = schema.validate(req.body)
if (error) {
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
}
try {
const addOnService = req.scope.resolve("addOnService")
if (value.metadata) {
Object.entries(value.metadata).map(([key, value]) => {
addOnService.setMetadata(id, key, value)
})
delete value.metadata
}
const addOn = await addOnService.update(id, value)
res.status(200).json({ addOn })
} catch (err) {
throw err
}
}

View File

@@ -1,39 +0,0 @@
import { Validator, MedusaError } from "medusa-core-utils"
export default async (req, res) => {
const { id } = req.params
const schema = Validator.object().keys({
variant_id: Validator.string().required(),
quantity: Validator.number().required(),
add_ons: Validator.array().items(Validator.string()).optional(),
metadata: Validator.object().optional(),
})
const { value, error } = schema.validate(req.body)
if (error) {
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
}
try {
const lineItemService = req.scope.resolve("addOnLineItemService")
const cartService = req.scope.resolve("cartService")
let cart = await cartService.retrieve(id)
const lineItem = await lineItemService.generate(
value.variant_id,
cart.region_id,
value.quantity,
value.add_ons,
value.metadata
)
cart = await cartService.addLineItem(cart._id, lineItem)
cart = await cartService.decorate(cart, [], ["region"])
res.status(200).json({ cart })
} catch (err) {
throw err
}
}

View File

@@ -1,27 +0,0 @@
import { Validator } from "medusa-core-utils"
export default async (req, res) => {
const schema = Validator.object({
product_id: Validator.string().required(),
})
const { value, error } = schema.validate(region_id)
if (error) {
throw error
}
try {
const addOnService = req.scope.resolve("addOnService")
let addOn = await addOnService.retrieveByProduct(value.product_id)
addOn = await addOnService.decorate(
addOn,
["name", "valid_for", "prices"],
["valid_for"]
)
res.json({ add_on: addOn })
} catch (err) {
throw err
}
}

View File

@@ -1,37 +0,0 @@
import { Router } from "express"
import bodyParser from "body-parser"
import cors from "cors"
import middlewares from "../../middlewares"
import { getConfigFile } from "medusa-core-utils"
const route = Router()
export default (app, rootDirectory) => {
const { configModule } = getConfigFile(rootDirectory, `medusa-config`)
const config = (configModule && configModule.projectConfig) || {}
const storeCors = config.store_cors || ""
route.use(
cors({
origin: storeCors.split(","),
credentials: true,
})
)
app.use("/store", route)
route.post(
"/carts/:id/line-items/add-on",
bodyParser.json(),
middlewares.wrap(require("./create-line-item").default)
)
route.post(
"/carts/:id/line-items/:line_id/add-on",
bodyParser.json(),
middlewares.wrap(require("./update-line-item").default)
)
return app
}

View File

@@ -1,52 +0,0 @@
import { Validator, MedusaError } from "medusa-core-utils"
export default async (req, res) => {
const { id, line_id } = req.params
const schema = Validator.object().keys({
add_ons: Validator.array().items(Validator.string()).optional(),
quantity: Validator.number().optional(),
metadata: Validator.object().optional(),
})
const { value, error } = schema.validate(req.body)
if (error) {
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
}
try {
const lineItemService = req.scope.resolve("addOnLineItemService")
const cartService = req.scope.resolve("cartService")
let cart
if (value.quantity === 0) {
cart = await cartService.removeLineItem(id, line_id)
} else {
cart = await cartService.retrieve(id)
const existing = cart.items.find((i) => i._id.equals(line_id))
if (!existing) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
"Could not find the line item"
)
}
const lineItem = await lineItemService.generate(
existing.content.variant._id,
cart.region_id,
value.quantity,
value.add_ons,
value.metadata
)
cart = await cartService.updateLineItem(cart._id, line_id, lineItem)
}
cart = await cartService.decorate(cart, [], ["region"])
res.status(200).json({ cart })
} catch (err) {
throw err
}
}

View File

@@ -1,26 +0,0 @@
export default (container, config) => {
const cartService = container.resolve("cartService")
const addOnLineItemService = container.resolve("addOnLineItemService")
cartService.addDecorator(async (cart) => {
try {
cart.items = await Promise.all(
cart.items.map((item) => {
if (item.metadata && item.metadata.add_ons) {
return addOnLineItemService.decorate(
item,
["title", "quantity", "thumbnail", "content", "should_merge"],
["add_ons"]
)
} else {
return item
}
})
)
return cart
} catch (error) {
return cart
}
})
}

View File

@@ -1,46 +0,0 @@
import { IdMap } from "medusa-test-utils"
export const addOns = {
testAddOn: {
_id: IdMap.getId("test-add-on"),
name: "Chili",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [IdMap.getId("test-product")],
},
testAddOn2: {
_id: IdMap.getId("test-add-on-2"),
name: "Chili",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [IdMap.getId("test-product")],
},
}
export const AddOnModelMock = {
create: jest.fn().mockReturnValue(Promise.resolve()),
find: jest.fn().mockImplementation((query) => {
return Promise.resolve([addOns.testAddOn, addOns.testAddOn2])
}),
updateOne: jest.fn().mockImplementation((query, update) => {
return Promise.resolve()
}),
deleteOne: jest.fn().mockReturnValue(Promise.resolve()),
findOne: jest.fn().mockImplementation((query) => {
if (query._id === IdMap.getId("test-add-on")) {
return Promise.resolve(addOns.testAddOn)
}
if (query._id === IdMap.getId("test-add-on-2")) {
return Promise.resolve(addOns.testAddOn2)
}
return Promise.resolve(undefined)
}),
}

View File

@@ -1,15 +0,0 @@
import mongoose from "mongoose"
import { BaseModel } from "medusa-interfaces"
class AddOnModel extends BaseModel {
static modelName = "AddOn"
static schema = {
name: { type: String, required: true },
prices: { type: [], required: true },
// Valid products
valid_for: { type: [String], required: true },
metadata: { type: mongoose.Schema.Types.Mixed, default: {} },
}
}
export default AddOnModel

View File

@@ -1,70 +0,0 @@
import { IdMap } from "medusa-test-utils"
export const addOns = {
testAddOn: {
_id: IdMap.getId("test-add-on"),
name: "Chili",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [IdMap.getId("test-product")],
},
testAddOn2: {
_id: IdMap.getId("test-add-on-2"),
name: "Chili",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [IdMap.getId("test-product")],
},
testAddOn3: {
_id: IdMap.getId("test-add-on-3"),
name: "Herbs",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [],
},
}
export const AddOnServiceMock = {
retrieve: jest.fn().mockImplementation((addOnId) => {
if (addOnId === IdMap.getId("test-add-on")) {
return Promise.resolve(addOns.testAddOn)
}
if (addOnId === IdMap.getId("test-add-on-2")) {
return Promise.resolve(addOns.testAddOn2)
}
if (addOnId === IdMap.getId("test-add-on-3")) {
return Promise.resolve(addOns.testAddOn3)
}
return Promise.resolve(undefined)
}),
getRegionPrice: jest.fn().mockImplementation((addOnId, regionId) => {
if (addOnId === IdMap.getId("test-add-on")) {
return Promise.resolve(20)
}
if (addOnId === IdMap.getId("test-add-on-2")) {
return Promise.resolve(20)
}
if (addOnId === IdMap.getId("test-add-on-3")) {
return Promise.resolve(20)
}
return Promise.resolve(undefined)
}),
}
const mock = jest.fn().mockImplementation(() => {
return AddOnServiceMock
})
export default mock

View File

@@ -1,10 +0,0 @@
export const EventBusServiceMock = {
emit: jest.fn(),
subscribe: jest.fn(),
}
const mock = jest.fn().mockImplementation(() => {
return EventBusServiceMock
})
export default mock

View File

@@ -1,94 +0,0 @@
import { IdMap } from "medusa-test-utils"
const variant1 = {
_id: IdMap.getId("test-variant-1"),
title: "variant1",
options: [],
}
const variant2 = {
_id: IdMap.getId("test-variant-2"),
title: "variant2",
options: [
{
option_id: IdMap.getId("color_id"),
value: "black",
},
{
option_id: IdMap.getId("size_id"),
value: "160",
},
],
}
const variant3 = {
_id: IdMap.getId("test-variant-3"),
title: "variant3",
options: [
{
option_id: IdMap.getId("color_id"),
value: "blue",
},
{
option_id: IdMap.getId("size_id"),
value: "150",
},
],
}
const variant4 = {
_id: IdMap.getId("test-variant-4"),
title: "variant4",
options: [
{
option_id: IdMap.getId("color_id"),
value: "blue",
},
{
option_id: IdMap.getId("size_id"),
value: "50",
},
],
}
export const variants = {
one: variant1,
two: variant2,
three: variant3,
four: variant4,
}
export const ProductVariantServiceMock = {
retrieve: jest.fn().mockImplementation((variantId) => {
if (variantId === IdMap.getId("test-variant-1")) {
return Promise.resolve(variant1)
}
if (variantId === IdMap.getId("test-variant-2")) {
return Promise.resolve(variant2)
}
if (variantId === IdMap.getId("test-variant-3")) {
return Promise.resolve(variant3)
}
if (variantId === IdMap.getId("test-variant-4")) {
return Promise.resolve(variant4)
}
return Promise.resolve(undefined)
}),
getRegionPrice: jest.fn().mockImplementation((variantId, context) => {
if (variantId === IdMap.getId("test-variant-1")) {
if (context.regionId === IdMap.getId("world")) {
return Promise.resolve(10)
} else {
return Promise.resolve(20)
}
}
return Promise.reject(new Error("Not found"))
}),
}
const mock = jest.fn().mockImplementation(() => {
return ProductVariantServiceMock
})
export default mock

View File

@@ -1,39 +0,0 @@
import { IdMap } from "medusa-test-utils"
export const products = {
product1: {
_id: IdMap.getId("test-product"),
description: "Test description",
title: "Product 1",
variants: [IdMap.getId("test-variant-1")],
// metadata: {
// add_ons: [IdMap.getId("test-add-on"), IdMap.getId("test-add-on-2")],
// },
},
product2: {
_id: IdMap.getId("test-product-2"),
title: "Product 2",
metadata: {},
},
}
export const ProductServiceMock = {
retrieve: jest.fn().mockImplementation((productId) => {
if (productId === IdMap.getId("test-product")) {
return Promise.resolve(products.product1)
}
if (productId === IdMap.getId("test-product-2")) {
return Promise.resolve(products.product2)
}
return Promise.resolve(undefined)
}),
list: jest.fn().mockImplementation((query) => {
return Promise.resolve([products.product1])
}),
}
const mock = jest.fn().mockImplementation(() => {
return ProductServiceMock
})
export default mock

View File

@@ -1,28 +0,0 @@
import { IdMap } from "medusa-test-utils"
export const regions = {
testRegion: {
_id: IdMap.getId("world"),
name: "Test Region",
countries: ["DK", "US", "DE"],
tax_rate: 0.25,
payment_providers: ["default_provider", "unregistered"],
fulfillment_providers: ["test_shipper"],
currency_code: "DKK",
},
}
export const RegionServiceMock = {
retrieve: jest.fn().mockImplementation((regionId) => {
if (regionId === IdMap.getId("world")) {
return Promise.resolve(regions.testRegion)
}
throw Error(regionId + "not found")
}),
}
const mock = jest.fn().mockImplementation(() => {
return RegionServiceMock
})
export default mock

View File

@@ -1,106 +0,0 @@
import { IdMap } from "medusa-test-utils"
import AddOnLineItemService from "../add-on-line-item"
import { ProductVariantServiceMock } from "../__mocks__/product-variant"
import { ProductServiceMock } from "../__mocks__/product"
import { RegionServiceMock } from "../__mocks__/region"
import { AddOnServiceMock } from "../__mocks__/add-on"
describe("LineItemService", () => {
describe("generate", () => {
let result
const lineItemService = new AddOnLineItemService({
addOnService: AddOnServiceMock,
productVariantService: ProductVariantServiceMock,
productService: ProductServiceMock,
regionService: RegionServiceMock,
})
beforeAll(async () => {
jest.clearAllMocks()
})
it("generates line item and successfully calculates full unit_price", async () => {
result = await lineItemService.generate(
IdMap.getId("test-variant-1"),
IdMap.getId("world"),
1,
[IdMap.getId("test-add-on"), IdMap.getId("test-add-on-2")]
)
expect(result).toEqual({
title: "Product 1",
thumbnail: undefined,
should_merge: false,
content: {
unit_price: 50,
variant: {
_id: IdMap.getId("test-variant-1"),
title: "variant1",
options: [],
},
product: {
_id: IdMap.getId("test-product"),
description: "Test description",
title: "Product 1",
variants: [IdMap.getId("test-variant-1")],
},
quantity: 1,
},
metadata: {
add_ons: [IdMap.getId("test-add-on"), IdMap.getId("test-add-on-2")],
},
quantity: 1,
})
})
it("generates line item and successfully calculates full unit_price for large quantity", async () => {
result = await lineItemService.generate(
IdMap.getId("test-variant-1"),
IdMap.getId("world"),
3,
[IdMap.getId("test-add-on"), IdMap.getId("test-add-on-2")]
)
expect(result).toEqual({
title: "Product 1",
thumbnail: undefined,
should_merge: false,
content: {
unit_price: 150,
variant: {
_id: IdMap.getId("test-variant-1"),
title: "variant1",
options: [],
},
product: {
_id: IdMap.getId("test-product"),
description: "Test description",
title: "Product 1",
variants: [IdMap.getId("test-variant-1")],
},
quantity: 1,
},
metadata: {
add_ons: [IdMap.getId("test-add-on"), IdMap.getId("test-add-on-2")],
},
quantity: 3,
})
})
it("fails if variant has no associated product", async () => {
try {
await lineItemService.generate(
IdMap.getId("test-variant-1"),
IdMap.getId("world"),
1,
[
IdMap.getId("test-add-on"),
IdMap.getId("test-add-on-2"),
IdMap.getId("test-add-on-3"),
]
)
} catch (err) {
expect(err.message).toBe(`Herbs can not be added to Product 1`)
}
})
})
})

View File

@@ -1,134 +0,0 @@
import { IdMap } from "medusa-test-utils"
import { AddOnModelMock, addOns } from "../../models/__mocks__/add-on"
import AddOnService from "../add-on"
import { EventBusServiceMock } from "../__mocks__/event-bus"
import { ProductServiceMock } from "../__mocks__/product"
describe("AddOnService", () => {
describe("create", () => {
const addOnService = new AddOnService({
addOnModel: AddOnModelMock,
productService: ProductServiceMock,
eventBusService: EventBusServiceMock,
})
beforeEach(async () => {
jest.clearAllMocks()
})
it("calls model layer create", async () => {
await addOnService.create({
name: "Chili",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [IdMap.getId("test-product")],
})
expect(AddOnModelMock.create).toBeCalledTimes(1)
expect(AddOnModelMock.create).toBeCalledWith({
name: "Chili",
prices: [
{
currency_code: "DKK",
amount: 20,
},
],
valid_for: [IdMap.getId("test-product")],
})
})
})
describe("retrieve", () => {
let result
beforeAll(async () => {
jest.clearAllMocks()
const addOnService = new AddOnService({
addOnModel: AddOnModelMock,
})
result = await addOnService.retrieve(IdMap.getId("test-add-on"))
})
it("calls model layer retrieve", async () => {
expect(AddOnModelMock.findOne).toBeCalledTimes(1)
expect(AddOnModelMock.findOne).toBeCalledWith({
_id: IdMap.getId("test-add-on"),
})
})
it("returns the add-on", () => {
expect(result).toEqual(addOns.testAddOn)
})
})
describe("update", () => {
const addOnService = new AddOnService({
addOnModel: AddOnModelMock,
productService: ProductServiceMock,
eventBusService: EventBusServiceMock,
})
beforeEach(async () => {
jest.clearAllMocks()
})
it("calls model layer create", async () => {
await addOnService.update(IdMap.getId("test-add-on"), {
name: "Chili Spice",
valid_for: [IdMap.getId("test-product"), IdMap.getId("test-product-2")],
})
expect(AddOnModelMock.updateOne).toBeCalledTimes(1)
expect(AddOnModelMock.updateOne).toBeCalledWith(
{ _id: IdMap.getId("test-add-on") },
{
$set: {
name: "Chili Spice",
valid_for: [
IdMap.getId("test-product"),
IdMap.getId("test-product-2"),
],
},
},
{ runValidators: true }
)
})
})
describe("retrieveByProduct", () => {
describe("successful retrieval", () => {
let result
beforeAll(async () => {
jest.clearAllMocks()
const addOnService = new AddOnService({
addOnModel: AddOnModelMock,
productService: ProductServiceMock,
})
result = await addOnService.retrieveByProduct(
IdMap.getId("test-product")
)
})
it("calls ProductService retrieve", async () => {
expect(ProductServiceMock.retrieve).toBeCalledTimes(1)
expect(ProductServiceMock.retrieve).toBeCalledWith(
IdMap.getId("test-product")
)
})
it("calls model layer", () => {
expect(AddOnModelMock.find).toBeCalledTimes(1)
expect(AddOnModelMock.find).toBeCalledWith({
valid_for: IdMap.getId("test-product"),
})
})
it("returns the add-ons", () => {
expect(result).toEqual([addOns.testAddOn, addOns.testAddOn2])
})
})
})
})

View File

@@ -1,120 +0,0 @@
import _ from "lodash"
import { BaseService } from "medusa-interfaces"
import { Validator, MedusaError } from "medusa-core-utils"
class AddOnLineItemService extends BaseService {
static Events = {
UPDATED: "add_on.updated",
CREATED: "add_on.created",
}
constructor(
{
addOnService,
productService,
productVariantService,
regionService,
eventBusService,
},
options
) {
super()
this.addOnService_ = addOnService
this.productService_ = productService
this.productVariantService_ = productVariantService
this.regionService_ = regionService
this.eventBus_ = eventBusService
this.options_ = options
}
/**
* Generates a line item.
* @param {string} variantId - id of the line item variant
* @param {*} regionId - id of the cart region
* @param {*} quantity - number of items
* @param {[string]} addOnIds - id of add-ons
*/
async generate(variantId, regionId, quantity, addOnIds, metadata = {}) {
const variant = await this.productVariantService_.retrieve(variantId)
const region = await this.regionService_.retrieve(regionId)
const products = await this.productService_.list({ variants: variantId })
// this should never fail, since a variant must have a product associated
// with it to exists, but better safe than sorry
if (!products.length) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`Could not find product for variant with id: ${variantId}`
)
}
const product = products[0]
let unitPrice = await this.productVariantService_.getRegionPrice(
variant._id,
{regionId: region._id}
)
const addOnPrices = await Promise.all(
addOnIds.map(async (id) => {
const addOn = await this.addOnService_.retrieve(id)
// Check if any of the add-ons can't be added to the product
if (!addOn.valid_for.includes(`${product._id}`)) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
`${addOn.name} can not be added to ${product.title}`
)
} else {
return await this.addOnService_.getRegionPrice(id, region._id)
}
})
)
unitPrice += _.sum(addOnPrices)
const line = {
title: product.title,
quantity,
thumbnail: product.thumbnail,
should_merge: false,
content: {
unit_price: unitPrice * quantity,
variant,
product,
quantity: 1,
},
should_merge: false,
metadata: {
...metadata,
add_ons: addOnIds,
},
}
return line
}
async decorate(lineItem, fields, expandFields = []) {
const requiredFields = ["_id", "metadata"]
const decorated = _.pick(lineItem, fields.concat(requiredFields))
if (
expandFields.includes("add_ons") &&
decorated.metadata &&
decorated.metadata.add_ons
) {
decorated.metadata.add_ons = await Promise.all(
decorated.metadata.add_ons.map(
async (ao) => await this.addOnService_.retrieve(ao)
)
)
}
return decorated
}
}
export default AddOnLineItemService

View File

@@ -1,244 +0,0 @@
import _ from "lodash"
import { BaseService } from "medusa-interfaces"
import { Validator, MedusaError } from "medusa-core-utils"
class AddOnService extends BaseService {
static Events = {
UPDATED: "add_on.updated",
CREATED: "add_on.created",
}
constructor(
{
addOnModel,
productService,
productVariantService,
regionService,
eventBusService,
},
options
) {
super()
this.addOnModel_ = addOnModel
this.productService_ = productService
this.productVariantService_ = productVariantService
this.regionService_ = regionService
this.eventBus_ = eventBusService
this.options_ = options
}
/**
* Used to validate add-on ids. Throws an error if the cast fails
* @param {string} rawId - the raw add-on id to validate.
* @return {string} the validated id
*/
validateId_(rawId) {
return rawId
}
/**
* @param {Object} selector - the query object for find
* @return {Promise} the result of the find operation
*/
list(selector, offset, limit) {
return this.addOnModel_.find(selector, {}, offset, limit)
}
/**
* Gets an add-on by id.
* @param {string} addOnId - the id of the add-on to get.
* @return {Promise<AddOn>} the add-on document.
*/
async retrieve(addOnId) {
const validatedId = this.validateId_(addOnId)
const addOn = await this.addOnModel_
.findOne({ _id: validatedId })
.catch((err) => {
throw new MedusaError(MedusaError.Types.DB_ERROR, err.message)
})
if (!addOn) {
throw new MedusaError(
MedusaError.Types.NOT_FOUND,
`Add-on with ${addOnId} was not found`
)
}
return addOn
}
/**
* Creates an add-on.
* @param {object} addOn - the add-on to create
* @return {Promise} resolves to the creation result.
*/
async create(addOn) {
await Promise.all(
addOn.valid_for.map((prodId) => {
this.productService_.retrieve(prodId)
})
)
return this.addOnModel_
.create(addOn)
.then((result) => {
this.eventBus_.emit(AddOnService.Events.CREATED, result)
return result
})
.catch((err) => {
throw new MedusaError(MedusaError.Types.DB_ERROR, err.message)
})
}
/**
* Deletes an add-on.
* @param {object} addOnId - the add-on to delete
* @return {Promise} resolves to the deletion result.
*/
async delete(addOnId) {
const addOn = await this.retrieve(addOnId)
return this.addOnModel_.deleteOne({ _id: addOn._id })
}
/**
* Retrieves all valid add-ons for a given product.
* @param {object} productId - the product id to find add-ons for
* @return {Promise} returns a promise containing all add-ons for the product
*/
async retrieveByProduct(productId) {
const product = await this.productService_.retrieve(productId)
return this.addOnModel_.find({ valid_for: product._id })
}
/**
* Updates an add-on. Metadata updates should use dedicated methods, e.g.
* `setMetadata`, etc. The function will throw errors if metadata updates
* are attempted.
* @param {string} addOnId - the id of the add-on. Must be a string that
* can be casted to an ObjectId
* @param {object} update - an object with the update values.
* @return {Promise} resolves to the update result.
*/
async update(addOnId, update) {
const validatedId = this.validateId_(addOnId)
await Promise.all(
update.valid_for.map((prodId) => {
this.productService_.retrieve(prodId)
})
)
if (update.metadata) {
throw new MedusaError(
MedusaError.Types.INVALID_DATA,
"Use setMetadata to update metadata fields"
)
}
return this.addOnModel_
.updateOne(
{ _id: validatedId },
{ $set: update },
{ runValidators: true }
)
.catch((err) => {
throw new MedusaError(MedusaError.Types.DB_ERROR, err.message)
})
}
/**
* Gets the price specific to a region. If no region specific money amount
* exists the function will try to use a currency price. If no default
* currency price exists the function will throw an error.
* @param {string} addOnId - the id of the add-on to get price from
* @param {string} regionId - the id of the region to get price for
* @return {number} the price specific to the region
*/
async getRegionPrice(addOnId, regionId) {
const addOn = await this.retrieve(addOnId)
const region = await this.regionService_.retrieve(regionId)
let price
addOn.prices.forEach(({ amount, currency_code }) => {
if (!price && currency_code === region.currency_code) {
// If we haven't yet found a price and the current money amount is
// the default money amount for the currency of the region we have found
// a possible price match
price = amount
} else if (region_id === region._id) {
// If the region matches directly with the money amount this is the best
// price
price = amount
}
})
// Return the price if we found a suitable match
if (price !== undefined) {
return price
}
// If we got this far no price could be found for the region
throw new MedusaError(
MedusaError.Types.NOT_FOUND,
`A price for region: ${region.name} could not be found`
)
}
/**
* Decorates a add-on with add-on variants.
* @param {AddOn} addOn - the add-on to decorate.
* @param {string[]} fields - the fields to include.
* @param {string[]} expandFields - fields to expand.
* @return {AddOn} return the decorated add-on.
*/
async decorate(addOn, fields, expandFields = []) {
const requiredFields = ["_id", "metadata"]
const decorated = _.pick(addOn, fields.concat(requiredFields))
if (expandFields.includes("valid_for")) {
decorated.valid_for = await Promise.all(
decorated.valid_for.map(
async (p) => await this.productService_.retrieve(p)
)
)
}
return decorated
}
/**
* Dedicated method to set metadata for an add-on.
* To ensure that plugins does not overwrite each
* others metadata fields, setMetadata is provided.
* @param {string} addOnId - the add-on to decorate.
* @param {string} key - key for metadata field
* @param {string} value - value for metadata field.
* @return {Promise} resolves to the updated result.
*/
async setMetadata(addOnId, key, value) {
const validatedId = this.validateId_(addOnId)
if (typeof key !== "string") {
throw new MedusaError(
MedusaError.Types.INVALID_ARGUMENT,
"Key type is invalid. Metadata keys must be strings"
)
}
const keyPath = `metadata.${key}`
return this.addOnModel_
.updateOne({ _id: validatedId }, { $set: { [keyPath]: value } })
.then((result) => {
this.eventBus_.emit(AddOnService.Events.UPDATED, result)
return result
})
.catch((err) => {
throw new MedusaError(MedusaError.Types.DB_ERROR, err.message)
})
}
}
export default AddOnService

File diff suppressed because it is too large Load Diff

View File

@@ -32,8 +32,7 @@
"medusa-interfaces": "1.x"
},
"dependencies": {
"axios": "^0.20.0",
"mongoose": "^5.8.0"
"axios": "^0.20.0"
},
"gitHead": "41a5425405aea5045a26def95c0dc00cf4a5a44d"
}

View File

@@ -1,13 +0,0 @@
{
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-transform-classes",
"@babel/plugin-transform-instanceof"
],
"presets": ["@babel/preset-env"],
"env": {
"test": {
"plugins": ["@babel/plugin-transform-runtime"]
}
}
}

View File

@@ -1,14 +0,0 @@
dist/
node_modules/
.DS_store
.env*
/*.js
!index.js
yarn.lock
yarn-error.log
/api
/services
/models
/subscribers

View File

@@ -1,225 +0,0 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.1.37](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.36...medusa-plugin-permissions@1.1.37) (2022-01-11)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.36](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.35...medusa-plugin-permissions@1.1.36) (2021-12-29)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.35](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.34...medusa-plugin-permissions@1.1.35) (2021-12-17)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.34](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.33...medusa-plugin-permissions@1.1.34) (2021-12-08)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.33](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.32...medusa-plugin-permissions@1.1.33) (2021-11-23)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.32](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.31...medusa-plugin-permissions@1.1.32) (2021-11-22)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.31](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.30...medusa-plugin-permissions@1.1.31) (2021-11-19)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.30](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.29...medusa-plugin-permissions@1.1.30) (2021-11-19)
### Features
- Typescript for API layer ([#817](https://github.com/medusajs/medusa/issues/817)) ([373532e](https://github.com/medusajs/medusa/commit/373532ecbc8196f47e71af95a8cf82a14a4b1f9e))
## [1.1.29](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.28...medusa-plugin-permissions@1.1.29) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.28](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.27...medusa-plugin-permissions@1.1.28) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.27](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.25...medusa-plugin-permissions@1.1.27) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.26](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.25...medusa-plugin-permissions@1.1.26) (2021-10-18)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.25](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.24...medusa-plugin-permissions@1.1.25) (2021-09-15)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.24](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.23...medusa-plugin-permissions@1.1.24) (2021-09-14)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.23](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.22...medusa-plugin-permissions@1.1.23) (2021-08-05)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.22](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.21...medusa-plugin-permissions@1.1.22) (2021-07-26)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.21](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.19...medusa-plugin-permissions@1.1.21) (2021-07-15)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.20](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.19...medusa-plugin-permissions@1.1.20) (2021-07-15)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.19](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.18...medusa-plugin-permissions@1.1.19) (2021-07-02)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.18](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.17...medusa-plugin-permissions@1.1.18) (2021-06-22)
### Bug Fixes
- release assist ([668e8a7](https://github.com/medusajs/medusa/commit/668e8a740200847fc2a41c91d2979097f1392532))
## [1.1.17](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.16...medusa-plugin-permissions@1.1.17) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.16](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.15...medusa-plugin-permissions@1.1.16) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.15](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.14...medusa-plugin-permissions@1.1.15) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.14](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.13...medusa-plugin-permissions@1.1.14) (2021-06-09)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.13](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.12...medusa-plugin-permissions@1.1.13) (2021-06-08)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.12](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.9...medusa-plugin-permissions@1.1.12) (2021-04-28)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.11](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.10...medusa-plugin-permissions@1.1.11) (2021-04-20)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.10](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.9...medusa-plugin-permissions@1.1.10) (2021-04-20)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.9](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.8...medusa-plugin-permissions@1.1.9) (2021-04-13)
### Bug Fixes
- merge develop ([2982a8e](https://github.com/medusajs/medusa/commit/2982a8e682e90beb4549d969d9d3b04d78a46a2d))
- merge develop ([a468c45](https://github.com/medusajs/medusa/commit/a468c451e82c68f41b5005a2e480057f6124aaa6))
## [1.1.8](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.7...medusa-plugin-permissions@1.1.8) (2021-04-13)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.7](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.6...medusa-plugin-permissions@1.1.7) (2021-03-30)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.6](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.5...medusa-plugin-permissions@1.1.6) (2021-03-17)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.5](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.3...medusa-plugin-permissions@1.1.5) (2021-03-17)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.4](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.3...medusa-plugin-permissions@1.1.4) (2021-03-17)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.3](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.2...medusa-plugin-permissions@1.1.3) (2021-02-17)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.2](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.1...medusa-plugin-permissions@1.1.2) (2021-02-03)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.1.1](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.1.0...medusa-plugin-permissions@1.1.1) (2021-01-27)
**Note:** Version bump only for package medusa-plugin-permissions
# [1.1.0](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.0.13...medusa-plugin-permissions@1.1.0) (2021-01-26)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.0.13](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.0.12...medusa-plugin-permissions@1.0.13) (2020-12-17)
**Note:** Version bump only for package medusa-plugin-permissions
## [1.0.12](https://github.com/medusajs/medusa/compare/medusa-plugin-permissions@1.0.11...medusa-plugin-permissions@1.0.12) (2020-11-24)
**Note:** Version bump only for package medusa-plugin-permissions
## 1.0.11 (2020-10-19)
## 1.0.10 (2020-09-09)
### Bug Fixes
- updates license ([db519fb](https://github.com/medusajs/medusa/commit/db519fbaa6f8ad02c19cbecba5d4f28ba1ee81aa))
## 1.0.7 (2020-09-07)
## 1.0.1 (2020-09-05)
## 1.0.1-beta.0 (2020-09-04)
# 1.0.0 (2020-09-03)
# 1.0.0-alpha.30 (2020-08-28)
# 1.0.0-alpha.27 (2020-08-27)
# 1.0.0-alpha.26 (2020-08-27)
# 1.0.0-alpha.24 (2020-08-27)
# 1.0.0-alpha.3 (2020-08-20)
# 1.0.0-alpha.2 (2020-08-20)
# 1.0.0-alpha.1 (2020-08-20)
# 1.0.0-alpha.0 (2020-08-20)
### Reverts
- Revert "[medusa-interfaces] : Adds decorator functionality to BaseService (#39)" (#41) ([2273cc5](https://github.com/medusajs/medusa/commit/2273cc519ad4d6ae16157173aba3955d16745e1d)), closes [#39](https://github.com/medusajs/medusa/issues/39) [#41](https://github.com/medusajs/medusa/issues/41)
## [1.0.10](https://github.com/medusajs/medusa/compare/v1.0.9...v1.0.10) (2020-09-09)
### Bug Fixes
- updates license ([db519fb](https://github.com/medusajs/medusa/commit/db519fbaa6f8ad02c19cbecba5d4f28ba1ee81aa))

View File

@@ -1,40 +0,0 @@
{
"name": "medusa-plugin-permissions",
"version": "1.1.37",
"description": "Role permission for Medusa core",
"main": "dist/index.js",
"repository": {
"type": "git",
"url": "https://github.com/medusajs/medusa",
"directory": "packages/medusa-plugin-permissions"
},
"scripts": {
"build": "babel src --out-dir . --ignore **/__tests__",
"prepare": "cross-env NODE_ENV=production npm run build",
"watch": "babel -w src --out-dir . --ignore **/__tests__",
"test": "jest"
},
"author": "Oliver Juhl",
"license": "MIT",
"devDependencies": {
"@babel/cli": "^7.7.5",
"@babel/core": "^7.7.5",
"@babel/plugin-proposal-class-properties": "^7.7.4",
"@babel/plugin-transform-classes": "^7.9.5",
"@babel/plugin-transform-instanceof": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.7.6",
"@babel/preset-env": "^7.7.5",
"@babel/runtime": "^7.7.6",
"cross-env": "^5.2.1",
"jest": "^25.5.2"
},
"peerDependencies": {
"medusa-interfaces": "1.x"
},
"dependencies": {
"medusa-core-utils": "^1.1.31",
"medusa-test-utils": "^1.1.37",
"mongoose": "^5.8.0"
},
"gitHead": "c46300d58fbfd0b2dc2c02745ae143e6247e885b"
}

View File

@@ -1,16 +0,0 @@
// This middleware is injected to ensure authorization of requests
// Since this middleware uses the user object on the request, this should be
// injected after authentication in the core middleware, hence we name
// the middleware postAuth.
export default {
postAuthentication: () => {
return (err, req, res, next) => {
const permissionService = req.scope.resolve("permissionService")
if (permissionService.hasPermission(req.user, req.method, req.path)) {
next()
} else {
res.status(422)
}
}
}
}

View File

@@ -1,36 +0,0 @@
import { IdMap } from "medusa-test-utils"
export const permissions = {
productEditorPermission: {
_id: IdMap.getId("product_editor"),
name: "product_editor",
permissions: [
{
method: "POST",
endpoint: "/products",
},
{
method: "GET",
endpoint: "/products",
},
{
method: "PUT",
endpoint: "/products",
},
],
},
}
export const RoleModelMock = {
create: jest.fn().mockReturnValue(Promise.resolve()),
deleteOne: jest.fn().mockReturnValue(Promise.resolve()),
findOne: jest.fn().mockImplementation(query => {
if (query.name === "product_editor") {
return Promise.resolve(permissions.productEditorPermission)
}
return Promise.resolve(undefined)
}),
updateOne: jest.fn().mockImplementation((query, update) => {
return Promise.resolve()
}),
}

View File

@@ -1,13 +0,0 @@
import { BaseModel } from "medusa-interfaces"
import PermissionSchema from "./schemas/permission"
class RoleModel extends BaseModel {
static modelName = "Role"
static schema = {
name: { type: String, required: true, unique: true },
permissions: { type: [PermissionSchema], required: true, default: [] },
}
}
export default RoleModel

View File

@@ -1,6 +0,0 @@
import mongoose from "mongoose"
export default new mongoose.Schema({
method: { type: String },
endpoint: { type: String },
})

View File

@@ -1,162 +0,0 @@
import { BaseService } from "medusa-interfaces"
import { Validator, MedusaError } from "medusa-core-utils"
class PermissionService extends BaseService {
constructor({ userService, roleModel }) {
super()
/** @private @const {UserService} */
this.userService_ = userService
/** @private @const {RoleModel} */
this.roleModel_ = roleModel
}
validatePermission_(permission) {
const schema = Validator.object({
method: Validator.string().valid(
"POST",
"GET",
"PUT",
"PATCH",
"DELETE",
"CONNECT",
"OPTIONS",
"HEAD",
"TRACE"
),
endpoint: Validator.string(),
})
const { value, error } = schema.validate(permission)
if (error) {
throw new MedusaError(
MedusaError.Types.INVALID_ARGUMENT,
"Permission is not valid"
)
}
return value
}
async retrieveRole(name) {
const role = await this.roleModel_.findOne({ name }).catch((err) => {
throw new MedusaError(MedusaError.Types.DB_ERROR, err.message)
})
if (!role) {
throw new MedusaError(
MedusaError.Types.NOT_FOUND,
`${name} does not exist. Use method createRole to create it.`
)
}
return role
}
async hasPermission(user, method, endpoint) {
if (!user) return false
for (let i = 0; i < user.metadata.roles.length; i++) {
const role = user.metadata.roles[i]
const permissions = await this.retrieveRole(role)
return permissions.permissions.some((action) => {
return action.method === method && action.endpoint === endpoint
})
}
return false
}
async createRole(roleName, permissions) {
const validatedPermissions = permissions.map((permission) =>
this.validatePermission_(permission)
)
return this.retrieveRole(roleName)
.then((role) => {
throw new MedusaError(
MedusaError.Types.INVALID_ARGUMENT,
`${role.name} already exists`
)
})
.catch((error) => {
if (error.name === MedusaError.Types.NOT_FOUND) {
return this.roleModel_.create({
name: roleName,
permissions: validatedPermissions,
})
} else {
throw error
}
})
}
async deleteRole(roleName) {
const role = await this.retrieve(roleName)
// Delete is idempotent, but we return a promise to allow then-chaining
if (!role) {
return Promise.resolve()
}
return this.roleModel_
.deleteOne({
_id: role._id,
})
.catch((err) => {
throw new MedusaError(MedusaError.Types.DB_ERROR, err.message)
})
}
async addPermission(roleName, permission) {
const role = await this.retrieveRole(roleName)
const validatedPermission = this.validatePermission_(permission)
return this.roleModel_.updateOne(
{ _id: role._id },
{ $push: { permissions: validatedPermission } }
)
}
async removePermission(roleName, permission) {
const role = await this.retrieveRole(roleName)
const validatedPermission = this.validatePermission_(permission)
return this.roleModel_.updateOne(
{ _id: role._id },
{ $pull: { permissions: validatedPermission } }
)
}
async grantRole(userId, roleName) {
const role = await this.retrieveRole(roleName)
const user = await this.userService_.retrieve(userId)
if (!user.metadata.roles) {
return this.userService_.setMetadata(userId, "roles", [roleName])
}
if (user.metadata.roles.includes(role.name)) {
throw new MedusaError(
MedusaError.Types.DB_ERROR,
`User already has role: ${role.name}`
)
}
user.metadata.roles.push(roleName)
return this.userService_.setMetadata(userId, "roles", user.metadata.roles)
}
async revokeRole(userId, roleName) {
const user = await this.userService_.retrieve(userId)
if (!user.metadata.roles || !user.metadata.roles.includes(roleName)) {
// revokeRole is idempotent, we return a promise to allow then-chaining
return Promise.resolve()
}
// remove role from metadata.roles
const newRoles = user.metadata.roles.filter((r) => r !== roleName)
return this.userService_.setMetadata(userId, "roles", newRoles)
}
}
export default PermissionService

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,3 @@
import mongoose from "mongoose"
import { IdMap } from "medusa-test-utils"
import MiddlewareService from "../middleware"
describe("MiddlewareService", () => {

View File

@@ -1,11 +1,11 @@
import { BaseService } from "medusa-interfaces"
import { MedusaError } from "medusa-core-utils"
import { BaseService } from "medusa-interfaces"
import { v4 } from "uuid"
const KEY_LOCKED_TIMEOUT = 1000
class IdempotencyKeyService extends BaseService {
constructor({ manager, idempotencyKeyRepository, transactionService }) {
constructor({ manager, idempotencyKeyRepository }) {
super()
/** @private @constant {EntityManager} */
@@ -13,9 +13,6 @@ class IdempotencyKeyService extends BaseService {
/** @private @constant {IdempotencyKeyRepository} */
this.idempotencyKeyRepository_ = idempotencyKeyRepository
/** @private @constant {TransactionService} */
this.transactionService_ = transactionService
}
/**
@@ -88,7 +85,6 @@ class IdempotencyKeyService extends BaseService {
/**
* Locks an idempotency.
* @param {string} idempotencyKey - key to lock
* @param {object} session - mongoose transaction session
* @return {Promise} result of the update operation
*/
async lock(idempotencyKey) {

View File

@@ -1,15 +1,16 @@
export { default as AuthService } from "./auth"
export { default as BatchJobService } from "./batch-job"
export { default as CartService } from "./cart"
export { default as ClaimService } from "./claim"
export { default as ClaimItemService } from "./claim-item"
export { default as ClaimService } from "./claim"
export { default as CustomShippingOptionService } from "./custom-shipping-option"
export { default as CustomerService } from "./customer"
export { default as CustomerGroupService } from "./customer-group"
export { default as CustomerService } from "./customer"
export { default as DiscountService } from "./discount"
export { default as DraftOrderService } from "./draft-order"
export { default as EventBusService } from "./event-bus"
export { default as FulfillmentService } from "./fulfillment"
export { default as FulfillmentProviderService } from "./fulfillment-provider"
export { default as FulfillmentService } from "./fulfillment"
export { default as GiftCardService } from "./gift-card"
export { default as IdempotencyKeyService } from "./idempotency-key"
export { default as InventoryService } from "./inventory"
@@ -20,25 +21,23 @@ export { default as NotificationService } from "./notification"
export { default as OauthService } from "./oauth"
export { default as OrderService } from "./order"
export { default as PaymentProviderService } from "./payment-provider"
export { default as ProductService } from "./product"
export { default as PricingService } from "./pricing"
export { default as ProductCollectionService } from "./product-collection"
export { default as ProductService } from "./product"
export { default as ProductTypeService } from "./product-type"
export { default as ProductVariantService } from "./product-variant"
export { default as QueryBuilderService } from "./query-builder"
export { default as RegionService } from "./region"
export { default as ReturnService } from "./return"
export { default as ReturnReasonService } from "./return-reason"
export { default as ReturnService } from "./return"
export { default as SearchService } from "./search"
export { default as ShippingOptionService } from "./shipping-option"
export { default as ShippingProfileService } from "./shipping-profile"
export { default as StoreService } from "./store"
export { default as StrategyResolverService } from "./strategy-resolver"
export { default as SwapService } from "./swap"
export { default as SystemPaymentProviderService } from "./system-payment-provider"
export { default as TotalsService } from "./totals"
export { default as TransactionService } from "./transaction"
export { default as UserService } from "./user"
export { default as TaxRateService } from "./tax-rate"
export { default as TaxProviderService } from "./tax-provider"
export { default as ProductTypeService } from "./product-type"
export { default as PricingService } from "./pricing"
export { default as BatchJobService } from "./batch-job"
export { default as StrategyResolverService } from "./strategy-resolver"
export { default as TaxRateService } from "./tax-rate"
export { default as TotalsService } from "./totals"
export { default as UserService } from "./user"

View File

@@ -1,14 +0,0 @@
import { BaseService } from "medusa-interfaces"
import mongoose from "mongoose"
class TransactionService extends BaseService {
constructor() {
super()
}
async createSession() {
return mongoose.startSession()
}
}
export default TransactionService

192
yarn.lock
View File

@@ -7629,13 +7629,6 @@
"@types/connect" "*"
"@types/node" "*"
"@types/bson@*", "@types/bson@1.x || 4.0.x":
version "4.0.5"
resolved "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz"
integrity sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==
dependencies:
"@types/node" "*"
"@types/cacheable-request@^6.0.1":
version "6.0.2"
resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz"
@@ -8003,14 +7996,6 @@
dependencies:
"@types/node" "*"
"@types/mongodb@^3.5.27":
version "3.6.20"
resolved "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz"
integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==
dependencies:
"@types/bson" "*"
"@types/node" "*"
"@types/multer@^1.4.7":
version "1.4.7"
resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e"
@@ -10382,14 +10367,6 @@ bindings@^1.5.0:
dependencies:
file-uri-to-path "1.0.0"
bl@^2.2.1:
version "2.2.1"
resolved "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz"
integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
bl@^4.0.0, bl@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz"
@@ -10399,11 +10376,6 @@ bl@^4.0.0, bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
bluebird@3.5.1:
version "3.5.1"
resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz"
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
bluebird@^3.3.5, bluebird@^3.4.0, bluebird@^3.4.1, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2:
version "3.7.2"
resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
@@ -10706,11 +10678,6 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
bson@^1.1.4:
version "1.1.6"
resolved "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz"
integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==
btoa-lite@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz"
@@ -12995,11 +12962,6 @@ denque@^1.1.0, denque@^1.5.0:
resolved "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz"
integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==
denque@^1.4.1:
version "1.5.0"
resolved "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz"
integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==
depd@^1.1.2, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
@@ -19628,11 +19590,6 @@ jws@^3.2.2:
jwa "^1.4.1"
safe-buffer "^5.0.1"
kareem@2.3.2:
version "2.3.2"
resolved "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz"
integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==
keygrip@~1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz"
@@ -20806,11 +20763,6 @@ memory-fs@^0.5.0:
errno "^0.1.3"
readable-stream "^2.0.1"
memory-pager@^1.0.2:
version "1.5.0"
resolved "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz"
integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
meow@^3.3.0:
version "3.7.0"
resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz"
@@ -21291,76 +21243,6 @@ moment-timezone@^0.5.31:
resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
mongodb@3.6.11:
version "3.6.11"
resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz"
integrity sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==
dependencies:
bl "^2.2.1"
bson "^1.1.4"
denque "^1.4.1"
optional-require "^1.0.3"
safe-buffer "^5.1.2"
optionalDependencies:
saslprep "^1.0.0"
mongodb@3.7.3:
version "3.7.3"
resolved "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz"
integrity sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==
dependencies:
bl "^2.2.1"
bson "^1.1.4"
denque "^1.4.1"
optional-require "^1.1.8"
safe-buffer "^5.1.2"
optionalDependencies:
saslprep "^1.0.0"
mongoose-legacy-pluralize@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz"
integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==
mongoose@^5.10.15:
version "5.13.7"
resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz"
integrity sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==
dependencies:
"@types/mongodb" "^3.5.27"
bson "^1.1.4"
kareem "2.3.2"
mongodb "3.6.11"
mongoose-legacy-pluralize "1.0.2"
mpath "0.8.3"
mquery "3.2.5"
ms "2.1.2"
optional-require "1.0.x"
regexp-clone "1.0.0"
safe-buffer "5.2.1"
sift "13.5.2"
sliced "1.0.1"
mongoose@^5.8.0:
version "5.13.14"
resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.14.tgz"
integrity sha512-j+BlQjjxgZg0iWn42kLeZTB91OejcxWpY2Z50bsZTiKJ7HHcEtcY21Godw496GMkBqJMTzmW7G/kZ04mW+Cb7Q==
dependencies:
"@types/bson" "1.x || 4.0.x"
"@types/mongodb" "^3.5.27"
bson "^1.1.4"
kareem "2.3.2"
mongodb "3.7.3"
mongoose-legacy-pluralize "1.0.2"
mpath "0.8.4"
mquery "3.2.5"
ms "2.1.2"
optional-require "1.0.x"
regexp-clone "1.0.0"
safe-buffer "5.2.1"
sift "13.5.2"
sliced "1.0.1"
morgan@^1.9.1:
version "1.10.0"
resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz"
@@ -21384,27 +21266,6 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
mpath@0.8.3:
version "0.8.3"
resolved "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz"
integrity sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==
mpath@0.8.4:
version "0.8.4"
resolved "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz"
integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==
mquery@3.2.5:
version "3.2.5"
resolved "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz"
integrity sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==
dependencies:
bluebird "3.5.1"
debug "3.1.0"
regexp-clone "^1.0.0"
safe-buffer "5.1.2"
sliced "1.0.1"
mri@^1.1.0:
version "1.1.6"
resolved "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz"
@@ -22379,25 +22240,6 @@ opentracing@^0.14.5:
resolved "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz"
integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==
optional-require@1.0.x:
version "1.0.3"
resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz"
integrity sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==
optional-require@^1.0.3:
version "1.1.7"
resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.1.7.tgz"
integrity sha512-cIeRZocXsZnZYn+SevbtSqNlLbeoS4mLzuNn4fvXRMDRNhTGg0sxuKXl0FnZCtnew85LorNxIbZp5OeliILhMw==
dependencies:
require-at "^1.0.6"
optional-require@^1.1.8:
version "1.1.8"
resolved "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz"
integrity sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==
dependencies:
require-at "^1.0.6"
optionator@^0.8.1, optionator@^0.8.3:
version "0.8.3"
resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz"
@@ -25056,11 +24898,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
regexp-clone@1.0.0, regexp-clone@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz"
integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==
regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1:
version "1.3.1"
resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz"
@@ -25399,11 +25236,6 @@ request@2.88.2, request@^2.88.0:
tunnel-agent "^0.6.0"
uuid "^3.3.2"
require-at@^1.0.6:
version "1.0.6"
resolved "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz"
integrity sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
@@ -25828,13 +25660,6 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
saslprep@^1.0.0:
version "1.0.3"
resolved "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz"
integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
dependencies:
sparse-bitfield "^3.0.3"
sax@1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz"
@@ -26208,11 +26033,6 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
sift@13.5.2:
version "13.5.2"
resolved "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz"
integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==
signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.3"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz"
@@ -26317,11 +26137,6 @@ slice-ansi@^4.0.0:
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
sliced@1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz"
integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
slide@^1.1.6:
version "1.1.6"
resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz"
@@ -26546,13 +26361,6 @@ space-separated-tokens@^1.0.0:
resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz"
integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
sparse-bitfield@^3.0.3:
version "3.0.3"
resolved "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz"
integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
dependencies:
memory-pager "^1.0.2"
spawndamnit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad"