Merge branch 'master' into design/marketplace

This commit is contained in:
Jim LAURIE 2019-01-30 14:35:38 +01:00 committed by GitHub
commit 12e673a9d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 213 additions and 63 deletions

View File

@ -347,6 +347,9 @@ The session doesn't work with `mongo` as a client. The package that we should us
- `enabled` (boolean): Enable or not GZIP response compression.
- `responseTime`
- `enabled` (boolean): Enable or not `X-Response-Time header` to response. Default value: `false`.
- `poweredBy`
- `enabled` (boolean): Enable or not `X-Powered-By` header to response. Default value: `true`.
- `value` (string): The value of the header. Default value: `Strapi <strapi.io>`
***

View File

@ -24,6 +24,7 @@ Easily filter results according to fields values.
- `_gt`: Greater than
- `_lte`: Lower than or equal to
- `_gte`: Greater than or equal to
- `_in`: Include in array
- `_contains`: Contains
- `_containss`: Contains case sensitive
@ -37,6 +38,9 @@ Find products having a price equal or greater than `3`.
`GET /products?price_gte=3`
Find multiple product with id 3, 6, 8
`GET /products?id_in=3&id_in=6&id_in=8`
::: note
You can't use filter to have specific results inside relation, like "Find users and only their posts older than yesterday" as example. If you need it, you can modify or create your own service or use [GraphQL](./graphql.md#query-api).
:::

View File

@ -4,5 +4,9 @@
},
"responseTime": {
"enabled": false
},
"poweredBy": {
"enabled": true,
"value": "Strapi <strapi.io>"
}
}

View File

@ -1,21 +0,0 @@
{
"defaultConnection": "default",
"connections": {
"default": {
"connector": "strapi-hook-mongoose",
"settings": {
"client": "mongo",
"uri": "${process.env.DATABASE_URI || ''}",
"host": "${process.env.DATABASE_HOST || '127.0.0.1'}",
"port": "${process.env.DATABASE_PORT || 27017}",
"database": "${process.env.DATABASE_NAME || 'strapi-production'}",
"username": "${process.env.DATABASE_USERNAME || ''}",
"password": "${process.env.DATABASE_PASSWORD || ''}"
},
"options": {
"ssl": "${process.env.DATABASE_SSL || false}",
"authenticationDatabase": "${process.env.DATABASE_AUTHENTICATION_DATABASE || ''}"
}
}
}
}

View File

@ -4,5 +4,9 @@
},
"responseTime": {
"enabled": false
},
"poweredBy": {
"enabled": true,
"value": "Strapi <strapi.io>"
}
}

View File

@ -1,21 +0,0 @@
{
"defaultConnection": "default",
"connections": {
"default": {
"connector": "strapi-hook-mongoose",
"settings": {
"client": "mongo",
"uri": "${process.env.DATABASE_URI || ''}",
"host": "${process.env.DATABASE_HOST || '127.0.0.1'}",
"port": "${process.env.DATABASE_PORT || 27017}",
"database": "${process.env.DATABASE_NAME || 'strapi-staging'}",
"username": "${process.env.DATABASE_USERNAME || ''}",
"password": "${process.env.DATABASE_PASSWORD || ''}"
},
"options": {
"ssl": "${process.env.DATABASE_SSL || false}",
"authenticationDatabase": "${process.env.DATABASE_AUTHENTICATION_DATABASE || ''}"
}
}
}
}

View File

@ -4,5 +4,9 @@
},
"responseTime": {
"enabled": false
},
"poweredBy": {
"enabled": true,
"value": "Strapi <strapi.io>"
}
}

View File

