diff --git a/examples/getstarted/src/api/address/content-types/address/lifecycles.js b/examples/getstarted/src/api/address/content-types/address/lifecycles.js new file mode 100644 index 0000000000..85b67425c5 --- /dev/null +++ b/examples/getstarted/src/api/address/content-types/address/lifecycles.js @@ -0,0 +1,9 @@ +const { requestContext } = require('@strapi/strapi'); + +module.exports = { + beforeCreate() { + const store = requestContext.getStore(); + + console.log('User info in service: ', store.auth); + }, +}; diff --git a/examples/getstarted/src/api/address/routes/address.js b/examples/getstarted/src/api/address/routes/address.js index c9da1c88db..549918452d 100755 --- a/examples/getstarted/src/api/address/routes/address.js +++ b/examples/getstarted/src/api/address/routes/address.js @@ -5,7 +5,7 @@ const { createCoreRouter } = require('@strapi/strapi').factories; module.exports = createCoreRouter('api::address.address', { config: { find: { - auth: false, + // auth: false, }, }, only: ['find', 'findOne'], diff --git a/packages/core/strapi/lib/index.js b/packages/core/strapi/lib/index.js index 0c7a6afbeb..9e8f257169 100644 --- a/packages/core/strapi/lib/index.js +++ b/packages/core/strapi/lib/index.js @@ -3,6 +3,7 @@ const Strapi = require('./Strapi'); Strapi.factories = require('./factories'); +Strapi.requestContext = require('./services/request-context'); Strapi.compile = require('./compile'); module.exports = Strapi; diff --git a/packages/core/strapi/lib/services/auth/index.js b/packages/core/strapi/lib/services/auth/index.js index c42f45efd4..eab4c078e8 100644 --- a/packages/core/strapi/lib/services/auth/index.js +++ b/packages/core/strapi/lib/services/auth/index.js @@ -4,6 +4,7 @@ const { strict: assert } = require('assert'); const { has, prop } = require('lodash/fp'); const { UnauthorizedError } = require('@strapi/utils').errors; +const requestCtx = require('../request-context'); const INVALID_STRATEGY_MSG = 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}'; @@ -60,6 +61,9 @@ const createAuthentication = () => { credentials, }; + const store = requestCtx.getStore(); + store.auth = ctx.state.auth; + return next(); } } diff --git a/packages/core/strapi/lib/services/request-context.js b/packages/core/strapi/lib/services/request-context.js new file mode 100644 index 0000000000..d58c626fcd --- /dev/null +++ b/packages/core/strapi/lib/services/request-context.js @@ -0,0 +1,5 @@ +'use strict'; + +const { AsyncLocalStorage } = require('async_hooks'); + +module.exports = new AsyncLocalStorage(); diff --git a/packages/core/strapi/lib/services/server/index.js b/packages/core/strapi/lib/services/server/index.js index 633f6da812..a84e16e054 100644 --- a/packages/core/strapi/lib/services/server/index.js +++ b/packages/core/strapi/lib/services/server/index.js @@ -9,6 +9,7 @@ const { createContentAPI } = require('./content-api'); const registerAllRoutes = require('./register-routes'); const registerApplicationMiddlewares = require('./register-middlewares'); const createKoaApp = require('./koa'); +const requestCtx = require('../request-context'); const healthCheck = async (ctx) => { ctx.set('strapi', 'You are so French!'); @@ -33,6 +34,20 @@ const createServer = (strapi) => { keys: strapi.config.get('server.app.keys'), }); + app.use(async (ctx, next) => { + const store = { + foo: 'bar', + }; + + // TODO: handle errors + await new Promise((res) => { + requestCtx.run(store, async () => { + await next(); + res(); + }); + }); + }); + const router = new Router(); const routeManager = createRouteManager(strapi);