diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f02f223283..9544cd1e84 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -88,16 +88,16 @@ yarn develop
The server (API) is available at http://localhost:1337
-**WARNING** ⚠️ If you've followed the recommended setup, you should not be able to reach the administration panel at http://localhost:1337/admin.
+The built administration panel is available at http://localhost:1337/admin
-**Start the administration panel server**
+**Start the administration panel server for development**
-```bash
-cd strapi/packages/strapi-admin
-yarn develop
-```
+```bash
+cd strapi/packages/strapi-admin
+yarn develop
+```
-The administration panel is available at http://localhost:4000/admin
+The administration panel will be available at http://localhost:4000/admin
**Awesome! You are now able to contribute to Strapi.**
diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js
index 17ec6bea68..bf94fa8d9a 100644
--- a/docs/.vuepress/config.js
+++ b/docs/.vuepress/config.js
@@ -2,8 +2,16 @@ module.exports = {
title: 'Strapi Documentation',
description: 'The headless CMS developers love.',
base: '/documentation/',
- ga: 'UA-54313258-1',
- plugins: ['@vuepress/medium-zoom', 'vuepress-plugin-element-tabs'],
+ plugins: [
+ '@vuepress/medium-zoom',
+ 'vuepress-plugin-element-tabs',
+ [
+ '@vuepress/google-analytics',
+ {
+ ga: 'UA-54313258-1',
+ },
+ ],
+ ],
head: [
[
'link',
@@ -116,7 +124,7 @@ module.exports = {
},
{
text: 'Website',
- link: 'https://strapi',
+ link: 'https://strapi.io',
},
{
text: 'Slack',
diff --git a/docs/.vuepress/theme/components/Navbar.vue b/docs/.vuepress/theme/components/Navbar.vue
index 88113a3ad2..ce237b3e55 100644
--- a/docs/.vuepress/theme/components/Navbar.vue
+++ b/docs/.vuepress/theme/components/Navbar.vue
@@ -20,6 +20,18 @@
>{{ $siteTitle }}
+
+ Deprecated docs -
+
+ current version
+
+
+
{
strapiVersion: require('../package.json').version,
debug: cliArguments.debug !== undefined,
quick: cliArguments.quickstart !== undefined,
+ docker: process.env.DOCKER === 'true',
uuid: uuid(),
deviceId: machineIdSync(),
tmpPath,
@@ -65,6 +66,7 @@ module.exports = (projectDirectory, cliArguments) => {
os_release: os.release(),
strapi_version: scope.strapiVersion,
node_version: process.version,
+ docker: scope.docker,
};
Object.keys(tags).forEach(tag => {
diff --git a/packages/strapi-generate-new/lib/utils/usage.js b/packages/strapi-generate-new/lib/utils/usage.js
index 4c3c9a3b4d..7ab53581fa 100644
--- a/packages/strapi-generate-new/lib/utils/usage.js
+++ b/packages/strapi-generate-new/lib/utils/usage.js
@@ -70,6 +70,7 @@ function trackError({ scope, error }) {
release: os.release(),
version: scope.strapiVersion,
nodeVersion: process.version,
+ docker: scope.docker,
},
});
} catch (err) {
@@ -90,6 +91,7 @@ function trackUsage({ event, scope, error }) {
os_release: os.release(),
node_version: process.version,
version: scope.strapiVersion,
+ docker: scope.docker,
},
});
} catch (err) {
diff --git a/packages/strapi-generate-new/package.json b/packages/strapi-generate-new/package.json
index 39f46bc344..bfc67c4357 100644
--- a/packages/strapi-generate-new/package.json
+++ b/packages/strapi-generate-new/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-generate-new",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Generate a new Strapi application.",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-generate-plugin/package.json b/packages/strapi-generate-plugin/package.json
index 360db7c26c..7fa8e4ad97 100644
--- a/packages/strapi-generate-plugin/package.json
+++ b/packages/strapi-generate-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-generate-plugin",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Generate an plugin for a Strapi application.",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-generate-policy/package.json b/packages/strapi-generate-policy/package.json
index 87cd37c59d..fc5246fdcd 100644
--- a/packages/strapi-generate-policy/package.json
+++ b/packages/strapi-generate-policy/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-generate-policy",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Generate a policy for a Strapi API.",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-generate-service/package.json b/packages/strapi-generate-service/package.json
index dbbfdefdc9..50217ee290 100644
--- a/packages/strapi-generate-service/package.json
+++ b/packages/strapi-generate-service/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-generate-service",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Generate a service for a Strapi API.",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-generate/package.json b/packages/strapi-generate/package.json
index 99d873147d..eb82a5fea3 100644
--- a/packages/strapi-generate/package.json
+++ b/packages/strapi-generate/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-generate",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Master of ceremonies for the Strapi generators.",
"homepage": "http://strapi.io",
"keywords": [
@@ -20,7 +20,7 @@
"fs-extra": "^8.0.1",
"lodash": "^4.17.11",
"reportback": "^2.0.2",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-utils": "3.0.0-beta.17.8"
},
"author": {
"name": "Strapi team",
diff --git a/packages/strapi-helper-plugin/package.json b/packages/strapi-helper-plugin/package.json
index 0ea3b12419..26eb6ed971 100644
--- a/packages/strapi-helper-plugin/package.json
+++ b/packages/strapi-helper-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-helper-plugin",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Helper for Strapi plugins development",
"files": [
"dist"
diff --git a/packages/strapi-hook-bookshelf/package.json b/packages/strapi-hook-bookshelf/package.json
index 605e5bdc22..f2dba45204 100644
--- a/packages/strapi-hook-bookshelf/package.json
+++ b/packages/strapi-hook-bookshelf/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-hook-bookshelf",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Bookshelf hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
@@ -22,8 +22,8 @@
"lodash": "^4.17.11",
"pluralize": "^7.0.0",
"rimraf": "^2.6.3",
- "strapi-hook-knex": "3.0.0-beta.17.6",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-hook-knex": "3.0.0-beta.17.8",
+ "strapi-utils": "3.0.0-beta.17.8"
},
"strapi": {
"dependencies": [
diff --git a/packages/strapi-hook-ejs/package.json b/packages/strapi-hook-ejs/package.json
index b92d68ef06..d0bae85197 100644
--- a/packages/strapi-hook-ejs/package.json
+++ b/packages/strapi-hook-ejs/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-hook-ejs",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "EJS hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-hook-knex/package.json b/packages/strapi-hook-knex/package.json
index 8ec8a53361..a81cab5d41 100644
--- a/packages/strapi-hook-knex/package.json
+++ b/packages/strapi-hook-knex/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-hook-knex",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Knex hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-hook-mongoose/package.json b/packages/strapi-hook-mongoose/package.json
index c527eda986..6e04d4f9b8 100644
--- a/packages/strapi-hook-mongoose/package.json
+++ b/packages/strapi-hook-mongoose/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-hook-mongoose",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Mongoose hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
@@ -20,7 +20,7 @@
"mongoose-float": "^1.0.4",
"mongoose-long": "^0.2.1",
"pluralize": "^7.0.0",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-utils": "3.0.0-beta.17.8"
},
"author": {
"email": "hi@strapi.io",
diff --git a/packages/strapi-hook-redis/package.json b/packages/strapi-hook-redis/package.json
index 6e965b6715..f73e558607 100644
--- a/packages/strapi-hook-redis/package.json
+++ b/packages/strapi-hook-redis/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-hook-redis",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Redis hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
@@ -19,7 +19,7 @@
"lodash": "^4.17.11",
"rimraf": "^2.6.3",
"stack-trace": "0.0.10",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-utils": "3.0.0-beta.17.8"
},
"author": {
"email": "hi@strapi.io",
diff --git a/packages/strapi-middleware-views/package.json b/packages/strapi-middleware-views/package.json
index 0ec24fbf13..c6a3fd70ec 100644
--- a/packages/strapi-middleware-views/package.json
+++ b/packages/strapi-middleware-views/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-middleware-views",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Views middleware to enable server-side rendering for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-plugin-content-manager/package.json b/packages/strapi-plugin-content-manager/package.json
index 82092dab7d..6e4d6ea4e4 100644
--- a/packages/strapi-plugin-content-manager/package.json
+++ b/packages/strapi-plugin-content-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-content-manager",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "A powerful UI to easily manage your data.",
"strapi": {
"name": "Content Manager",
@@ -32,8 +32,8 @@
"redux-immutable": "^4.0.0",
"reselect": "^3.0.1",
"showdown": "^1.9.0",
- "strapi-helper-plugin": "3.0.0-beta.17.6",
- "strapi-utils": "3.0.0-beta.17.6",
+ "strapi-helper-plugin": "3.0.0-beta.17.8",
+ "strapi-utils": "3.0.0-beta.17.8",
"styled-components": "^4.2.0",
"yup": "^0.27.0"
},
diff --git a/packages/strapi-plugin-content-type-builder/package.json b/packages/strapi-plugin-content-type-builder/package.json
index 9e10b98225..2b91a886fe 100644
--- a/packages/strapi-plugin-content-type-builder/package.json
+++ b/packages/strapi-plugin-content-type-builder/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-content-type-builder",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Strapi plugin to create content type (API).",
"strapi": {
"name": "Content Type Builder",
@@ -29,9 +29,9 @@
"redux": "^4.0.1",
"redux-immutable": "^4.0.0",
"reselect": "^3.0.1",
- "strapi-generate": "3.0.0-beta.17.6",
- "strapi-generate-api": "3.0.0-beta.17.6",
- "strapi-helper-plugin": "3.0.0-beta.17.6",
+ "strapi-generate": "3.0.0-beta.17.8",
+ "strapi-generate-api": "3.0.0-beta.17.8",
+ "strapi-helper-plugin": "3.0.0-beta.17.8",
"yup": "^0.27.0"
},
"author": {
diff --git a/packages/strapi-plugin-documentation/package.json b/packages/strapi-plugin-documentation/package.json
index 2b329e2876..f6d716f11f 100755
--- a/packages/strapi-plugin-documentation/package.json
+++ b/packages/strapi-plugin-documentation/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-documentation",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "This is the description of the plugin.",
"strapi": {
"name": "Documentation",
@@ -32,7 +32,7 @@
"redux": "^4.0.1",
"redux-immutable": "^4.0.0",
"reselect": "^4.0.0",
- "strapi-helper-plugin": "3.0.0-beta.17.6",
+ "strapi-helper-plugin": "3.0.0-beta.17.8",
"swagger-ui-dist": "3.22.1"
},
"author": {
diff --git a/packages/strapi-plugin-email/package.json b/packages/strapi-plugin-email/package.json
index 536c9d9a95..131bf58b23 100644
--- a/packages/strapi-plugin-email/package.json
+++ b/packages/strapi-plugin-email/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-email",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "This is the description of the plugin.",
"strapi": {
"name": "Email",
@@ -12,13 +12,13 @@
"test": "echo \"no tests yet\""
},
"dependencies": {
- "strapi-provider-email-sendmail": "3.0.0-beta.17.6",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-provider-email-sendmail": "3.0.0-beta.17.8",
+ "strapi-utils": "3.0.0-beta.17.8"
},
"devDependencies": {
"react-copy-to-clipboard": "5.0.1",
"rimraf": "^2.6.3",
- "strapi-helper-plugin": "3.0.0-beta.17.6"
+ "strapi-helper-plugin": "3.0.0-beta.17.8"
},
"author": {
"name": "Strapi team",
diff --git a/packages/strapi-plugin-graphql/package.json b/packages/strapi-plugin-graphql/package.json
index 2c1354c865..b3042aa002 100644
--- a/packages/strapi-plugin-graphql/package.json
+++ b/packages/strapi-plugin-graphql/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-graphql",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "This is the description of the plugin.",
"strapi": {
"name": "graphql",
@@ -23,7 +23,7 @@
"graphql-type-long": "^0.1.1",
"koa-compose": "^4.1.0",
"pluralize": "^7.0.0",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-utils": "3.0.0-beta.17.8"
},
"devDependencies": {
"cross-env": "^5.2.0",
diff --git a/packages/strapi-plugin-graphql/services/Aggregator.js b/packages/strapi-plugin-graphql/services/Aggregator.js
index 09a9139fa3..5ad0a32fcc 100644
--- a/packages/strapi-plugin-graphql/services/Aggregator.js
+++ b/packages/strapi-plugin-graphql/services/Aggregator.js
@@ -7,6 +7,8 @@
const _ = require('lodash');
const pluralize = require('pluralize');
const { convertRestQueryParams, buildQuery } = require('strapi-utils');
+const policyUtils = require('strapi-utils').policy;
+const compose = require('koa-compose');
const Schema = require('./Schema.js');
const GraphQLQuery = require('./Query.js');
@@ -470,7 +472,13 @@ const formatConnectionAggregator = function(fields, model, modelName) {
* }
*
*/
-const formatModelConnectionsGQL = function(fields, model, name, modelResolver) {
+const formatModelConnectionsGQL = function(
+ fields,
+ model,
+ name,
+ modelResolver,
+ plugin
+) {
const { globalId } = model;
const connectionGlobalId = `${globalId}Connection`;
@@ -501,7 +509,50 @@ const formatModelConnectionsGQL = function(fields, model, name, modelResolver) {
},
resolver: {
Query: {
- [`${pluralName}Connection`](obj, options, context) {
+ async [`${pluralName}Connection`](obj, options, { context }) {
+ // need to check
+
+ const ctx = Object.assign(_.clone(context), {
+ request: Object.assign(_.clone(context.request), {
+ graphql: null,
+ }),
+ });
+
+ const policiesFn = [
+ policyUtils.globalPolicy(
+ undefined,
+ {
+ handler: `${name}.find`,
+ },
+ undefined,
+ plugin
+ ),
+ ];
+
+ policyUtils.get(
+ 'plugins.users-permissions.permissions',
+ plugin,
+ policiesFn,
+ `GraphQL connection "${name}" `,
+ name
+ );
+
+ // Execute policies stack.
+ const policy = await compose(policiesFn)(ctx);
+
+ // Policy doesn't always return errors but they update the current context.
+ if (
+ _.isError(ctx.request.graphql) ||
+ _.get(ctx.request.graphql, 'isBoom')
+ ) {
+ return ctx.request.graphql;
+ }
+
+ // Something went wrong in the policy.
+ if (policy) {
+ return policy;
+ }
+
return options;
},
},
diff --git a/packages/strapi-plugin-graphql/services/Resolvers.js b/packages/strapi-plugin-graphql/services/Resolvers.js
index 340e835f4f..442cb4823d 100644
--- a/packages/strapi-plugin-graphql/services/Resolvers.js
+++ b/packages/strapi-plugin-graphql/services/Resolvers.js
@@ -60,152 +60,161 @@ const buildAssocResolvers = (model, name, { plugin }) => {
const { primaryKey, associations = [] } = model;
return associations
- .filter(association => model.attributes[association.alias].private !== true)
- .reduce((resolver, association) => {
- switch (association.nature) {
- case 'oneToManyMorph': {
- resolver[association.alias] = async obj => {
- const entry = await contentManager.fetch(
- {
- id: obj[primaryKey],
- model: name,
- },
- plugin,
- [association.alias]
- );
-
- // Set the _type only when the value is defined
- if (entry[association.alias]) {
- entry[association.alias]._type = _.upperFirst(association.model);
- }
-
- return entry[association.alias];
- };
- break;
- }
- case 'manyMorphToOne':
- case 'manyMorphToMany':
- case 'manyToManyMorph': {
- resolver[association.alias] = async obj => {
- // eslint-disable-line no-unused-vars
- const [withRelated, withoutRelated] = await Promise.all([
- contentManager.fetch(
+ .filter(association => model.attributes[association.alias].private !== true)
+ .reduce((resolver, association) => {
+ switch (association.nature) {
+ case 'oneToManyMorph': {
+ resolver[association.alias] = async obj => {
+ const entry = await contentManager.fetch(
{
id: obj[primaryKey],
model: name,
},
plugin,
- [association.alias],
- false
- ),
- contentManager.fetch(
- {
- id: obj[primaryKey],
- model: name,
- },
- plugin,
- []
- ),
- ]);
-
- const entry =
- withRelated && withRelated.toJSON
- ? withRelated.toJSON()
- : withRelated;
-
- entry[association.alias].map((entry, index) => {
- const type =
- _.get(withoutRelated, `${association.alias}.${index}.kind`) ||
- _.upperFirst(
- _.camelCase(
- _.get(
- withoutRelated,
- `${association.alias}.${index}.${association.alias}_type`
- )
- )
- ) ||
- _.upperFirst(_.camelCase(association[association.type]));
-
- entry._type = type;
-
- return entry;
- });
-
- return entry[association.alias];
- };
- break;
- }
-
- default: {
- resolver[association.alias] = async (obj, options) => {
- // Construct parameters object to retrieve the correct related entries.
- const params = {
- model: association.model || association.collection,
- };
-
- let queryOpts = {
- source: association.plugin,
- };
-
- // Get refering model.
- const ref = association.plugin
- ? strapi.plugins[association.plugin].models[params.model]
- : strapi.models[params.model];
-
- if (association.type === 'model') {
- params[ref.primaryKey] = _.get(
- obj,
- [association.alias, ref.primaryKey],
- obj[association.alias]
+ [association.alias]
);
- } else {
- const queryParams = Query.amountLimiting(options);
- queryOpts = {
- ...queryOpts,
- ...Query.convertToParams(_.omit(queryParams, 'where')), // Convert filters (sort, limit and start/skip)
- ...Query.convertToQuery(queryParams.where),
+
+ // Set the _type only when the value is defined
+ if (entry[association.alias]) {
+ entry[association.alias]._type = _.upperFirst(association.model);
+ }
+
+ return entry[association.alias];
+ };
+ break;
+ }
+ case 'manyMorphToOne':
+ case 'manyMorphToMany':
+ case 'manyToManyMorph': {
+ resolver[association.alias] = async obj => {
+ // eslint-disable-line no-unused-vars
+ const [withRelated, withoutRelated] = await Promise.all([
+ contentManager.fetch(
+ {
+ id: obj[primaryKey],
+ model: name,
+ },
+ plugin,
+ [association.alias],
+ false
+ ),
+ contentManager.fetch(
+ {
+ id: obj[primaryKey],
+ model: name,
+ },
+ plugin,
+ []
+ ),
+ ]);
+
+ const entry =
+ withRelated && withRelated.toJSON
+ ? withRelated.toJSON()
+ : withRelated;
+
+ entry[association.alias].map((entry, index) => {
+ const type =
+ _.get(withoutRelated, `${association.alias}.${index}.kind`) ||
+ _.upperFirst(
+ _.camelCase(
+ _.get(
+ withoutRelated,
+ `${association.alias}.${index}.${association.alias}_type`
+ )
+ )
+ ) ||
+ _.upperFirst(_.camelCase(association[association.type]));
+
+ entry._type = type;
+
+ return entry;
+ });
+
+ return entry[association.alias];
+ };
+ break;
+ }
+
+ default: {
+ resolver[association.alias] = async (obj, options) => {
+ // Construct parameters object to retrieve the correct related entries.
+ const params = {
+ model: association.model || association.collection,
};
- if (
- ((association.nature === 'manyToMany' && association.dominant) ||
- association.nature === 'manyWay') &&
- _.has(obj, association.alias) // if populated
- ) {
- _.set(
- queryOpts,
- ['query', ref.primaryKey],
+ let queryOpts = {
+ source: association.plugin,
+ };
+
+ // Get refering model.
+ const ref = association.plugin
+ ? strapi.plugins[association.plugin].models[params.model]
+ : strapi.models[params.model];
+
+ if (association.type === 'model') {
+ params[ref.primaryKey] = _.get(
+ obj,
+ [association.alias, ref.primaryKey],
obj[association.alias]
- ? obj[association.alias]
- .map(val => val[ref.primaryKey] || val)
- .sort()
- : []
);
} else {
- _.set(queryOpts, ['query', association.via], obj[ref.primaryKey]);
+ const queryParams = Query.amountLimiting(options);
+ queryOpts = {
+ ...queryOpts,
+ ...Query.convertToParams(_.omit(queryParams, 'where')), // Convert filters (sort, limit and start/skip)
+ ...Query.convertToQuery(queryParams.where),
+ };
+
+ if (
+ ((association.nature === 'manyToMany' &&
+ association.dominant) ||
+ association.nature === 'manyWay') &&
+ _.has(obj, association.alias) // if populated
+ ) {
+ _.set(
+ queryOpts,
+ ['query', ref.primaryKey],
+ obj[association.alias]
+ ? obj[association.alias]
+ .map(val => val[ref.primaryKey] || val)
+ .sort()
+ : []
+ );
+ } else {
+ _.set(
+ queryOpts,
+ ['query', association.via],
+ obj[ref.primaryKey]
+ );
+ }
}
- }
- const loaderName = association.plugin
- ? `${association.plugin}__${params.model}`
- : params.model;
+ const loaderName = association.plugin
+ ? `${association.plugin}__${params.model}`
+ : params.model;
- return association.model
- ? strapi.plugins.graphql.services.loaders.loaders[loaderName].load({
- params,
- options: queryOpts,
- single: true,
- })
- : strapi.plugins.graphql.services.loaders.loaders[loaderName].load({
- options: queryOpts,
- association,
- });
- };
- break;
+ return association.model
+ ? strapi.plugins.graphql.services.loaders.loaders[
+ loaderName
+ ].load({
+ params,
+ options: queryOpts,
+ single: true,
+ })
+ : strapi.plugins.graphql.services.loaders.loaders[
+ loaderName
+ ].load({
+ options: queryOpts,
+ association,
+ });
+ };
+ break;
+ }
}
- }
- return resolver;
- }, {});
+ return resolver;
+ }, {});
};
const buildModel = (model, name, { plugin, isGroup = false } = {}) => {
@@ -475,7 +484,8 @@ const buildShadowCRUD = (models, plugin) => {
attributes,
model,
name,
- queries.plural
+ queries.plural,
+ plugin
);
if (modelAggregator) {
acc.definition += modelAggregator.type;
diff --git a/packages/strapi-plugin-upload/package.json b/packages/strapi-plugin-upload/package.json
index edc296d5cb..c89d24c312 100644
--- a/packages/strapi-plugin-upload/package.json
+++ b/packages/strapi-plugin-upload/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-upload",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "This is the description of the plugin.",
"strapi": {
"name": "Files Upload",
@@ -23,9 +23,9 @@
"react-router-dom": "^5.0.0",
"react-transition-group": "^2.5.0",
"reactstrap": "^5.0.0",
- "strapi-helper-plugin": "3.0.0-beta.17.6",
- "strapi-provider-upload-local": "3.0.0-beta.17.6",
- "strapi-utils": "3.0.0-beta.17.6",
+ "strapi-helper-plugin": "3.0.0-beta.17.8",
+ "strapi-provider-upload-local": "3.0.0-beta.17.8",
+ "strapi-utils": "3.0.0-beta.17.8",
"stream-to-array": "^2.3.0",
"uuid": "^3.2.1"
},
diff --git a/packages/strapi-plugin-users-permissions/controllers/Auth.js b/packages/strapi-plugin-users-permissions/controllers/Auth.js
index 655b3b9230..1b0b4f73f2 100644
--- a/packages/strapi-plugin-users-permissions/controllers/Auth.js
+++ b/packages/strapi-plugin-users-permissions/controllers/Auth.js
@@ -272,7 +272,22 @@ module.exports = {
},
async forgotPassword(ctx) {
- const { email } = ctx.request.body;
+ let { email } = ctx.request.body;
+
+ // Check if the provided email is valid or not.
+ const isEmail = emailRegExp.test(email);
+
+ if (isEmail) {
+ email = email.toLowerCase();
+ } else {
+ return ctx.badRequest(
+ null,
+ formatError({
+ id: 'Auth.form.error.email.format',
+ message: 'Please provide valid email address.',
+ })
+ );
+ }
const pluginStore = await strapi.store({
environment: '',
@@ -620,7 +635,7 @@ module.exports = {
}
const user = await strapi.query('user', 'users-permissions').findOne({
- email: params.email
+ email: params.email,
});
if (user.confirmed) {
@@ -635,22 +650,38 @@ module.exports = {
_.pick(user.toJSON ? user.toJSON() : user, ['id'])
);
- const settings = await pluginStore.get({ key: 'email' }).then(storeEmail => {
- try {
- return storeEmail['email_confirmation'].options;
- } catch (err) {
- return {};
- }
- });
+ const settings = await pluginStore
+ .get({ key: 'email' })
+ .then(storeEmail => {
+ try {
+ return storeEmail['email_confirmation'].options;
+ } catch (err) {
+ return {};
+ }
+ });
- settings.message = await strapi.plugins['users-permissions'].services.userspermissions.template(settings.message, {
+ settings.message = await strapi.plugins[
+ 'users-permissions'
+ ].services.userspermissions.template(settings.message, {
URL: new URL('/auth/email-confirmation', strapi.config.url).toString(),
- USER: _.omit(user.toJSON ? user.toJSON() : user, ['password', 'resetPasswordToken', 'role', 'provider']),
- CODE: jwt
+ USER: _.omit(user.toJSON ? user.toJSON() : user, [
+ 'password',
+ 'resetPasswordToken',
+ 'role',
+ 'provider',
+ ]),
+ CODE: jwt,
});
- settings.object = await strapi.plugins['users-permissions'].services.userspermissions.template(settings.object, {
- USER: _.omit(user.toJSON ? user.toJSON() : user, ['password', 'resetPasswordToken', 'role', 'provider']),
+ settings.object = await strapi.plugins[
+ 'users-permissions'
+ ].services.userspermissions.template(settings.object, {
+ USER: _.omit(user.toJSON ? user.toJSON() : user, [
+ 'password',
+ 'resetPasswordToken',
+ 'role',
+ 'provider',
+ ]),
});
try {
@@ -663,11 +694,11 @@ module.exports = {
replyTo: settings.response_email,
subject: settings.object,
text: settings.message,
- html: settings.message
+ html: settings.message,
});
ctx.send({
email: (user.toJSON ? user.toJSON() : user).email,
- sent: true
+ sent: true,
});
} catch (err) {
return ctx.badRequest(null, err);
diff --git a/packages/strapi-plugin-users-permissions/package.json b/packages/strapi-plugin-users-permissions/package.json
index 2b9d5cc7b9..19e7873cfc 100644
--- a/packages/strapi-plugin-users-permissions/package.json
+++ b/packages/strapi-plugin-users-permissions/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-plugin-users-permissions",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Protect your API with a full-authentication process based on JWT",
"strapi": {
"name": "Roles & Permissions",
@@ -31,8 +31,8 @@
"reactstrap": "^5.0.0",
"redux-saga": "^0.16.0",
"request": "^2.83.0",
- "strapi-helper-plugin": "3.0.0-beta.17.6",
- "strapi-utils": "3.0.0-beta.17.6",
+ "strapi-helper-plugin": "3.0.0-beta.17.8",
+ "strapi-utils": "3.0.0-beta.17.8",
"uuid": "^3.1.0"
},
"devDependencies": {
diff --git a/packages/strapi-provider-email-amazon-ses/package.json b/packages/strapi-provider-email-amazon-ses/package.json
index 8145a27c61..c167c87e19 100644
--- a/packages/strapi-provider-email-amazon-ses/package.json
+++ b/packages/strapi-provider-email-amazon-ses/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-email-amazon-ses",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Amazon SES provider for strapi email",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-email-mailgun/package.json b/packages/strapi-provider-email-mailgun/package.json
index 4f4725aa99..7261cafac0 100644
--- a/packages/strapi-provider-email-mailgun/package.json
+++ b/packages/strapi-provider-email-mailgun/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-email-mailgun",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Mailgun provider for strapi email plugin",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-email-sendgrid/package.json b/packages/strapi-provider-email-sendgrid/package.json
index 049382a2c5..254a08d77c 100644
--- a/packages/strapi-provider-email-sendgrid/package.json
+++ b/packages/strapi-provider-email-sendgrid/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-email-sendgrid",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Sendgrid provider for strapi email",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-email-sendmail/package.json b/packages/strapi-provider-email-sendmail/package.json
index 0cc3b73b7a..30464a75d5 100644
--- a/packages/strapi-provider-email-sendmail/package.json
+++ b/packages/strapi-provider-email-sendmail/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-email-sendmail",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Sendmail provider for strapi email",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-upload-aws-s3/package.json b/packages/strapi-provider-upload-aws-s3/package.json
index 9cccb184ff..6f5837e8b4 100644
--- a/packages/strapi-provider-upload-aws-s3/package.json
+++ b/packages/strapi-provider-upload-aws-s3/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-upload-aws-s3",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "AWS S3 provider for strapi upload",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-upload-cloudinary/package.json b/packages/strapi-provider-upload-cloudinary/package.json
index 817c216099..5f72068e07 100644
--- a/packages/strapi-provider-upload-cloudinary/package.json
+++ b/packages/strapi-provider-upload-cloudinary/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-upload-cloudinary",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Cloudinary provider for strapi upload",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-upload-local/package.json b/packages/strapi-provider-upload-local/package.json
index 845eb6110e..e14b1b7a54 100644
--- a/packages/strapi-provider-upload-local/package.json
+++ b/packages/strapi-provider-upload-local/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-upload-local",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Local provider for strapi upload",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi-provider-upload-rackspace/package.json b/packages/strapi-provider-upload-rackspace/package.json
index 2b452f45cf..606af36d06 100644
--- a/packages/strapi-provider-upload-rackspace/package.json
+++ b/packages/strapi-provider-upload-rackspace/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-provider-upload-rackspace",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Rackspace provider for strapi upload",
"main": "./lib",
"keywords": [],
diff --git a/packages/strapi-utils/package.json b/packages/strapi-utils/package.json
index 404c5e5294..35046b5b0b 100644
--- a/packages/strapi-utils/package.json
+++ b/packages/strapi-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi-utils",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "Shared utilities for the Strapi packages",
"homepage": "http://strapi.io",
"keywords": [
diff --git a/packages/strapi/package.json b/packages/strapi/package.json
index 174b5acb15..2f7f34ff3c 100644
--- a/packages/strapi/package.json
+++ b/packages/strapi/package.json
@@ -1,6 +1,6 @@
{
"name": "strapi",
- "version": "3.0.0-beta.17.6",
+ "version": "3.0.0-beta.17.8",
"description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MongoDB, MySQL, MariaDB, PostgreSQL, SQLite",
"homepage": "http://strapi.io",
"directories": {
@@ -48,15 +48,15 @@
"resolve-cwd": "^3.0.0",
"rimraf": "^2.6.2",
"shelljs": "^0.8.3",
- "strapi-generate": "3.0.0-beta.17.6",
- "strapi-generate-api": "3.0.0-beta.17.6",
- "strapi-generate-controller": "3.0.0-beta.17.6",
- "strapi-generate-model": "3.0.0-beta.17.6",
- "strapi-generate-new": "3.0.0-beta.17.6",
- "strapi-generate-plugin": "3.0.0-beta.17.6",
- "strapi-generate-policy": "3.0.0-beta.17.6",
- "strapi-generate-service": "3.0.0-beta.17.6",
- "strapi-utils": "3.0.0-beta.17.6"
+ "strapi-generate": "3.0.0-beta.17.8",
+ "strapi-generate-api": "3.0.0-beta.17.8",
+ "strapi-generate-controller": "3.0.0-beta.17.8",
+ "strapi-generate-model": "3.0.0-beta.17.8",
+ "strapi-generate-new": "3.0.0-beta.17.8",
+ "strapi-generate-plugin": "3.0.0-beta.17.8",
+ "strapi-generate-policy": "3.0.0-beta.17.8",
+ "strapi-generate-service": "3.0.0-beta.17.8",
+ "strapi-utils": "3.0.0-beta.17.8"
},
"scripts": {
"test": "jest --verbose",