Adds Store Service to control store settings (#76)

Also adds support for `projectConfig.admin_cors` & `projectConfig.store_cors`
This commit is contained in:
Sebastian Rindom
2020-06-29 10:23:24 +02:00
committed by GitHub
parent ef43fb2030
commit bc5ff91a02
28 changed files with 1000 additions and 27 deletions
+3 -3
View File
@@ -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())
+15 -3
View File
@@ -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
}
}
+10 -1
View File
@@ -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)