import Planka upstream

This commit is contained in:
xiaojibeier
2026-07-18 11:48:22 +08:00
commit c26fd3b190
1564 changed files with 214813 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
/**
* Blueprint API Configuration
* (sails.config.blueprints)
*
* For background on the blueprint API in Sails, check out:
* https://sailsjs.com/docs/reference/blueprint-api
*
* For details and more available options, see:
* https://sailsjs.com/config/blueprints
*/
module.exports.blueprints = {
/**
*
* Automatically expose implicit routes for every action in your app?
*
*/
// actions: false,
/**
*
* Automatically expose RESTful routes for your models?
*
*/
// rest: true,
/**
*
* Automatically expose CRUD "shortcut" routes to GET requests?
* (These are enabled by default in development only.)
*
*/
shortcuts: false,
};
+28
View File
@@ -0,0 +1,28 @@
/**
* Seed Function
* (sails.config.bootstrap)
*
* A function that runs just before your Sails app gets lifted.
* > Need more flexibility? You can also create a hook.
*
* For more information on seeding your app with fake data, check out:
* https://sailsjs.com/config/bootstrap
*/
module.exports.bootstrap = async () => {
// By convention, this is a good place to set up fake data during development.
//
// For example:
// ```
// // Set up fake development data (or if we already have some, avast)
// if (await User.count() > 0) {
// return;
// }
//
// await User.createEach([
// { emailAddress: 'ry@example.com', fullName: 'Ryan Dahl', },
// { emailAddress: 'rachael@example.com', fullName: 'Rachael Shaw', },
// // etc.
// ]);
// ```
};
+122
View File
@@ -0,0 +1,122 @@
/**
* Custom configuration
* (sails.config.custom)
*
* One-off settings specific to your application.
*
* For more information on custom configuration, visit:
* https://sailsjs.com/config/custom
*/
const path = require('path');
const { URL } = require('url');
const bytes = require('bytes');
const sails = require('sails');
const version = require('../version');
const envToNumber = (value) => {
if (!value) {
return null;
}
const number = parseInt(value, 10);
return Number.isNaN(number) ? null : number;
};
const envToBytes = (value) => bytes(value);
const envToArray = (value) => (value ? value.split(',') : []);
const baseUrl = envToArray(process.env.BASE_URL)[0];
const parsedBasedUrl = new URL(baseUrl);
module.exports.custom = {
/**
*
* Any other custom config this Sails app should use during development.
*
*/
version,
baseUrl,
baseUrlPath: parsedBasedUrl.pathname.replace(/\/$/, ''), // Remove trailing slash
baseUrlSecure: parsedBasedUrl.protocol === 'https:',
maxUploadFileSize: envToBytes(process.env.MAX_UPLOAD_FILE_SIZE),
tokenExpiresIn: (parseInt(process.env.TOKEN_EXPIRES_IN, 10) || 365) * 24 * 60 * 60,
storageLimit: envToBytes(process.env.STORAGE_LIMIT),
activeUsersLimit: envToNumber(process.env.ACTIVE_USERS_LIMIT),
// Location to receive uploaded files in. Default (non-string value) is a Sails-specific location.
uploadsTempPath: null,
uploadsBasePath: path.join(sails.config.appPath, 'data'),
faviconsPathSegment: 'protected/favicons',
userAvatarsPathSegment: 'protected/user-avatars',
backgroundImagesPathSegment: 'protected/background-images',
attachmentsPathSegment: 'private/attachments',
defaultAdminEmail:
process.env.DEFAULT_ADMIN_EMAIL && process.env.DEFAULT_ADMIN_EMAIL.toLowerCase(),
showDetailedAuthErrors: process.env.SHOW_DETAILED_AUTH_ERRORS === 'true',
outgoingProxy: process.env.OUTGOING_PROXY,
swaggerExposed: process.env.SWAGGER_EXPOSED === 'true',
s3Endpoint: process.env.S3_ENDPOINT,
s3Region: process.env.S3_REGION,
s3AccessKeyId: process.env.S3_ACCESS_KEY_ID,
s3SecretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
s3Bucket: process.env.S3_BUCKET,
s3ForcePathStyle: process.env.S3_FORCE_PATH_STYLE === 'true',
s3RequestChecksumCalculation: process.env.S3_REQUEST_CHECKSUM_CALCULATION,
oidcIssuer: process.env.OIDC_ISSUER,
oidcClientId: process.env.OIDC_CLIENT_ID,
oidcClientSecret: process.env.OIDC_CLIENT_SECRET,
oidcUseOauthCallback: process.env.OIDC_USE_OAUTH_CALLBACK === 'true',
oidcIdTokenSignedResponseAlg: process.env.OIDC_ID_TOKEN_SIGNED_RESPONSE_ALG,
oidcUserinfoSignedResponseAlg: process.env.OIDC_USERINFO_SIGNED_RESPONSE_ALG,
oidcScopes: process.env.OIDC_SCOPES || 'openid email profile',
oidcResponseMode: process.env.OIDC_RESPONSE_MODE || 'fragment',
oidcUseDefaultResponseMode: process.env.OIDC_USE_DEFAULT_RESPONSE_MODE === 'true',
oidcAdminRoles: envToArray(process.env.OIDC_ADMIN_ROLES),
oidcProjectOwnerRoles: envToArray(process.env.OIDC_PROJECT_OWNER_ROLES),
oidcBoardUserRoles: envToArray(process.env.OIDC_BOARD_USER_ROLES),
oidcClaimsSource: process.env.OIDC_CLAIMS_SOURCE || 'userinfo',
oidcEmailAttribute: process.env.OIDC_EMAIL_ATTRIBUTE || 'email',
oidcNameAttribute: process.env.OIDC_NAME_ATTRIBUTE || 'name',
oidcUsernameAttribute: process.env.OIDC_USERNAME_ATTRIBUTE || 'preferred_username',
oidcRolesAttribute: process.env.OIDC_ROLES_ATTRIBUTE || 'groups',
oidcIgnoreUsername: process.env.OIDC_IGNORE_USERNAME === 'true',
oidcIgnoreRoles: process.env.OIDC_IGNORE_ROLES === 'true',
oidcEnforced: process.env.OIDC_ENFORCED === 'true',
oidcTimeout: envToNumber(process.env.OIDC_TIMEOUT),
oidcDebug: process.env.OIDC_DEBUG === 'true',
// TODO: move client base url to environment variable?
oidcRedirectUri: `${
sails.config.environment === 'production' ? baseUrl : 'http://localhost:3000'
}/oidc-callback`,
smtpHost: process.env.SMTP_HOST,
smtpPort: process.env.SMTP_PORT || 587,
smtpName: process.env.SMTP_NAME,
smtpSecure: process.env.SMTP_SECURE === 'true',
smtpTlsRejectUnauthorized: process.env.SMTP_TLS_REJECT_UNAUTHORIZED !== 'false',
smtpUser: process.env.SMTP_USER,
smtpPassword: process.env.SMTP_PASSWORD,
smtpFrom: process.env.SMTP_FROM,
gravatarBaseUrl: process.env.GRAVATAR_BASE_URL,
/* Internal */
internalAccessToken: process.env.INTERNAL_ACCESS_TOKEN,
termsType: process.env.TERMS_TYPE || 'custom',
customerPanelUrl: process.env.CUSTOMER_PANEL_URL,
demoMode: process.env.DEMO_MODE === 'true',
};
+56
View File
@@ -0,0 +1,56 @@
/**
* Datastores
* (sails.config.datastores)
*
* A set of datastore configurations which tell Sails where to fetch or save
* data when you execute built-in model methods like `.find()` and `.create()`.
*
* > This file is mainly useful for configuring your development database,
* > as well as any additional one-off databases used by individual models.
* > Ready to go live? Head towards `config/env/production.js`.
*
* For more information on configuring datastores, check out:
* https://sailsjs.com/config/datastores
*/
const pg = require('pg');
pg.types.setTypeParser(pg.types.builtins.TIMESTAMP, (value) => new Date(`${value}Z`));
module.exports.datastores = {
/**
*
* Your app's default datastore.
*
* Sails apps read and write to local disk by default, using a built-in
* database adapter called `sails-disk`. This feature is purely for
* convenience during development; since `sails-disk` is not designed for
* use in a production environment.
*
* To use a different db _in development_, follow the directions below.
* Otherwise, just leave the default datastore as-is, with no `adapter`.
*
* (For production configuration, see `config/env/production.js`.)
*
*/
default: {
/**
*
* Want to use a different database during development?
*
* 1. Choose an adapter:
* https://sailsjs.com/plugins/databases
*
* 2. Install it as a dependency of your Sails app.
* (For example: npm install sails-mysql --save)
*
* 3. Then pass it in, along with a connection URL.
* (See https://sailsjs.com/config/datastores for help.)
*
*/
adapter: 'sails-postgresql',
url: process.env.DATABASE_URL,
},
};
+344
View File
@@ -0,0 +1,344 @@
/**
* Production environment settings
* (sails.config.*)
*
* What you see below is a quick outline of the built-in settings you need
* to configure your Sails app for production. The configuration in this file
* is only used in your production environment, i.e. when you lift your app using:
*
* ```
* NODE_ENV=production node app
* ```
*
* > If you're using git as a version control solution for your Sails app,
* > this file WILL BE COMMITTED to your repository by default, unless you add
* > it to your .gitignore file. If your repository will be publicly viewable,
* > don't add private/sensitive data (like API secrets / db passwords) to this file!
*
* For more best practices and tips, see:
* https://sailsjs.com/docs/concepts/deployment
*/
const { URL } = require('url');
const { customLogger } = require('../../utils/logger');
const origins = process.env.BASE_URL.split(',').map((baseUrl) => new URL(baseUrl).origin);
module.exports = {
/**
*
* Tell Sails what database(s) it should use in production.
*
* (https://sailsjs.com/config/datastores)
*
*/
datastores: {
/**
*
* Configure your default production database.
*
* 1. Choose an adapter:
* https://sailsjs.com/plugins/databases
*
* 2. Install it as a dependency of your Sails app.
* (For example: npm install sails-mysql --save)
*
* 3. Then set it here (`adapter`), along with a connection URL (`url`)
* and any other, adapter-specific customizations.
* (See https://sailsjs.com/config/datastores for help.)
*
*/
default: {
// adapter: 'sails-mysql',
// url: 'mysql://user:password@host:port/database',
/**
*
* More adapter-specific options
*
* > For example, for some hosted PostgreSQL providers (like Heroku), the
* > extra `ssl: true` option is mandatory and must be provided.
*
* More info:
* https://sailsjs.com/config/datastores
*
*/
// ssl: true,
},
},
models: {
/**
*
* To help avoid accidents, Sails automatically sets the automigration
* strategy to "safe" when your app lifts in production mode.
* (This is just here as a reminder.)
*
* More info:
* https://sailsjs.com/docs/concepts/models-and-orm/model-settings#?migrate
*
*/
// migrate: 'safe',
/**
*
* If, in production, this app has access to physical-layer CASCADE
* constraints (e.g. PostgreSQL or MySQL), then set those up in the
* database and uncomment this to disable Waterline's `cascadeOnDestroy`
* polyfill. (Otherwise, if you are using a databse like Mongo, you might
* choose to keep this enabled.)
*
*/
// cascadeOnDestroy: false,
},
/**
* Always disable "shortcut" blueprint routes.
*
* > You'll also want to disable any other blueprint routes if you are not
* > actually using them (e.g. "actions" and "rest") -- but you can do
* > that in `config/blueprints.js`, since you'll want to disable them in
* > all environments (not just in production.)
*
*/
blueprints: {
// shortcuts: false,
},
/**
*
* Configure your security settings for production.
*
* IMPORTANT:
* If web browsers will be communicating with your app, be sure that
* you have CSRF protection enabled. To do that, set `csrf: true` over
* in the `config/security.js` file (not here), so that CSRF app can be
* tested with CSRF protection turned on in development mode too.
*
*/
security: {
/**
*
* If this app has CORS enabled (see `config/security.js`) with the
* `allowCredentials` setting enabled, then you should uncomment the
* `allowOrigins` whitelist below. This sets which "origins" are allowed
* to send cross-domain (CORS) requests to your Sails app.
*
* > Replace "https://example.com" with the URL of your production server.
* > Be sure to use the right protocol! ("http://" vs. "https://")
*
*/
cors: {
allRoutes: true,
allowOrigins: origins.slice(1),
allowRequestHeaders: ['Authorization'],
allowCredentials: true,
},
},
/**
*
* Configure how your app handles sessions in production.
*
* (https://sailsjs.com/config/session)
*
* > If you have disabled the "session" hook, then you can safely remove
* > this section from your `config/env/production.js` file.
*
*/
session: {
/**
*
* Production session store configuration.
*
* Uncomment the following lines to finish setting up a package called
* "@sailshq/connect-redis" that will use Redis to handle session data.
* This makes your app more scalable by allowing you to share sessions
* across a cluster of multiple Sails/Node.js servers and/or processes.
* (See http://bit.ly/redis-session-config for more info.)
*
* > While @sailshq/connect-redis is a popular choice for Sails apps, many
* > other compatible packages (like "connect-mongo") are available on NPM.
* > (For a full list, see https://sailsjs.com/plugins/sessions)
*
*/
// adapter: '@sailshq/connect-redis',
// url: 'redis://user:password@localhost:6379/databasenumber',
/**
*
* Production configuration for the session ID cookie.
*
* Tell browsers (or other user agents) to ensure that session ID cookies
* are always transmitted via HTTPS, and that they expire 24 hours after
* they are set.
*
* Note that with `secure: true` set, session cookies will _not_ be
* transmitted over unsecured (HTTP) connections. Also, for apps behind
* proxies (like Heroku), the `trustProxy` setting under `http` must be
* configured in order for `secure: true` to work.
*
* > While you might want to increase or decrease the `maxAge` or provide
* > other options, you should always set `secure: true` in production
* > if the app is being served over HTTPS.
*
* Read more:
* https://sailsjs.com/config/session#?the-session-id-cookie
*
*/
cookie: {
// secure: true,
maxAge: 24 * 60 * 60 * 1000, // 24 hours
},
},
/**
*
* Set up Socket.io for your production environment.
*
* (https://sailsjs.com/config/sockets)
*
* > If you have disabled the "sockets" hook, then you can safely remove
* > this section from your `config/env/production.js` file.
*
*/
sockets: {
/**
*
* Uncomment the `onlyAllowOrigins` whitelist below to configure which
* "origins" are allowed to open socket connections to your Sails app.
*
* > Replace "https://example.com" etc. with the URL(s) of your app.
* > Be sure to use the right protocol! ("http://" vs. "https://")
*
*/
onlyAllowOrigins: origins,
/**
*
* If you are deploying a cluster of multiple servers and/or processes,
* then uncomment the following lines. This tells Socket.io about a Redis
* server it can use to help it deliver broadcasted socket messages.
*
* > Be sure a compatible version of @sailshq/socket.io-redis is installed!
* > (See https://sailsjs.com/config/sockets for the latest version info)
*
* (https://sailsjs.com/docs/concepts/deployment/scaling)
*
*/
// adapter: '@sailshq/socket.io-redis',
// url: 'redis://user:password@bigsquid.redistogo.com:9562/databasenumber',
},
/**
*
* Set the production log level.
*
* (https://sailsjs.com/config/log)
*
*/
log: {
/**
* Passthrough plain log message(s) to
* custom Winston console and file logger.
*
* Note that Winston's log levels override Sails' log levels.
* Refer: https://github.com/winstonjs/winston#logging
*/
inspect: false,
custom: customLogger,
/**
* Removes the Sail.js init success logs (ASCII ship art).
*/
noShip: true,
},
http: {
/**
*
* The number of milliseconds to cache static assets in production.
* (the "max-age" to include in the "Cache-Control" response header)
*
*/
cache: 365.25 * 24 * 60 * 60 * 1000, // One year
/**
*
* Proxy settings
*
* If your app will be deployed behind a proxy/load balancer - for example,
* on a PaaS like Heroku - then uncomment the `trustProxy` setting below.
* This tells Sails/Express how to interpret X-Forwarded headers.
*
* This setting is especially important if you are using secure cookies
* (see the `cookies: secure` setting under `session` above) or if your app
* relies on knowing the original IP address that a request came from.
*
* (https://sailsjs.com/config/http)
*
*/
trustProxy: process.env.TRUST_PROXY === 'true',
},
/**
*
* Lift the server on port 80.
* (if deploying behind a proxy, or to a PaaS like Heroku or Deis, you
* probably don't need to set a port here, because it is oftentimes
* handled for you automatically. If you are not sure if you need to set
* this, just try deploying without setting it and see if it works.)
*
*/
// port: 80,
/**
*
* Configure an SSL certificate
*
* For the safety of your users' data, you should use SSL in production.
* ...But in many cases, you may not actually want to set it up _here_.
*
* Normally, this setting is only relevant when running a single-process
* deployment, with no proxy/load balancer in the mix. But if, on the
* other hand, you are using a PaaS like Heroku, you'll want to set up
* SSL in your load balancer settings (usually somewhere in your hosting
* provider's dashboard-- not here.)
*
* > For more information about configuring SSL in Sails, see:
* > https://sailsjs.com/config/*#?sailsconfigssl
*
*/
// ssl: undefined,
/**
*
* Production overrides for any custom settings specific to your app.
* (for example, production credentials for 3rd party APIs like Stripe)
*
* > See config/custom.js for more info on how to configure these options.
*
*/
custom: {
// baseUrl: 'https://example.com',
// internalEmailAddress: 'support@example.com',
},
};
+70
View File
@@ -0,0 +1,70 @@
/**
* Test environment settings
* (sails.config.*)
*
* What you see below is a quick outline of the built-in settings you need
* to configure your Sails app for test. The configuration in this file
* is only used in your test environment, i.e. when you lift your app using:
*
* ```
* NODE_ENV=test node app
* ```
*
* > If you're using git as a version control solution for your Sails app,
* > this file WILL BE COMMITTED to your repository by default, unless you add
* > it to your .gitignore file. If your repository will be publicly viewable,
* > don't add private/sensitive data (like API secrets / db passwords) to this file!
*
* For more best practices and tips, see:
* https://sailsjs.com/docs/concepts/deployment
*/
module.exports = {
/**
*
* Tell Sails what database(s) it should use in test.
*
* (https://sailsjs.com/config/datastores)
*
*/
datastores: {
/**
*
* Configure your default test database.
*
* 1. Choose an adapter:
* https://sailsjs.com/plugins/databases
*
* 2. Install it as a dependency of your Sails app.
* (For example: npm install sails-mysql --save)
*
* 3. Then set it here (`adapter`), along with a connection URL (`url`)
* and any other, adapter-specific customizations.
* (See https://sailsjs.com/config/datastores for help.)
*
*/
default: {
adapter: 'sails-disk',
/**
*
* More adapter-specific options
*
* > For example, for some hosted PostgreSQL providers (like Heroku), the
* > extra `ssl: true` option is mandatory and must be provided.
*
* More info:
* https://sailsjs.com/config/datastores
*
*/
inMemoryOnly: true,
},
},
log: {
level: 'warn',
},
};
+50
View File
@@ -0,0 +1,50 @@
/**
* Global Variable Configuration
* (sails.config.globals)
*
* Configure which global variables which will be exposed
* automatically by Sails.
*
* For more information on any of these options, check out:
* https://sailsjs.com/config/globals
*/
module.exports.globals = {
/**
*
* Whether to expose the locally-installed Lodash as a global variable
* (`_`), making it accessible throughout your app.
*
*/
_: require('lodash'), // eslint-disable-line global-require
/**
*
* This app was generated without a dependency on the "async" NPM package.
*
* > Don't worry! This is totally unrelated to JavaScript's "async/await".
* > Your code can (and probably should) use `await` as much as possible.
*
*/
async: false,
/**
*
* Whether to expose each of your app's models as global variables.
* (See the link at the top of this file for more information.)
*
*/
models: true,
/**
*
* Whether to expose the Sails app instance as a global variable (`sails`),
* making it accessible throughout your app.
*
*/
sails: true,
};
+66
View File
@@ -0,0 +1,66 @@
/**
* HTTP Server Settings
* (sails.config.http)
*
* Configuration for the underlying HTTP server in Sails.
* (for additional recommended settings, see `config/env/production.js`)
*
* For more information on configuration, check out:
* https://sailsjs.com/config/http
*/
const serveStatic = require('serve-static');
const sails = require('sails');
module.exports.http = {
/**
*
* Sails/Express middleware to run for every HTTP request.
* (Only applies to HTTP requests -- not virtual WebSocket requests.)
*
* https://sailsjs.com/documentation/concepts/middleware
*
*/
middleware: {
/**
*
* The order in which middleware should be run for HTTP requests.
* (This Sails app's routes are handled by the "router" middleware below.)
*
*/
// order: [
// 'cookieParser',
// 'session',
// 'bodyParser',
// 'compress',
// 'poweredBy',
// 'router',
// 'www',
// 'favicon',
// ],
/**
*
* The body parser that will handle incoming multipart HTTP requests.
*
* https://sailsjs.com/config/http#?customizing-the-body-parser
*
*/
// bodyParser: (function _configureBodyParser(){
// var skipper = require('skipper');
// var middlewareFn = skipper({ strict: true });
// return middlewareFn;
// })(),
poweredBy: false,
www(req, res, next) {
const middleware = serveStatic(sails.config.paths.public, {
maxAge: sails.config.http.cache,
immutable: req.url.startsWith('/assets/'),
});
return middleware(req, res, next);
},
},
};
+79
View File
@@ -0,0 +1,79 @@
/**
* Internationalization / Localization Settings
* (sails.config.i18n)
*
* If your app will touch people from all over the world, i18n (or internationalization)
* may be an important part of your international strategy.
*
* For a complete list of options for Sails' built-in i18n support, see:
* https://sailsjs.com/config/i-18-n
*
* For more info on i18n in Sails in general, check out:
* https://sailsjs.com/docs/concepts/internationalization
*/
module.exports.i18n = {
/**
*
* Which locales are supported?
*
*/
locales: [
'ar-YE',
'bg-BG',
'ca-ES',
'cs-CZ',
'da-DK',
'de-DE',
'el-GR',
'en-GB',
'en-US',
'es-ES',
'et-EE',
'fa-IR',
'fi-FI',
'fr-FR',
'hu-HU',
'id-ID',
'it-IT',
'ja-JP',
'ko-KR',
'nl-NL',
'pl-PL',
'pt-BR',
'pt-PT',
'ro-RO',
'ru-RU',
'sk-SK',
'sr-Cyrl-RS',
'sr-Latn-RS',
'sv-SE',
'tr-TR',
'uk-UA',
'uz-UZ',
'vi-VN',
'zh-CN',
'zh-TW',
],
/**
*
* What is the default locale for the site? Note that this setting will be
* overridden for any request that sends an "Accept-Language" header (i.e.
* most browsers), but it's still useful if you need to localize the
* response for requests made by non-browser clients (e.g. cURL).
*
*/
defaultLocale: process.env.DEFAULT_LANGUAGE || 'en-US',
/**
*
* Path (relative to app root) of directory to store locale (translation)
* files in.
*
*/
// localesDirectory: 'config/locales',
};
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "أرشيف",
"Card Created": "تم إنشاء البطاقة",
"Card Moved": "تم نقل البطاقة",
"copy": "نسخة",
"New Comment": "تعليق جديد",
"Test Title": "عنوان تجريبي",
"This is a test text message!": "هذه رسالة نصية تجريبية!",
"This is a *test* **markdown** `message`!": "هذه *رسالة* **markdown** `تجريبية`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "هذه <i>رسالة</i> <b>html</b> <code>تجريبية</code>!",
"Trash": "سلة المهملات",
"You Were Added to Card": "تمت إضافتك إلى البطاقة",
"You Were Mentioned in Comment": "تم ذكرك في تعليق",
"%s added you to %s on %s": "%s أضافك إلى %s في %s",
"%s created %s in %s on %s": "%s أنشأ %s في %s في %s",
"%s left a new comment to %s on %s": "%s ترك تعليقاً جديداً على %s في %s",
"%s mentioned you in %s on %s": "%s ذكرك في %s في %s",
"%s moved %s from %s to %s on %s": "%s نقل %s من %s إلى %s في %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Архив",
"Card Created": "Картата е създадена",
"Card Moved": "Картата е преместена",
"copy": "копие",
"New Comment": "Нов коментар",
"Test Title": "Тестово заглавие",
"This is a test text message!": "Това е тестово текстово съобщение!",
"This is a *test* **markdown** `message`!": "Това е *тестово* **markdown** `съобщение`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Това е <i>тестово</i> <b>html</b> <code>съобщение</code>!",
"Trash": "Кошче",
"You Were Added to Card": "Бяхте добавени към картата",
"You Were Mentioned in Comment": "Бяхте споменати в коментар",
"%s added you to %s on %s": "%s ви добави към %s на %s",
"%s created %s in %s on %s": "%s създаде %s в %s на %s",
"%s left a new comment to %s on %s": "%s остави нов коментар към %s на %s",
"%s mentioned you in %s on %s": "%s ви спомена в %s на %s",
"%s moved %s from %s to %s on %s": "%s премести %s от %s към %s на %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arxivar",
"Card Created": "Targeta creada",
"Card Moved": "Targeta moguda",
"copy": "còpia",
"New Comment": "Comentari nou",
"Test Title": "Títol de prova",
"This is a test text message!": "Aquest és un missatge de text de prova!",
"This is a *test* **markdown** `message`!": "Aquest és un *missatge* **markdown** `de prova`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Aquest és un <i>missatge</i> <b>html</b> <code>de prova</code>!",
"Trash": "Paperera",
"You Were Added to Card": "Has estat afegit a la targeta",
"You Were Mentioned in Comment": "Has estat mencionat en un comentari",
"%s added you to %s on %s": "%s t'ha afegit a %s el %s",
"%s created %s in %s on %s": "%s s'ha creat %s a %s el %s",
"%s left a new comment to %s on %s": "%s ha deixat un comentari nou a %s el %s",
"%s mentioned you in %s on %s": "%s t'ha mencionat a %s el %s",
"%s moved %s from %s to %s on %s": "%s s'ha mogut %s de %s a %s el %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archiv",
"Card Created": "Karta vytvořena",
"Card Moved": "Karta přesunuta",
"copy": "kopie",
"New Comment": "Nový komentář",
"Test Title": "Testovací název",
"This is a test text message!": "Toto je testovací textová zpráva!",
"This is a *test* **markdown** `message`!": "Toto je *testovací* **markdown** `zpráva`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Toto je <i>testovací</i> <b>html</b> <code>zpráva</code>!",
"Trash": "Koš",
"You Were Added to Card": "Byli jste přidáni ke kartě",
"You Were Mentioned in Comment": "Byli jste zmíněni v komentáři",
"%s added you to %s on %s": "%s vás přidal k %s dne %s",
"%s created %s in %s on %s": "%s vytvořil %s v %s dne %s",
"%s left a new comment to %s on %s": "%s zanechal nový komentář k %s dne %s",
"%s mentioned you in %s on %s": "%s vás zmínil v %s dne %s",
"%s moved %s from %s to %s on %s": "%s přesunul %s z %s do %s dne %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arkiv",
"Card Created": "Kort oprettet",
"Card Moved": "Kort flyttet",
"copy": "kopi",
"New Comment": "Ny kommentar",
"Test Title": "Test titel",
"This is a test text message!": "Dette er en test tekstbesked!",
"This is a *test* **markdown** `message`!": "Dette er en *test* **markdown** `besked`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Dette er en <i>test</i> <b>html</b> <code>besked</code>!",
"Trash": "Papirkurv",
"You Were Added to Card": "Du blev tilføjet til kortet",
"You Were Mentioned in Comment": "Du blev nævnt i en kommentar",
"%s added you to %s on %s": "%s tilføjede dig til %s den %s",
"%s created %s in %s on %s": "%s oprettede %s i %s den %s",
"%s left a new comment to %s on %s": "%s efterlod en ny kommentar til %s den %s",
"%s mentioned you in %s on %s": "%s nævnte dig i %s den %s",
"%s moved %s from %s to %s on %s": "%s flyttede %s fra %s til %s den %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archiv",
"Card Created": "Karte erstellt",
"Card Moved": "Karte verschoben",
"copy": "Kopie",
"New Comment": "Neuer Kommentar",
"Test Title": "Testtitel",
"This is a test text message!": "Dies ist eine Test-Textnachricht!",
"This is a *test* **markdown** `message`!": "Dies ist eine *Test*-**Markdown**-`Nachricht`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Dies ist eine <i>Test</i>-<b>HTML</b>-<code>Nachricht</code>!",
"Trash": "Papierkorb",
"You Were Added to Card": "Sie wurden zur Karte hinzugefügt",
"You Were Mentioned in Comment": "Sie wurden in einem Kommentar erwähnt",
"%s added you to %s on %s": "%s hat Sie zur Karte %s auf dem Board %s hinzugefügt",
"%s created %s in %s on %s": "%s hat die Karte %s in der Liste %s auf dem Board %s erstellt",
"%s left a new comment to %s on %s": "%s hat einen neuen Kommentar zur Karte %s auf dem Board %s hinterlassen",
"%s mentioned you in %s on %s": "%s hat Sie in der Karte %s auf dem Board %s erwähnt",
"%s moved %s from %s to %s on %s": "%s hat die Karte %s von der Liste %s in die Liste %s auf dem Board %s verschoben"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Αρχείο",
"Card Created": "Η κάρτα δημιουργήθηκε",
"Card Moved": "Η κάρτα μετακινήθηκε",
"copy": "αντίγραφο",
"New Comment": "Νέο σχόλιο",
"Test Title": "Τίτλος δοκιμής",
"This is a test text message!": "Αυτό είναι ένα δοκιμαστικό μήνυμα!",
"This is a *test* **markdown** `message`!": "Αυτό είναι ένα *δοκιμαστικό* **markdown** `μήνυμα`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Αυτό είναι ένα <i>δοκιμαστικό</i> <b>html</b> <code>μήνυμα</code>!",
"Trash": "Κάδος απορριμμάτων",
"You Were Added to Card": "Προστέθηκες στην κάρτα",
"You Were Mentioned in Comment": "Αναφέρθηκες σε σχόλιο",
"%s added you to %s on %s": "%s σε πρόσθεσε στο %s στο %s",
"%s created %s in %s on %s": "%s δημιούργησε το %s στο %s στο %s",
"%s left a new comment to %s on %s": "%s άφησε νέο σχόλιο στο %s στο %s",
"%s mentioned you in %s on %s": "%s σε ανέφερε στο %s στο %s",
"%s moved %s from %s to %s on %s": "%s μετακίνησε το %s από το %s στο %s στο %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archive",
"Card Created": "Card Created",
"Card Moved": "Card Moved",
"copy": "copy",
"New Comment": "New Comment",
"Test Title": "Test Title",
"This is a test text message!": "This is a test text message!",
"This is a *test* **markdown** `message`!": "This is a *test* **markdown** `message`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "This is a <i>test</i> <b>html</b> <code>message</code>!",
"Trash": "Trash",
"You Were Added to Card": "You Were Added to Card",
"You Were Mentioned in Comment": "You Were Mentioned in Comment",
"%s added you to %s on %s": "%s added you to %s on %s",
"%s created %s in %s on %s": "%s created %s in %s on %s",
"%s left a new comment to %s on %s": "%s left a new comment to %s on %s",
"%s mentioned you in %s on %s": "%s mentioned you in %s on %s",
"%s moved %s from %s to %s on %s": "%s moved %s from %s to %s on %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archive",
"Card Created": "Card Created",
"Card Moved": "Card Moved",
"copy": "copy",
"New Comment": "New Comment",
"Test Title": "Test Title",
"This is a test text message!": "This is a test text message!",
"This is a *test* **markdown** `message`!": "This is a *test* **markdown** `message`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "This is a <i>test</i> <b>html</b> <code>message</code>!",
"Trash": "Trash",
"You Were Added to Card": "You Were Added to Card",
"You Were Mentioned in Comment": "You Were Mentioned in Comment",
"%s added you to %s on %s": "%s added you to %s on %s",
"%s created %s in %s on %s": "%s created %s in %s on %s",
"%s left a new comment to %s on %s": "%s left a new comment to %s on %s",
"%s mentioned you in %s on %s": "%s mentioned you in %s on %s",
"%s moved %s from %s to %s on %s": "%s moved %s from %s to %s on %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archivo",
"Card Created": "Tarjeta creada",
"Card Moved": "Tarjeta movida",
"copy": "copia",
"New Comment": "Nuevo comentario",
"Test Title": "Título de prueba",
"This is a test text message!": "¡Este es un mensaje de texto de prueba!",
"This is a *test* **markdown** `message`!": "¡Este es un *mensaje* **markdown** `de prueba`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "¡Este es un <i>mensaje</i> <b>html</b> <code>de prueba</code>!",
"Trash": "Papelera",
"You Were Added to Card": "Fuiste añadido a la tarjeta",
"You Were Mentioned in Comment": "Fuiste mencionado en un comentario",
"%s added you to %s on %s": "%s te añadió a %s en %s",
"%s created %s in %s on %s": "%s creó %s en %s el %s",
"%s left a new comment to %s on %s": "%s dejó un nuevo comentario en %s el %s",
"%s mentioned you in %s on %s": "%s te mencionó en %s el %s",
"%s moved %s from %s to %s on %s": "%s movió %s de %s a %s el %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arhiiv",
"Card Created": "Kaart loodud",
"Card Moved": "Kaart liigutatud",
"copy": "koopia",
"New Comment": "Uus kommentaar",
"Test Title": "Testi pealkiri",
"This is a test text message!": "See on testi tekstisõnum!",
"This is a *test* **markdown** `message`!": "See on *testi* **markdown** `sõnum`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "See on <i>testi</i> <b>html</b> <code>sõnum</code>!",
"Trash": "Prügikast",
"You Were Added to Card": "Teid lisati kaardile",
"You Were Mentioned in Comment": "Teid mainiti kommentaaris",
"%s added you to %s on %s": "%s lisas teid %s-le %s",
"%s created %s in %s on %s": "%s lõi %s %s-s %s",
"%s left a new comment to %s on %s": "%s jättis uue kommentaari %s-le %s",
"%s mentioned you in %s on %s": "%s mainis teid %s-s %s",
"%s moved %s from %s to %s on %s": "%s liigutas %s %s-st %s-sse %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "بایگانی",
"Card Created": "کارت ایجاد شد",
"Card Moved": "کارت منتقل شد",
"copy": "کپی",
"New Comment": "نظر جدید",
"Test Title": "عنوان آزمایشی",
"This is a test text message!": "این یک پیام متنی آزمایشی است!",
"This is a *test* **markdown** `message`!": "این یک *پیام* **markdown** `آزمایشی` است!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "این یک <i>پیام</i> <b>html</b> <code>آزمایشی</code> است!",
"Trash": "سطل زباله",
"You Were Added to Card": "شما به کارت اضافه شدید",
"You Were Mentioned in Comment": "در نظری از شما نام برده شد",
"%s added you to %s on %s": "%s شما را به %s در %s اضافه کرد",
"%s created %s in %s on %s": "%s ایجاد کرد %s در %s در %s",
"%s left a new comment to %s on %s": "%s نظر جدیدی برای %s در %s گذاشت",
"%s mentioned you in %s on %s": "%s از شما در %s در %s نام برد",
"%s moved %s from %s to %s on %s": "%s منتقل کرد %s از %s به %s در %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arkisto",
"Card Created": "Kortti luotu",
"Card Moved": "Kortti siirretty",
"copy": "kopio",
"New Comment": "Uusi kommentti",
"Test Title": "Testin otsikko",
"This is a test text message!": "Tämä on testiviesti!",
"This is a *test* **markdown** `message`!": "Tämä on *testi* **markdown** `viesti`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Tämä on <i>testi</i> <b>html</b> <code>viesti</code>!",
"Trash": "Roskakori",
"You Were Added to Card": "Sinut lisättiin korttiin",
"You Were Mentioned in Comment": "Sinut mainittiin kommentissa",
"%s added you to %s on %s": "%s lisäsi sinut kohteeseen %s kohteessa %s",
"%s created %s in %s on %s": "%s loi %s kohteessa %s kohteessa %s",
"%s left a new comment to %s on %s": "%s jätti uuden kommentin kohteeseen %s kohteessa %s",
"%s mentioned you in %s on %s": "%s mainitsi sinut kohteessa %s kohteessa %s",
"%s moved %s from %s to %s on %s": "%s siirsi %s kohteesta %s kohteeseen %s kohteessa %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archive",
"Card Created": "Carte créée",
"Card Moved": "Carte déplacée",
"copy": "copie",
"New Comment": "Nouveau commentaire",
"Test Title": "Titre de test",
"This is a test text message!": "Ceci est un message texte de test !",
"This is a *test* **markdown** `message`!": "Ceci est un *message* **markdown** `de test` !",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Ceci est un <i>test</i> <b>html</b> <code>message</code>!",
"Trash": "Corbeille",
"You Were Added to Card": "Vous avez été ajouté à la carte",
"You Were Mentioned in Comment": "Vous avez été mentionné dans un commentaire",
"%s added you to %s on %s": "%s vous a ajouté à %s le %s",
"%s created %s in %s on %s": "%s a créé %s dans %s le %s",
"%s left a new comment to %s on %s": "%s a laissé un nouveau commentaire sur %s le %s",
"%s mentioned you in %s on %s": "%s vous a mentionné dans %s le %s",
"%s moved %s from %s to %s on %s": "%s a déplacé %s de %s vers %s le %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archívum",
"Card Created": "Kártya létrehozva",
"Card Moved": "Kártya áthelyezve",
"copy": "másolat",
"New Comment": "Új hozzászólás",
"Test Title": "Teszt cím",
"This is a test text message!": "Ez itt egy szöveges teszt üzenet!",
"This is a *test* **markdown** `message`!": "Ez itt egy **markdown** formátumú *teszt* `üzenet`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Ez egy <b>html</b> formátumú <i>teszt</i> <code>üzenet</code>!",
"Trash": "Kuka",
"You Were Added to Card": "Hozzádrendeltek egy kártyát",
"You Were Mentioned in Comment": "Megemlítettek egy kártyán",
"%s added you to %s on %s": "%s hozzárendelt téged a(z) %s kártyához a(z) %s projektben",
"%s created %s in %s on %s": "%s létrehozta a(z) %s kártyát a(z) %s projektben ekkor: %s",
"%s left a new comment to %s on %s": "%s hozzászólt a(z) %s kártyához a(z) %s projektben",
"%s mentioned you in %s on %s": "%s megemlített téged a(z) %s kártyán a(z) %s projektben",
"%s moved %s from %s to %s on %s": "%s átmozgatta a(z) %s kártyát a(z) %s projektből a(z) %s projektbe ekkor: %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arsip",
"Card Created": "Kartu dibuat",
"Card Moved": "Kartu dipindahkan",
"copy": "salinan",
"New Comment": "Komentar baru",
"Test Title": "Judul tes",
"This is a test text message!": "Ini adalah pesan teks tes!",
"This is a *test* **markdown** `message`!": "Ini adalah *pesan* **markdown** `tes`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Ini adalah <i>pesan</i> <b>html</b> <code>tes</code>!",
"Trash": "Sampah",
"You Were Added to Card": "Anda ditambahkan ke kartu",
"You Were Mentioned in Comment": "Anda disebutkan dalam komentar",
"%s added you to %s on %s": "%s menambahkan Anda ke %s pada %s",
"%s created %s in %s on %s": "%s membuat %s di %s pada %s",
"%s left a new comment to %s on %s": "%s meninggalkan komentar baru untuk %s pada %s",
"%s mentioned you in %s on %s": "%s menyebutkan Anda di %s pada %s",
"%s moved %s from %s to %s on %s": "%s memindahkan %s dari %s ke %s pada %s"
}
+18
View File
@@ -0,0 +1,18 @@
{
"Archive": "Archivio",
"Card Created": "Nuova task creata",
"Card Moved": "Task spostata",
"copy": "copia",
"New Comment": "Nuovo commento",
"Test Title": "Titolo di test",
"This is a test text message!": "Questo è un messaggio di testo di test!",
"This is a *test* **markdown** `message`!": "Questo è un *test* **markdown** `messaggio`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Questo è un <i>test</i> <b>html</b> <code>messaggio</code>!",
"Trash": "Cestino",
"You Were Added to Card": "Sei stato aggiunto alla task",
"You Were Mentioned in Comment": "Sei stato menzionato nel commento",
"%s created %s in %s on %s": "%s ha creato %s in %s in %s",
"%s left a new comment to %s on %s": "%s ha commentato %s in %s",
"%s mentioned you in %s on %s": "%s ti ha menzionato in %s in %s",
"%s moved %s from %s to %s on %s": "%s ha spostato %s da %s a %s in %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "アーカイブ",
"Card Created": "カードが作成されました",
"Card Moved": "カードが移動されました",
"copy": "コピー",
"New Comment": "新しいコメント",
"Test Title": "テストタイトル",
"This is a test text message!": "これはテストテキストメッセージです!",
"This is a *test* **markdown** `message`!": "これは*テスト***markdown**`メッセージ`です!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "これは<i>テスト</i><b>html</b><code>メッセージ</code>です!",
"Trash": "ゴミ箱",
"You Were Added to Card": "カードに追加されました",
"You Were Mentioned in Comment": "コメントでメンションされました",
"%s added you to %s on %s": "%sが%sの%sにあなたを追加しました",
"%s created %s in %s on %s": "%sが%sの%sに%sを作成しました",
"%s left a new comment to %s on %s": "%sが%sの%sに新しいコメントを残しました",
"%s mentioned you in %s on %s": "%sが%sの%sであなたをメンションしました",
"%s moved %s from %s to %s on %s": "%sが%sの%sを%sから%sに移動しました"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "보관함",
"Card Created": "카드가 생성됨",
"Card Moved": "카드가 이동됨",
"copy": "복사본",
"New Comment": "새 댓글",
"Test Title": "테스트 제목",
"This is a test text message!": "이것은 테스트 텍스트 메시지입니다!",
"This is a *test* **markdown** `message`!": "이것은 *테스트* **markdown** `메시지`입니다!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "이것은 <i>테스트</i> <b>html</b> <code>메시지</code>입니다!",
"Trash": "휴지통",
"You Were Added to Card": "카드에 추가되었습니다",
"You Were Mentioned in Comment": "댓글에서 언급되었습니다",
"%s added you to %s on %s": "%s님이 %s의 %s에 당신을 추가했습니다",
"%s created %s in %s on %s": "%s님이 %s의 %s에 %s을(를) 생성했습니다",
"%s left a new comment to %s on %s": "%s님이 %s의 %s에 새 댓글을 남겼습니다",
"%s mentioned you in %s on %s": "%s님이 %s의 %s에서 당신을 언급했습니다",
"%s moved %s from %s to %s on %s": "%s님이 %s의 %s을(를) %s에서 %s(으)로 이동했습니다"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archief",
"Card Created": "Kaart aangemaakt",
"Card Moved": "Kaart verplaatst",
"copy": "kopie",
"New Comment": "Nieuwe reactie",
"Test Title": "Test titel",
"This is a test text message!": "Dit is een test tekstbericht!",
"This is a *test* **markdown** `message`!": "Dit is een *test* **markdown** `bericht`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Dit is een <i>test</i> <b>html</b> <code>bericht</code>!",
"Trash": "Prullenbak",
"You Were Added to Card": "Je bent toegevoegd aan kaart",
"You Were Mentioned in Comment": "Je bent genoemd in reactie",
"%s added you to %s on %s": "%s heeft je toegevoegd aan %s op %s",
"%s created %s in %s on %s": "%s heeft %s aangemaakt in %s op %s",
"%s left a new comment to %s on %s": "%s heeft een nieuwe reactie achtergelaten op %s op %s",
"%s mentioned you in %s on %s": "%s heeft je genoemd in %s op %s",
"%s moved %s from %s to %s on %s": "%s heeft %s verplaatst van %s naar %s op %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archiwum",
"Card Created": "Karta utworzona",
"Card Moved": "Karta przeniesiona",
"copy": "kopia",
"New Comment": "Nowy komentarz",
"Test Title": "Tytuł testowy",
"This is a test text message!": "To jest testowa wiadomość tekstowa!",
"This is a *test* **markdown** `message`!": "To jest *testowa* **markdown** `wiadomość`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "To jest <i>testowa</i> <b>html</b> <code>wiadomość</code>!",
"Trash": "Kosz",
"You Were Added to Card": "Zostałeś dodany do karty",
"You Were Mentioned in Comment": "Zostałeś wspomniany w komentarzu",
"%s added you to %s on %s": "%s dodał cię do %s w dniu %s",
"%s created %s in %s on %s": "%s utworzył %s w %s w dniu %s",
"%s left a new comment to %s on %s": "%s zostawił nowy komentarz do %s w dniu %s",
"%s mentioned you in %s on %s": "%s wspomniał o tobie w %s w dniu %s",
"%s moved %s from %s to %s on %s": "%s przeniósł %s z %s do %s w dniu %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arquivo",
"Card Created": "Cartão criado",
"Card Moved": "Cartão movido",
"copy": "cópia",
"New Comment": "Novo comentário",
"Test Title": "Título de teste",
"This is a test text message!": "Esta é uma mensagem de texto de teste!",
"This is a *test* **markdown** `message`!": "Esta é uma *mensagem* **markdown** `de teste`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Esta é uma <i>mensagem</i> <b>html</b> <code>de teste</code>!",
"Trash": "Lixeira",
"You Were Added to Card": "Você foi adicionado ao cartão",
"You Were Mentioned in Comment": "Você foi mencionado em comentário",
"%s added you to %s on %s": "%s adicionou você a %s em %s",
"%s created %s in %s on %s": "%s criou %s em %s em %s",
"%s left a new comment to %s on %s": "%s deixou um novo comentário em %s em %s",
"%s mentioned you in %s on %s": "%s mencionou você em %s em %s",
"%s moved %s from %s to %s on %s": "%s moveu %s de %s para %s em %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arquivo",
"Card Created": "Cartão criado",
"Card Moved": "Cartão movido",
"copy": "cópia",
"New Comment": "Novo comentário",
"Test Title": "Título de teste",
"This is a test text message!": "Esta é uma mensagem de texto de teste!",
"This is a *test* **markdown** `message`!": "Esta é uma *mensagem* **markdown** `de teste`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Esta é uma <i>mensagem</i> <b>html</b> <code>de teste</code>!",
"Trash": "Lixo",
"You Were Added to Card": "Foi adicionado ao cartão",
"You Were Mentioned in Comment": "Foi mencionado num comentário",
"%s added you to %s on %s": "%s adicionou-o a %s em %s",
"%s created %s in %s on %s": "%s criou %s em %s em %s",
"%s left a new comment to %s on %s": "%s deixou um novo comentário em %s em %s",
"%s mentioned you in %s on %s": "%s mencionou-o em %s em %s",
"%s moved %s from %s to %s on %s": "%s moveu %s de %s para %s em %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arhivă",
"Card Created": "Card creat",
"Card Moved": "Card mutat",
"copy": "copie",
"New Comment": "Comentariu nou",
"Test Title": "Titlu de test",
"This is a test text message!": "Acesta este un mesaj text de test!",
"This is a *test* **markdown** `message`!": "Acesta este un *mesaj* **markdown** `de test`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Acesta este un <i>mesaj</i> <b>html</b> <code>de test</code>!",
"Trash": "Coș de gunoi",
"You Were Added to Card": "Ați fost adăugat la card",
"You Were Mentioned in Comment": "Ați fost menționat într-un comentariu",
"%s added you to %s on %s": "%s v-a adăugat la %s pe %s",
"%s created %s in %s on %s": "%s a creat %s în %s pe %s",
"%s left a new comment to %s on %s": "%s a lăsat un comentariu nou la %s pe %s",
"%s mentioned you in %s on %s": "%s v-a menționat în %s pe %s",
"%s moved %s from %s to %s on %s": "%s a mutat %s din %s în %s pe %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Архив",
"Card Created": "Карточка создана",
"Card Moved": "Карточка перемещена",
"copy": "копия",
"New Comment": "Новый комментарий",
"Test Title": "Тестовый заголовок",
"This is a test text message!": "Это тестовое сообщение!",
"This is a *test* **markdown** `message`!": "Это *тестовое* **markdown** `сообщение`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Это <i>тестовое</i> <b>html</b> <code>сообщение</code>!",
"Trash": "Корзина",
"You Were Added to Card": "Вы были добавлены к карточке",
"You Were Mentioned in Comment": "Вы были упомянуты в комментарии",
"%s added you to %s on %s": "%s добавил(а) вас к %s на %s",
"%s created %s in %s on %s": "%s создал(а) %s в %s на %s",
"%s left a new comment to %s on %s": "%s оставил(а) новый комментарий к %s на %s",
"%s mentioned you in %s on %s": "%s упомянул(а) вас в %s на %s",
"%s moved %s from %s to %s on %s": "%s переместил(а) %s из %s в %s на %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Archív",
"Card Created": "Karta vytvorená",
"Card Moved": "Karta presunutá",
"copy": "kópia",
"New Comment": "Nový komentár",
"Test Title": "Testovací názov",
"This is a test text message!": "Toto je testovacia textová správa!",
"This is a *test* **markdown** `message`!": "Toto je *testovacia* **markdown** `správa`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Toto je <i>testovacia</i> <b>html</b> <code>správa</code>!",
"Trash": "Kôš",
"You Were Added to Card": "Boli ste pridaní ku karte",
"You Were Mentioned in Comment": "Boli ste spomenutí v komentári",
"%s added you to %s on %s": "%s vás pridal k %s dňa %s",
"%s created %s in %s on %s": "%s vytvoril %s v %s dňa %s",
"%s left a new comment to %s on %s": "%s zanechal nový komentár k %s dňa %s",
"%s mentioned you in %s on %s": "%s vás spomenul v %s dňa %s",
"%s moved %s from %s to %s on %s": "%s presunul %s z %s do %s dňa %s"
}
@@ -0,0 +1,19 @@
{
"Archive": "Архива",
"Card Created": "Картица креирана",
"Card Moved": "Картица премештена",
"copy": "копија",
"New Comment": "Нови коментар",
"Test Title": "Тест наслов",
"This is a test text message!": "Ово је тест текстуална порука!",
"This is a *test* **markdown** `message`!": "Ово је *тест* **markdown** `порука`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Ово је <i>тест</i> <b>html</b> <code>порука</code>!",
"Trash": "Корпа за отпатке",
"You Were Added to Card": "Додати сте на картицу",
"You Were Mentioned in Comment": "Поменути сте у коментару",
"%s added you to %s on %s": "%s вас је додао на %s дана %s",
"%s created %s in %s on %s": "%s је креирао %s у %s дана %s",
"%s left a new comment to %s on %s": "%s је оставио нови коментар на %s дана %s",
"%s mentioned you in %s on %s": "%s вас је поменуо у %s дана %s",
"%s moved %s from %s to %s on %s": "%s је преместио %s из %s у %s дана %s"
}
@@ -0,0 +1,19 @@
{
"Archive": "Arhiva",
"Card Created": "Kartica kreirana",
"Card Moved": "Kartica premeštena",
"copy": "kopija",
"New Comment": "Novi komentar",
"Test Title": "Test naslov",
"This is a test text message!": "Ovo je test tekstualna poruka!",
"This is a *test* **markdown** `message`!": "Ovo je *test* **markdown** `poruka`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Ovo je <i>test</i> <b>html</b> <code>poruka</code>!",
"Trash": "Korpa za otpatke",
"You Were Added to Card": "Dodati ste na karticu",
"You Were Mentioned in Comment": "Pomenuti ste u komentaru",
"%s added you to %s on %s": "%s vas je dodao na %s dana %s",
"%s created %s in %s on %s": "%s je kreirao %s u %s dana %s",
"%s left a new comment to %s on %s": "%s je ostavio novi komentar na %s dana %s",
"%s mentioned you in %s on %s": "%s vas je pomenuo u %s dana %s",
"%s moved %s from %s to %s on %s": "%s je premestio %s iz %s u %s dana %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arkiv",
"Card Created": "Kort skapat",
"Card Moved": "Kort flyttat",
"copy": "kopia",
"New Comment": "Ny kommentar",
"Test Title": "Test titel",
"This is a test text message!": "Detta är ett test textmeddelande!",
"This is a *test* **markdown** `message`!": "Detta är ett *test* **markdown** `meddelande`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Detta är ett <i>test</i> <b>html</b> <code>meddelande</code>!",
"Trash": "Papperskorg",
"You Were Added to Card": "Du lades till på kort",
"You Were Mentioned in Comment": "Du nämndes i kommentar",
"%s added you to %s on %s": "%s lade till dig på %s den %s",
"%s created %s in %s on %s": "%s skapade %s i %s den %s",
"%s left a new comment to %s on %s": "%s lämnade en ny kommentar till %s den %s",
"%s mentioned you in %s on %s": "%s nämnde dig i %s den %s",
"%s moved %s from %s to %s on %s": "%s flyttade %s från %s till %s den %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arşiv",
"Card Created": "Kart oluşturuldu",
"Card Moved": "Kart taşındı",
"copy": "kopya",
"New Comment": "Yeni yorum",
"Test Title": "Test başlığı",
"This is a test text message!": "Bu bir test metin mesajıdır!",
"This is a *test* **markdown** `message`!": "Bu bir *test* **markdown** `mesajı`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Bu bir <i>test</i> <b>html</b> <code>mesajı</code>!",
"Trash": "Çöp kutusu",
"You Were Added to Card": "Karta eklendiniz",
"You Were Mentioned in Comment": "Bir yorumda bahsedildiniz",
"%s added you to %s on %s": "%s sizi %s'ye %s tarihinde ekledi",
"%s created %s in %s on %s": "%s, %s'i %s içinde %s tarihinde oluşturdu",
"%s left a new comment to %s on %s": "%s, %s'ye %s tarihinde yeni bir yorum bıraktı",
"%s mentioned you in %s on %s": "%s, %s içinde %s tarihinde sizden bahsetti",
"%s moved %s from %s to %s on %s": "%s, %s'yi %s'den %s'ye %s tarihinde taşıdı"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Архів",
"Card Created": "Картку створено",
"Card Moved": "Картку переміщено",
"copy": "копія",
"New Comment": "Новий коментар",
"Test Title": "Тестовий заголовок",
"This is a test text message!": "Це нове повідомлення!",
"This is a *test* **markdown** `message`!": "Це *тестове* **markdown** `повідомлення`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Це <i>тестове</i> <b>html</b> <code>повідомлення</code>!",
"Trash": "Кошик",
"You Were Added to Card": "Вас було додано до картки",
"You Were Mentioned in Comment": "Вас було згадано у коментарі",
"%s added you to %s on %s": "%s додав(ла) вас до %s на %s",
"%s created %s in %s on %s": "%s створив(ла) %s в %s на %s",
"%s left a new comment to %s on %s": "%s залишив(ла) новий коментар до %s на %s",
"%s mentioned you in %s on %s": "%s згадав(ла) вас в %s на %s",
"%s moved %s from %s to %s on %s": "%s перемістив(ла) %s з %s в %s на %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Arxiv",
"Card Created": "Karta yaratildi",
"Card Moved": "Karta ko'chirildi",
"copy": "nusxa",
"New Comment": "Yangi izoh",
"Test Title": "Test sarlavha",
"This is a test text message!": "Bu test matn xabari!",
"This is a *test* **markdown** `message`!": "Bu *test* **markdown** `xabar`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Bu <i>test</i> <b>html</b> <code>xabar</code>!",
"Trash": "Chiqindi quti",
"You Were Added to Card": "Siz kartaga qo'shildingiz",
"You Were Mentioned in Comment": "Siz izohda eslatildingiz",
"%s added you to %s on %s": "%s sizni %s ga %s da qo'shdi",
"%s created %s in %s on %s": "%s yaratdi %s ni %s da %s da",
"%s left a new comment to %s on %s": "%s yangi izoh qoldirdi %s ga %s da",
"%s mentioned you in %s on %s": "%s sizni esladi %s da %s da",
"%s moved %s from %s to %s on %s": "%s ko'chirdi %s ni %s dan %s ga %s da"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "Lưu trữ",
"Card Created": "Thẻ đã được tạo",
"Card Moved": "Thẻ đã được di chuyển",
"copy": "bản sao",
"New Comment": "Bình luận mới",
"Test Title": "Tiêu đề thử nghiệm",
"This is a test text message!": "Đây là tin nhắn văn bản thử nghiệm!",
"This is a *test* **markdown** `message`!": "Đây là *tin nhắn* **markdown** `thử nghiệm`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "Đây là <i>tin nhắn</i> <b>html</b> <code>thử nghiệm</code>!",
"Trash": "Thùng rác",
"You Were Added to Card": "Bạn đã được thêm vào thẻ",
"You Were Mentioned in Comment": "Bạn đã được nhắc đến trong bình luận",
"%s added you to %s on %s": "%s đã thêm bạn vào %s vào %s",
"%s created %s in %s on %s": "%s đã tạo %s trong %s vào %s",
"%s left a new comment to %s on %s": "%s đã để lại bình luận mới cho %s vào %s",
"%s mentioned you in %s on %s": "%s đã nhắc đến bạn trong %s vào %s",
"%s moved %s from %s to %s on %s": "%s đã di chuyển %s từ %s đến %s vào %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "归档",
"Card Created": "卡片已创建",
"Card Moved": "卡片已移动",
"copy": "副本",
"New Comment": "新评论",
"Test Title": "测试标题",
"This is a test text message!": "这是一条测试文本消息!",
"This is a *test* **markdown** `message`!": "这是一条*测试***markdown**`消息`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "这是一条<i>测试</i><b>html</b><code>消息</code>!",
"Trash": "回收站",
"You Were Added to Card": "您已被添加到卡片",
"You Were Mentioned in Comment": "您在评论中被提及",
"%s added you to %s on %s": "%s 在 %s 将您添加到 %s",
"%s created %s in %s on %s": "%s 在 %s 的 %s 中创建了 %s",
"%s left a new comment to %s on %s": "%s 在 %s 对 %s 留下了新评论",
"%s mentioned you in %s on %s": "%s 在 %s 的 %s 中提及了您",
"%s moved %s from %s to %s on %s": "%s 在 %s 将 %s 从 %s 移动到 %s"
}
+19
View File
@@ -0,0 +1,19 @@
{
"Archive": "封存",
"Card Created": "卡片已建立",
"Card Moved": "卡片已移動",
"copy": "副本",
"New Comment": "新留言",
"Test Title": "測試標題",
"This is a test text message!": "這是一則測試文字訊息!",
"This is a *test* **markdown** `message`!": "這是一則*測試***markdown**`訊息`!",
"This is a <i>test</i> <b>html</b> <code>message</code>!": "這是一則<i>測試</i><b>html</b><code>訊息</code>!",
"Trash": "垃圾桶",
"You Were Added to Card": "您已被加入卡片",
"You Were Mentioned in Comment": "您在留言中被提及",
"%s added you to %s on %s": "%s 在 %s 將您加入 %s",
"%s created %s in %s on %s": "%s 在 %s 的 %s 中建立了 %s",
"%s left a new comment to %s on %s": "%s 在 %s 對 %s 留下了新留言",
"%s mentioned you in %s on %s": "%s 在 %s 的 %s 中提及了您",
"%s moved %s from %s to %s on %s": "%s 在 %s 將 %s 從 %s 移動到 %s"
}
+26
View File
@@ -0,0 +1,26 @@
/**
* Built-in Log Configuration
* (sails.config.log)
*
* Configure the log level for your app, as well as the transport
* (Underneath the covers, Sails uses Winston for logging, which
* allows for some pretty neat custom transports/adapters for log messages)
*
* For more information on the Sails logger, check out:
* https://sailsjs.com/docs/concepts/logging
*/
module.exports.log = {
/**
*
* Valid `level` configs: i.e. the minimum log level to capture with
* sails.log.*()
*
* The order of precedence for log levels from lowest to highest is:
* silly, verbose, info, debug, warn, error
*
* You may also set the level to "silent" to suppress all logs.
*
*/
// level: 'info',
};
+128
View File
@@ -0,0 +1,128 @@
/**
* Default model settings
* (sails.config.models)
*
* Your default, project-wide model settings. Can also be overridden on a
* per-model basis by setting a top-level properties in the model definition.
*
* For details about all available model settings, see:
* https://sailsjs.com/config/models
*
* For more general background on Sails model settings, and how to configure
* them on a project-wide or per-model basis, see:
* https://sailsjs.com/docs/concepts/models-and-orm/model-settings
*/
module.exports.models = {
/**
*
* Whether model methods like `.create()` and `.update()` should ignore
* (and refuse to persist) unrecognized data-- i.e. properties other than
* those explicitly defined by attributes in the model definition.
*
* To ease future maintenance of your code base, it is usually a good idea
* to set this to `true`.
*
* > Note that `schema: false` is not supported by every database.
* > For example, if you are using a SQL database, then relevant models
* > are always effectively `schema: true`. And if no `schema` setting is
* > provided whatsoever, the behavior is left up to the database adapter.
* >
* > For more info, see:
* > https://sailsjs.com/docs/concepts/orm/model-settings#?schema
*
*/
// schema: true,
/**
*
* How and whether Sails will attempt to automatically rebuild the
* tables/collections/etc. in your schema.
*
* > Note that, when running in a production environment, this will be
* > automatically set to `migrate: 'safe'`, no matter what you configure
* > here. This is a failsafe to prevent Sails from accidentally running
* > auto-migrations on your production database.
* >
* > For more info, see:
* > https://sailsjs.com/docs/concepts/orm/model-settings#?migrate
*
*/
migrate: 'safe',
/**
*
* Base attributes that are included in all of your models by default.
* By convention, this is your primary key attribute (`id`), as well as two
* other timestamp attributes for tracking when records were last created
* or updated.
*
* > For more info, see:
* > https://sailsjs.com/docs/concepts/orm/model-settings#?attributes
*
*/
attributes: {
id: {
type: 'string',
autoIncrement: true,
},
createdAt: {
type: 'ref',
columnName: 'created_at',
},
updatedAt: {
type: 'ref',
columnName: 'updated_at',
},
},
beforeCreate(valuesToSet, proceed) {
valuesToSet.createdAt = new Date().toISOString(); // eslint-disable-line no-param-reassign
proceed();
},
beforeUpdate(valuesToSet, proceed) {
valuesToSet.updatedAt = new Date().toISOString(); // eslint-disable-line no-param-reassign
proceed();
},
/**
*
* The set of DEKs (data encryption keys) for at-rest encryption.
* i.e. when encrypting/decrypting data for attributes with `encrypt: true`.
*
* > The `default` DEK is used for all new encryptions, but multiple DEKs
* > can be configured to allow for key rotation. In production, be sure to
* > manage these keys like you would any other sensitive credential.
*
* > For more info, see:
* > https://sailsjs.com/docs/concepts/orm/model-settings#?dataEncryptionKeys
*
*/
dataEncryptionKeys: {
default: 'fKSf/hPekelUegjM7IyM/EhHbd7HI9Kiec5Lxy2t+7w=',
},
/**
*
* Whether or not implicit records for associations should be cleaned up
* automatically using the built-in polyfill. This is especially useful
* during development with sails-disk.
*
* Depending on which databases you're using, you may want to disable this
* polyfill in your production environment.
*
* (For production configuration, see `config/env/production.js`.)
*
*/
// cascadeOnDestroy: true,
archiveModelIdentity: false,
};
+56
View File
@@ -0,0 +1,56 @@
/**
* Policy Mappings
* (sails.config.policies)
*
* Policies are simple functions which run **before** your actions.
*
* For more information on configuring policies, check out:
* https://sailsjs.com/docs/concepts/policies
*/
module.exports.policies = {
/**
*
* Default policy for all controllers and actions, unless overridden.
* (`true` allows public access)
*
*/
'*': ['is-authenticated', 'is-external'],
'config/show': ['is-authenticated', 'is-admin'],
'config/update': ['is-authenticated', 'is-admin'],
'config/test-smtp': ['is-authenticated', 'is-admin'],
'webhooks/index': ['is-authenticated', 'is-external', 'is-admin'],
'webhooks/create': ['is-authenticated', 'is-external', 'is-admin'],
'webhooks/update': ['is-authenticated', 'is-external', 'is-admin'],
'webhooks/delete': ['is-authenticated', 'is-external', 'is-admin'],
'access-tokens/delete': ['is-authenticated', 'is-external', 'is-session'],
'users/index': 'is-authenticated',
'users/create': ['is-authenticated', 'is-admin'],
'users/show': 'is-authenticated',
'users/update': 'is-authenticated',
'users/update-email': 'is-authenticated',
'users/update-password': 'is-authenticated',
'users/update-username': 'is-authenticated',
'users/update-avatar': 'is-authenticated',
'users/create-api-key': ['is-authenticated', 'is-admin'],
'users/delete': ['is-authenticated', 'is-admin'],
'projects/create': ['is-authenticated', 'is-external', 'is-admin-or-project-owner'],
'_internal/update-config': ['is-authenticated', 'is-internal'],
index: true,
'swagger/show': true,
'bootstrap/show': true,
'terms/show': true,
'access-tokens/create': true,
'access-tokens/exchange-with-oidc': true,
'access-tokens/debug-oidc': true,
'access-tokens/accept-terms': true,
'access-tokens/revoke-pending-token': true,
};
+272
View File
@@ -0,0 +1,272 @@
/**
* Route Mappings
* (sails.config.routes)
*
* Your routes tell Sails what to do each time it receives a request.
*
* For more information on configuring custom routes, check out:
* https://sailsjs.com/anatomy/config/routes-js
*/
const path = require('path');
const sails = require('sails');
// Remove prefix from urlPath, assuming completely matches a subpath of
// urlPath. The result preserves query params and fragment if present
//
// Examples:
// '/foo', '/foo/bar' -> '/bar'
// '/foo', '/foo' -> '/'
// '/foo', '/foo?baz=bux' -> '/?baz=bux'
// '/foo', '/foobar' -> '/foobar'
const removeRoutePrefix = (prefix, urlPath) => {
if (urlPath.startsWith(prefix)) {
const subpath = urlPath.substring(prefix.length);
if (subpath.startsWith('/')) {
// Prefix matched a complete set of path segments, with a valid path
// remaining.
return subpath;
}
if (subpath.length === 0 || subpath.startsWith('?') || subpath.startsWith('#')) {
// Prefix matched a complete set of path segments, but there is no path
// remaining. Add '/'.
return `/${subpath}`;
}
}
// Either the prefix didn't match at all, or it wasn't a complete path match
// (e.g. we don't want to treat '/foo' as a prefix of '/foobar'). Leave the
// path as-is.
return urlPath;
};
const serveStatic = async (prefix, getPathSegment, req, res) => {
// Custom config properties are not available when the routes config is
// loaded, so resolve the target value just before serving the request.
const pathSegment = getPathSegment();
// Remove the leading route prefix, since it's already included in path
// segment.
const normalizedUrlPath = removeRoutePrefix(prefix, req.url);
const fileManager = sails.hooks['file-manager'].getInstance();
const filePathSegment = path.join(pathSegment, normalizedUrlPath);
let readStream;
let headers;
try {
[readStream, headers] = await fileManager.read(filePathSegment, {
withHeaders: true,
});
} catch (err) {
return res.sendStatus(404);
}
res.set({
...headers,
'Cache-Control': `private, max-age=${sails.config.http.cache}, immutable`,
});
readStream.on('error', () => {
if (res.headersSent) {
res.destroy();
} else {
res.sendStatus(404);
}
});
return readStream.pipe(res);
};
/* const publicStaticDirServer = (prefix, getPathSegment) => (req, res, next) => {
if (!req.url.startsWith(prefix)) {
return next();
}
return serveStatic(prefix, getPathSegment, req, res);
}; */
const protectedStaticDirServer = (prefix, getPathSegment) => (req, res, next) => {
if (!req.url.startsWith(prefix)) {
return next();
}
try {
sails.helpers.utils.verifyJwtToken(req.cookies.accessToken);
} catch (error) {
return res.sendStatus(401);
}
return serveStatic(prefix, getPathSegment, req, res);
};
module.exports.routes = {
'GET /api/bootstrap': 'bootstrap/show',
'GET /api/terms': 'terms/show',
'GET /api/config': 'config/show',
'PATCH /api/config': 'config/update',
'POST /api/config/test-smtp': 'config/test-smtp',
'GET /api/webhooks': 'webhooks/index',
'POST /api/webhooks': 'webhooks/create',
'PATCH /api/webhooks/:id': 'webhooks/update',
'DELETE /api/webhooks/:id': 'webhooks/delete',
'POST /api/access-tokens': 'access-tokens/create',
'POST /api/access-tokens/exchange-with-oidc': 'access-tokens/exchange-with-oidc',
'POST /api/access-tokens/debug-oidc': 'access-tokens/debug-oidc',
'POST /api/access-tokens/accept-terms': 'access-tokens/accept-terms',
'POST /api/access-tokens/revoke-pending-token': 'access-tokens/revoke-pending-token',
'DELETE /api/access-tokens/me': 'access-tokens/delete',
'GET /api/users': 'users/index',
'POST /api/users': 'users/create',
'GET /api/users/:id': 'users/show',
'PATCH /api/users/:id': 'users/update',
'PATCH /api/users/:id/email': 'users/update-email',
'PATCH /api/users/:id/password': 'users/update-password',
'PATCH /api/users/:id/username': 'users/update-username',
'POST /api/users/:id/avatar': 'users/update-avatar',
'POST /api/users/:id/api-key': 'users/create-api-key',
'DELETE /api/users/:id': 'users/delete',
'GET /api/projects': 'projects/index',
'POST /api/projects': 'projects/create',
'GET /api/projects/:id': 'projects/show',
'PATCH /api/projects/:id': 'projects/update',
'DELETE /api/projects/:id': 'projects/delete',
'POST /api/projects/:projectId/project-managers': 'project-managers/create',
'DELETE /api/project-managers/:id': 'project-managers/delete',
'POST /api/projects/:projectId/background-images': 'background-images/create',
'DELETE /api/background-images/:id': 'background-images/delete',
'POST /api/projects/:projectId/base-custom-field-groups': 'base-custom-field-groups/create',
'PATCH /api/base-custom-field-groups/:id': 'base-custom-field-groups/update',
'DELETE /api/base-custom-field-groups/:id': 'base-custom-field-groups/delete',
'POST /api/projects/:projectId/boards': 'boards/create',
'GET /api/boards/:id': 'boards/show',
'PATCH /api/boards/:id': 'boards/update',
'DELETE /api/boards/:id': 'boards/delete',
'POST /api/boards/:boardId/board-memberships': 'board-memberships/create',
'PATCH /api/board-memberships/:id': 'board-memberships/update',
'DELETE /api/board-memberships/:id': 'board-memberships/delete',
'POST /api/boards/:boardId/labels': 'labels/create',
'PATCH /api/labels/:id': 'labels/update',
'DELETE /api/labels/:id': 'labels/delete',
'POST /api/boards/:boardId/lists': 'lists/create',
'GET /api/lists/:id': 'lists/show',
'PATCH /api/lists/:id': 'lists/update',
'POST /api/lists/:id/sort': 'lists/sort',
'POST /api/lists/:id/move-cards': 'lists/move-cards',
'POST /api/lists/:id/clear': 'lists/clear',
'DELETE /api/lists/:id': 'lists/delete',
'GET /api/lists/:listId/cards': 'cards/index',
'POST /api/lists/:listId/cards': 'cards/create',
'GET /api/cards/:id': 'cards/show',
'PATCH /api/cards/:id': 'cards/update',
'POST /api/cards/:id/duplicate': 'cards/duplicate',
'POST /api/cards/:id/read-notifications': 'cards/read-notifications',
'DELETE /api/cards/:id': 'cards/delete',
'POST /api/cards/:cardId/card-memberships': 'card-memberships/create',
'DELETE /api/cards/:cardId/card-memberships/userId::userId': 'card-memberships/delete',
'POST /api/cards/:cardId/card-labels': 'card-labels/create',
'DELETE /api/cards/:cardId/card-labels/labelId::labelId': 'card-labels/delete',
'POST /api/cards/:cardId/task-lists': 'task-lists/create',
'GET /api/task-lists/:id': 'task-lists/show',
'PATCH /api/task-lists/:id': 'task-lists/update',
'DELETE /api/task-lists/:id': 'task-lists/delete',
'POST /api/task-lists/:taskListId/tasks': 'tasks/create',
'PATCH /api/tasks/:id': 'tasks/update',
'DELETE /api/tasks/:id': 'tasks/delete',
'POST /api/cards/:cardId/attachments': 'attachments/create',
'PATCH /api/attachments/:id': 'attachments/update',
'DELETE /api/attachments/:id': 'attachments/delete',
'POST /api/boards/:boardId/custom-field-groups': 'custom-field-groups/create-in-board',
'POST /api/cards/:cardId/custom-field-groups': 'custom-field-groups/create-in-card',
'GET /api/custom-field-groups/:id': 'custom-field-groups/show',
'PATCH /api/custom-field-groups/:id': 'custom-field-groups/update',
'DELETE /api/custom-field-groups/:id': 'custom-field-groups/delete',
'POST /api/base-custom-field-groups/:baseCustomFieldGroupId/custom-fields':
'custom-fields/create-in-base-custom-field-group',
'POST /api/custom-field-groups/:customFieldGroupId/custom-fields':
'custom-fields/create-in-custom-field-group',
'PATCH /api/custom-fields/:id': 'custom-fields/update',
'DELETE /api/custom-fields/:id': 'custom-fields/delete',
'PATCH /api/cards/:cardId/custom-field-values/customFieldGroupId::customFieldGroupId[:]customFieldId::customFieldId':
'custom-field-values/create-or-update',
'DELETE /api/cards/:cardId/custom-field-values/customFieldGroupId::customFieldGroupId[:]customFieldId::customFieldId':
'custom-field-values/delete',
'GET /api/cards/:cardId/comments': 'comments/index',
'POST /api/cards/:cardId/comments': 'comments/create',
'PATCH /api/comments/:id': 'comments/update',
'DELETE /api/comments/:id': 'comments/delete',
'GET /api/boards/:boardId/actions': 'actions/index-in-board',
'GET /api/cards/:cardId/actions': 'actions/index-in-card',
'GET /api/notifications': 'notifications/index',
'GET /api/notifications/:id': 'notifications/show',
'PATCH /api/notifications/:id': 'notifications/update',
'POST /api/notifications/read-all': 'notifications/read-all',
'POST /api/users/:userId/notification-services': 'notification-services/create-in-user',
'POST /api/boards/:boardId/notification-services': 'notification-services/create-in-board',
'PATCH /api/notification-services/:id': 'notification-services/update',
'POST /api/notification-services/:id/test': 'notification-services/test',
'DELETE /api/notification-services/:id': 'notification-services/delete',
'PATCH /api/_internal/config': '_internal/update-config',
'GET /swagger.json': 'swagger/show',
'GET /favicons/*': {
fn: protectedStaticDirServer('/favicons', () => sails.config.custom.faviconsPathSegment),
skipAssets: false,
},
'GET /user-avatars/*': {
fn: protectedStaticDirServer('/user-avatars', () => sails.config.custom.userAvatarsPathSegment),
skipAssets: false,
},
'GET /background-images/*': {
fn: protectedStaticDirServer(
'/background-images',
() => sails.config.custom.backgroundImagesPathSegment,
),
skipAssets: false,
},
'GET /attachments/:id/download/:filename': {
action: 'file-attachments/download',
skipAssets: false,
},
'GET r|^/attachments/(\\w+)/download/thumbnails/([\\w-]+).(\\w+)$|id,fileName,fileExtension': {
action: 'file-attachments/download-thumbnail',
skipAssets: false,
},
'GET /*': {
action: 'index',
skipAssets: true,
},
};
+52
View File
@@ -0,0 +1,52 @@
/**
* Security Settings
* (sails.config.security)
*
* These settings affect aspects of your app's security, such
* as how it deals with cross-origin requests (CORS) and which
* routes require a CSRF token to be included with the request.
*
* For an overview of how Sails handles security, see:
* https://sailsjs.com/documentation/concepts/security
*
* For additional options and more information, see:
* https://sailsjs.com/config/security
*/
module.exports.security = {
/**
*
* CORS is like a more modern version of JSONP-- it allows your application
* to circumvent browsers' same-origin policy, so that the responses from
* your Sails app hosted on one domain (e.g. example.com) can be received
* in the client-side JavaScript code from a page you trust hosted on _some
* other_ domain (e.g. trustedsite.net).
*
* For additional options and more information, see:
* https://sailsjs.com/docs/concepts/security/cors
*
*/
cors: {
allRoutes: true,
allowOrigins: ['http://localhost:3000'],
allowRequestHeaders: ['Authorization'],
allowCredentials: true,
},
/**
*
* By default, Sails' built-in CSRF protection is disabled to facilitate
* rapid development. But be warned! If your Sails app will be accessed by
* web browsers, you should _always_ enable CSRF protection before deploying
* to production.
*
* To enable CSRF protection, set this to `true`.
*
* For more information, see:
* https://sailsjs.com/docs/concepts/security/csrf
*
*/
// csrf: false,
};
+38
View File
@@ -0,0 +1,38 @@
/**
* Session Configuration
* (sails.config.session)
*
* Use the settings below to configure session integration in your app.
* (for additional recommended settings, see `config/env/production.js`)
*
* For all available options, see:
* https://sailsjs.com/config/session
*/
module.exports.session = {
/**
*
* Session secret is automatically generated when your new app is created
* Replace at your own risk in production-- you will invalidate the cookies
* of your users, forcing them to log in again.
*
*/
secret: process.env.SECRET_KEY,
/**
*
* Customize when built-in session support will be skipped.
*
* (Useful for performance tuning; particularly to avoid wasting cycles on
* session management when responding to simple requests for static assets,
* like images or stylesheets.)
*
* https://sailsjs.com/config/session
*
*/
// isSessionDisabled: function (req){
// return !!req.path.match(req._sails.LOOKS_LIKE_ASSET_RX);
// },
};
+69
View File
@@ -0,0 +1,69 @@
/**
* WebSocket Server Settings
* (sails.config.sockets)
*
* Use the settings below to configure realtime functionality in your app.
* (for additional recommended settings, see `config/env/production.js`)
*
* For all available options, see:
* https://sailsjs.com/config/sockets
*/
module.exports.sockets = {
/**
*
* `transports`
*
* The protocols or "transports" that socket clients are permitted to
* use when connecting and communicating with this Sails application.
*
* > Never change this here without also configuring `io.sails.transports`
* > in your client-side code. If the client and the server are not using
* > the same array of transports, sockets will not work properly.
* >
* > For more info, see:
* > https://sailsjs.com/docs/reference/web-sockets/socket-client
*
*/
// transports: [ 'websocket' ],
/**
*
* `beforeConnect`
*
* This custom beforeConnect function will be run each time BEFORE a new
* socket is allowed to connect, when the initial socket.io handshake is
* performed with the server.
*
* https://sailsjs.com/config/sockets#?beforeconnect
*
*/
// beforeConnect: function(handshake, proceed) {
//
// // `true` allows the socket to connect.
// // (`false` would reject the connection)
// return proceed(undefined, true);
//
// },
/**
*
* `afterDisconnect`
*
* This custom afterDisconnect function will be run each time a socket
* disconnects
*
*/
// afterDisconnect: function(session, socket, done) {
//
// // By default: do nothing.
// // (but always trigger the callback)
// return done();
//
// },
/**
*
* Whether to expose a 'GET /__getcookie' route that sets an HTTP-only
* session cookie.
*
*/
// grant3rdPartyCookie: true,
};
+46
View File
@@ -0,0 +1,46 @@
const version = require('../version');
module.exports = {
definition: {
openapi: '3.0.0',
info: {
version,
title: 'PLANKA API',
description:
'API documentation for PLANKA - Real-Time Collaborative Kanban Board Application',
license: {
name: 'Fair Use License',
url: 'https://github.com/plankanban/planka/blob/master/LICENSE.md',
},
},
servers: [
{
url: '/api',
description: 'Base path for API endpoints',
},
],
components: {
securitySchemes: {
bearerAuth: {
type: 'http',
scheme: 'bearer',
bearerFormat: 'JWT',
},
apiKeyAuth: {
type: 'apiKey',
in: 'header',
name: 'X-Api-Key',
},
},
},
security: [
{
bearerAuth: [],
},
{
apiKeyAuth: [],
},
],
},
apis: ['./api/controllers/**/*.js', './api/models/*.js', './api/responses/*.js'],
};
+39
View File
@@ -0,0 +1,39 @@
/**
* View Engine Configuration
* (sails.config.views)
*
* Server-sent views are a secure and effective way to get your app up
* and running. Views are normally served from actions. Below, you can
* configure your templating language/framework of choice and configure
* Sails' layout support.
*
* For details on available options for configuring server-side views, check out:
* https://sailsjs.com/config/views
*
* For more background information on views and partials in Sails, check out:
* https://sailsjs.com/docs/concepts/views
*/
module.exports.views = {
/**
*
* Extension to use for your views. When calling `res.view()` in an action,
* you can leave this extension off. For example, calling
* `res.view('homepage')` will (using default settings) look for a
* `views/homepage.ejs` file.
*
*/
// extension: 'ejs',
/**
*
* The path (relative to the views directory, and without extension) to
* the default layout file to use, or `false` to disable layouts entirely.
*
* Note that layouts only work with the built-in EJS view engine!
*
*/
layout: false,
};