Adds Store Service to control store settings (#76)
Also adds support for `projectConfig.admin_cors` & `projectConfig.store_cors`
This commit is contained in:
@@ -4,11 +4,11 @@ import store from "./routes/store"
|
||||
import errorHandler from "./middlewares/error-handler"
|
||||
|
||||
// guaranteed to get dependencies
|
||||
export default container => {
|
||||
export default (container, config) => {
|
||||
const app = Router()
|
||||
|
||||
admin(app, container)
|
||||
store(app, container)
|
||||
admin(app, container, config)
|
||||
store(app, container, config)
|
||||
|
||||
app.use(errorHandler())
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { Router } from "express"
|
||||
import cors from "cors"
|
||||
|
||||
import middlewares from "../../middlewares"
|
||||
import authRoutes from "./auth"
|
||||
import productRoutes from "./products"
|
||||
@@ -8,17 +10,25 @@ import shippingOptionRoutes from "./shipping-options"
|
||||
import shippingProfileRoutes from "./shipping-profiles"
|
||||
import discountRoutes from "./discounts"
|
||||
import orderRoutes from "./orders"
|
||||
import storeRoutes from "./store"
|
||||
|
||||
const route = Router()
|
||||
|
||||
export default (app, container) => {
|
||||
const middlewareService = container.resolve("middlewareService")
|
||||
|
||||
export default (app, container, config) => {
|
||||
app.use("/admin", route)
|
||||
|
||||
const adminCors = config.admin_cors || ""
|
||||
route.use(
|
||||
cors({
|
||||
origin: adminCors.split(","),
|
||||
credentials: true,
|
||||
})
|
||||
)
|
||||
|
||||
// Unauthenticated routes
|
||||
authRoutes(route)
|
||||
|
||||
const middlewareService = container.resolve("middlewareService")
|
||||
// Calls all middleware that has been registered to run before authentication.
|
||||
middlewareService.usePreAuthentication(app)
|
||||
|
||||
@@ -35,6 +45,8 @@ export default (app, container) => {
|
||||
shippingProfileRoutes(route)
|
||||
discountRoutes(route)
|
||||
orderRoutes(route)
|
||||
productVariantRoutes(route)
|
||||
storeRoutes(route)
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { StoreServiceMock } from "../../../../../services/__mocks__/store"
|
||||
|
||||
describe("POST /admin/store/currencies/:currency_code", () => {
|
||||
describe("successful addition", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request("POST", `/admin/store/currencies/dkk`, {
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("returns 200", () => {
|
||||
expect(subject.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("calls service retrieve", () => {
|
||||
expect(StoreServiceMock.addCurrency).toHaveBeenCalledTimes(1)
|
||||
expect(StoreServiceMock.addCurrency).toHaveBeenCalledWith("dkk")
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,28 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { StoreServiceMock } from "../../../../../services/__mocks__/store"
|
||||
|
||||
describe("GET /admin/store", () => {
|
||||
describe("successful addition", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request("GET", `/admin/store`, {
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("returns 200", () => {
|
||||
expect(subject.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("calls service retrieve", () => {
|
||||
expect(StoreServiceMock.retrieve).toHaveBeenCalledTimes(1)
|
||||
expect(StoreServiceMock.retrieve).toHaveBeenCalledWith()
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,28 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { StoreServiceMock } from "../../../../../services/__mocks__/store"
|
||||
|
||||
describe("DELETE /admin/store/currencies/:currency_code", () => {
|
||||
describe("successful addition", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request("DELETE", `/admin/store/currencies/dkk`, {
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("returns 200", () => {
|
||||
expect(subject.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("calls service retrieve", () => {
|
||||
expect(StoreServiceMock.removeCurrency).toHaveBeenCalledTimes(1)
|
||||
expect(StoreServiceMock.removeCurrency).toHaveBeenCalledWith("dkk")
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,63 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { StoreServiceMock } from "../../../../../services/__mocks__/store"
|
||||
|
||||
describe("POST /admin/store", () => {
|
||||
describe("successful creation", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
jest.clearAllMocks()
|
||||
subject = await request("POST", "/admin/store", {
|
||||
payload: {
|
||||
name: "New Name",
|
||||
},
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("returns 200", () => {
|
||||
expect(subject.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("calls service update", () => {
|
||||
expect(StoreServiceMock.update).toHaveBeenCalledTimes(1)
|
||||
expect(StoreServiceMock.update).toHaveBeenCalledWith({
|
||||
name: "New Name",
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("successful creation", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
jest.clearAllMocks()
|
||||
subject = await request("POST", "/admin/store", {
|
||||
payload: {
|
||||
currencies: ["DKK", "USD"],
|
||||
},
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("returns 200", () => {
|
||||
expect(subject.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("calls service update", () => {
|
||||
expect(StoreServiceMock.update).toHaveBeenCalledTimes(1)
|
||||
expect(StoreServiceMock.update).toHaveBeenCalledWith({
|
||||
currencies: ["DKK", "USD"],
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,11 @@
|
||||
export default async (req, res) => {
|
||||
const { currency_code } = req.params
|
||||
|
||||
try {
|
||||
const storeService = req.scope.resolve("storeService")
|
||||
const data = await storeService.addCurrency(currency_code)
|
||||
res.status(200).json({ store: data })
|
||||
} catch (err) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default async (req, res) => {
|
||||
try {
|
||||
const storeService = req.scope.resolve("storeService")
|
||||
const data = await storeService.retrieve()
|
||||
res.status(200).json({ store: data })
|
||||
} catch (err) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { Router } from "express"
|
||||
import middlewares from "../../../middlewares"
|
||||
|
||||
const route = Router()
|
||||
|
||||
export default app => {
|
||||
app.use("/store", route)
|
||||
|
||||
route.get("/", middlewares.wrap(require("./get-store").default))
|
||||
route.post("/", middlewares.wrap(require("./update-store").default))
|
||||
route.post(
|
||||
"/currencies/:currency_code",
|
||||
middlewares.wrap(require("./add-currency").default)
|
||||
)
|
||||
route.delete(
|
||||
"/currencies/:currency_code",
|
||||
middlewares.wrap(require("./remove-currency").default)
|
||||
)
|
||||
|
||||
return app
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
export default async (req, res) => {
|
||||
const { currency_code } = req.params
|
||||
|
||||
try {
|
||||
const storeService = req.scope.resolve("storeService")
|
||||
const data = await storeService.removeCurrency(currency_code)
|
||||
res.status(200).json({ store: data })
|
||||
} catch (err) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { MedusaError, Validator } from "medusa-core-utils"
|
||||
|
||||
export default async (req, res) => {
|
||||
const schema = Validator.object().keys({
|
||||
name: Validator.string(),
|
||||
currencies: Validator.array().items(Validator.string()),
|
||||
})
|
||||
|
||||
const { value, error } = schema.validate(req.body)
|
||||
if (error) {
|
||||
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
|
||||
}
|
||||
|
||||
try {
|
||||
const storeService = req.scope.resolve("storeService")
|
||||
const data = await storeService.update(value)
|
||||
res.status(200).json({ store: data })
|
||||
} catch (err) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Router } from "express"
|
||||
import cors from "cors"
|
||||
|
||||
import productRoutes from "./products"
|
||||
import cartRoutes from "./carts"
|
||||
@@ -8,9 +9,17 @@ import shippingOptionRoutes from "./shipping-options"
|
||||
|
||||
const route = Router()
|
||||
|
||||
export default app => {
|
||||
export default (app, container, config) => {
|
||||
app.use("/store", route)
|
||||
|
||||
const storeCors = config.store_cors || ""
|
||||
route.use(
|
||||
cors({
|
||||
origin: storeCors.split(","),
|
||||
credentials: true,
|
||||
})
|
||||
)
|
||||
|
||||
customerRoutes(route)
|
||||
productRoutes(route)
|
||||
orderRoutes(route)
|
||||
|
||||
Reference in New Issue
Block a user