@ -1,8 +1,48 @@
'use strict';
module.exports = scope => {
// Production/Staging Template
if (['production', 'staging'].includes(scope.keyPath.split('/')[2])) {
// All available settings (bookshelf and mongoose)
const settingsBase = {
client: scope.client.database,
host: '${process.env.DATABASE_HOST || \'127.0.0.1\' }',
port: '${process.env.DATABASE_PORT || 27017 }',
srv: '${process.env.DATABASE_SRV || false }',
database: '${process.env.DATABASE_NAME || strapi }',
username: '${process.env.DATABASE_USERNAME || \'\' }',
password: '${process.env.DATABASE_PASSWORD || \'\' }',
ssl: '${process.env.DATABASE_SSL || false }'
};
// Apply only settings set during the configuration
Object.keys(scope.database.settings).forEach((key) => {
scope.database.settings[key] = settingsBase[key];
});
// All available options (bookshelf and mongoose)
const optionsBase = {
ssl: '${process.env.DATABASE_SSL || false }',
authenticationDatabase: '${process.env.DATABASE_AUTHENTICATION_DATABASE || \'\' }'
};
// Apply only options set during the configuration
Object.keys(scope.database.options).forEach((key) => {
scope.database.options[key] = optionsBase[key];
});
return {
defaultConnection: 'default',
connections: {
default: {
connector: scope.client.connector,
settings: scope.database.settings,
options: scope.database.options
}
}
};
}
// Finally, return the JSON.
return {
defaultConnection: 'default',
connections: {

View File

@ -15,10 +15,10 @@ const fs = require('fs-extra');
const npm = require('enpeem');
const ora = require('ora');
const shell = require('shelljs');
const request = require('request');
// Logger.
const { packageManager } = require('strapi-utils');
const trackSuccess = require('./success');
/**
* Runs after this generator has finished
@ -201,14 +201,4 @@ module.exports = (scope, cb) => {
cb();
});
}
};
function trackSuccess(event, scope) {
request
.post('https://analytics.strapi.io/track')
.form({
event,
uuid: scope.uuid
})
.on('error', () => {});
}
};

View File

@ -21,6 +21,7 @@ const uuid = require('uuid/v4');
// Logger.
const { packageManager } = require('strapi-utils');
const trackSuccess = require('./success');
/**
* This `before` function is run before generating targets.
@ -49,6 +50,8 @@ module.exports = (scope, cb) => {
scope.tmpPath = path.resolve(os.tmpdir(), `strapi${ crypto.randomBytes(6).toString('hex') }`);
scope.uuid = uuid();
trackSuccess('willCreateProject', scope);
// Ensure we aren't going to inadvertently delete any files.
try {
const files = fs.readdirSync(scope.rootPath);
@ -205,12 +208,16 @@ module.exports = (scope, cb) => {
}
scope.database.settings.host = answers.host;
scope.database.settings.srv = _.toString(answers.srv) === 'true';
scope.database.settings.port = answers.port;
scope.database.settings.database = answers.database;
scope.database.settings.username = answers.username;
scope.database.settings.password = answers.password;
scope.database.options.authenticationDatabase = answers.authenticationDatabase;
if (answers.srv) {
scope.database.settings.srv = _.toString(answers.srv) === 'true';
}
if (answers.authenticationDatabase) {
scope.database.options.authenticationDatabase = answers.authenticationDatabase;
}
if (scope.client.database === 'mongo') {
scope.database.options.ssl = _.toString(answers.ssl) === 'true';
} else {

View File

@ -34,6 +34,14 @@ module.exports = {
jsonfile: database
},
'config/environments/production/database.json': {
jsonfile: database
},
'config/environments/staging/database.json': {
jsonfile: database
},
// Copy dot files.
'.editorconfig': {
copy: 'editorconfig'

View File

@ -0,0 +1,18 @@
'use strict';
/**
* Module dependencies
*/
// Node.js core.
const request = require('request');
module.exports = function trackSuccess(event, scope) {
request
.post('https://analytics.strapi.io/track')
.form({
event,
uuid: scope.uuid
})
.on('error', () => {});
};

View File

@ -422,8 +422,10 @@ module.exports = function(strapi) {
case 'email':
type = 'varchar(255)';
break;
case 'integer':
case 'biginteger':
type = definition.client === 'pg' ? 'bigint' : 'bigint(53)';
break;
case 'integer':
type = definition.client === 'pg' ? 'integer' : 'int';
break;
case 'float':

View File

@ -160,6 +160,28 @@ module.exports = function (strapi) {
} else {
this._mongooseOptions.populate[association.alias].path = `${association.alias}.ref`;
}
} else {
if (!this._mongooseOptions.populate) {
this._mongooseOptions.populate = {};
}
// Images are not displayed in populated data.
// We automatically populate morph relations.
if (association.nature === 'oneToManyMorph' || association.nature === 'manyToManyMorph') {
this._mongooseOptions.populate[association.alias] = {
path: association.alias,
match: {
[`${association.via}.${association.filter}`]: association.alias,
[`${association.via}.kind`]: definition.globalId
},
options: {
sort: '-createdAt'
},
select: undefined,
model: undefined,
_docs: {}
};
}
}
next();
});
@ -554,4 +576,4 @@ module.exports = function (strapi) {
}, relations);
return hook;
};
};

View File

@ -4,5 +4,5 @@
"databases.connections.${name}.settings.host": "col-md-12",
"database.connections.settings.host": "col-md-12",
"database.connections.settings.port": "col-md-6",
"showInputLabel": ["form.response.item.gzip.enabled", "form.response.item.responseTime.enabled"]
"showInputLabel": ["form.response.item.gzip.enabled", "form.response.item.responseTime.enabled", "form.response.item.poweredBy.enabled"]
}

View File

@ -48,6 +48,8 @@
"form.response.description": "قم بتكوين إعدادات الاستجابة الخاصة بك.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "وقت الاستجابة",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "القيمة",
"form.response.name": "الإستجابة",
"form.security.description": "تكوين إعدادات الأمان الخاصة بك.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Verwalte deine Antworteinstellungen.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Antwortzeit",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Wert",
"form.response.name": "Antwort",
"form.security.description": "Verwalte deine Sicherheitseinstellungen.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Configure your response settings.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Response Time",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Value",
"form.response.name": "Response",
"form.security.description": "Configure your security settings.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Configurar las opciones de respuesta.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Tiempo de respuesta",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Valor",
"form.response.name": "Respuesta",
"form.security.description": "Configurar las opciones de seguridad.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Configuration des réponses.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Temps de réponse",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Valeur",
"form.response.name": "Réponse",
"form.security.description": "Configurations de sécurité.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Configurare la tua risposta impostazioni.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Il Tempo Di Risposta",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Valore",
"form.response.name": "Risposta",
"form.security.description": "Configurare le impostazioni di sicurezza.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "レスポンス設定を構成します。",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Response Time",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Value",
"form.response.name": "レスポンス",
"form.security.description": "セキュリティ設定を構成します。",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "응답(response) 환경을 설정하세요.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "응답 시간 (Response Time)",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "값",
"form.response.name": "응답 (Response)",
"form.security.description": "보안 환경을 설정하세요.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Configureer je response instellingen.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Response Tijd",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Waarde",
"form.response.name": "Response",
"form.security.description": "Configureer je beveiliging instellingen.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Konfiguruj ustawienia odpowiedzi.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Czas odpowiedzi",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Wartość",
"form.response.name": "Odpowiedzi",
"form.security.description": "Konfiguruj ustawienia bezpieczeństwa.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Defina as suas configurações de resposta.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Tempo de resposta",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Valor",
"form.response.name": "Resposta",
"form.security.description": "Defina as suas configurações de segurança.",
"form.security.item.cors": "CORS",

View File

@ -48,6 +48,8 @@
"form.response.description": "Configure as suas definições de resposta.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Tempo de resposta",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Valor",
"form.response.name": "Resposta",
"form.security.description": "Configure as suas definições de segurança.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Задайте настройки ответа.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Время ответа",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Value",
"form.response.name": "Ответ",
"form.security.description": "Задайте настройки безопасности.",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "Yanıt ayarlarınızı yapılandırın.",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Tepki Süresi",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Değer",
"form.response.name": "Cevap",
"form.security.description": "Güvenlik ayarlarınızı yapılandırın.",
"form.security.item.cors": "Cors",

View File

@ -47,6 +47,8 @@
"form.response.description": "配置您的响应设置。",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "Response Time",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "Value",
"form.response.name": "Response",
"form.security.description": "配置安全设置。",
"form.security.item.cors": "Cors",

View File

@ -48,6 +48,8 @@
"form.response.description": "調整回應設定",
"form.response.item.gzip.enabled": "Gzip",
"form.response.item.responseTime.enabled": "回應時間",
"form.response.item.poweredBy.enabled": "Powered by",
"form.response.item.poweredBy.value": "值",
"form.response.name": "回應",
"form.security.description": "調整安全性設定",
"form.security.item.cors": "跨域資源共享 (Cors)",

View File

@ -198,7 +198,12 @@ module.exports = {
validations: {
required: true
}
},
}
]
},
{
name: '',
items: [
{
name: 'form.response.item.responseTime.enabled',
target: 'response.responseTime.enabled',
@ -209,6 +214,28 @@ module.exports = {
}
}
]
},
{
name: '',
items: [
{
name: 'form.response.item.poweredBy.enabled',
target: 'response.poweredBy.enabled',
type: 'boolean',
value: _.get(strapi.config, `environments.${env}.response.poweredBy.enabled`, null),
items: [
{
name: 'form.response.item.poweredBy.value',
target: 'response.poweredBy.value',
type: 'string',
value: _.get(strapi.config, `environments.${env}.response.poweredBy.value`, null),
validations : {
required: true
}
}
]
}
]
}
]
}),

View File

@ -40,6 +40,7 @@ module.exports = {
'cn-north-1',
'cn-northwest-1',
'eu-central-1',
'eu-north-1',
'eu-west-1',
'eu-west-2',
'eu-west-3',

View File

@ -61,6 +61,7 @@ module.exports = function (name, cliArguments) {
settings: {
client: cliArguments.dbclient,
host: cliArguments.dbhost,
srv: cliArguments.dbsrv,
port: cliArguments.dbport,
database: cliArguments.dbname,
username: cliArguments.dbusername,

View File

@ -56,6 +56,7 @@ program
.option('--debug', 'Display database connection error')
.option('--dbclient <dbclient>', 'Database client')
.option('--dbhost <dbhost>', 'Database host')
.option('--dbsrv <dbsrv>', 'Database srv')
.option('--dbport <dbport>', 'Database port')
.option('--dbname <dbname>', 'Database name')
.option('--dbusername <dbusername>', 'Database username')

View File

@ -22,8 +22,8 @@ module.exports = () => {
}
// Set X-Powered-By header.
if (_.get(strapi.config, 'X-Powered-By.enabled', true)) {
ctx.set('X-Powered-By', 'Strapi <strapi.io>');
if (_.get(strapi.config.currentEnvironment.response, 'poweredBy.enabled')) {
ctx.set('X-Powered-By', _.get(strapi.config.currentEnvironment.response, 'poweredBy.value', 'Strapi <strapi.io>'));
}
});
cb();

View File

@ -0,0 +1,21 @@
#!/usr/bin/env node
'use strict';
/**
* Module dependencies
*/
// Node.js core.
const fetch = require('node-fetch');
if (process.env.npm_config_global === 'true') {
fetch('https://analytics.strapi.io/track', {
method: 'POST',
body: JSON.stringify({ event: 'didInstallStrapi' }),
headers: { 'Content-Type': 'application/json' }
})
.catch(() => {});
}

View File

@ -71,6 +71,9 @@
"strapi-generate-service": "3.0.0-alpha.21",
"strapi-utils": "3.0.0-alpha.21"
},
"scripts": {
"postinstall": "node lib/utils/success.js"
},
"author": {
"email": "hi@strapi.io",
"name": "Strapi team",