mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
2e1d7fcc42
refs #7432 🚨 database: change hard limits and field types - we went over all schema fields and decided to decrease/increase the hard limits - the core goal is to have more flexibility in the future - we reconsidered string vs. text There are 5 groups: - small strings: 50 characters - static strings - status, visibility, language, role name, permission name, client name etc. - medium strings: 191 characters - all unique fields or fields which can be unique in the future - slug, tokens, user name, password, tag name, email - large strings: 1000-2000 characters - these fields need to be very flexible - these fields get a soft limit attached (in a different PR) - post title, meta title, meta description, urls - medium text: 64kb characters - bio, settings, location, tour - long text: 1000000000 chars - html, amp, mobiledoc, markdown 🙄 sort_order for tests - sort order was not set for the tests, so it was always 0 - mysql could return a different result in my case: - field length 156 returned the following related tags ["bacon", "kitchen"] - field length 157 returned the following related tags ["kitchen", "kitchen"] Change client.secret to 191 Tweak field lengths - Add 24 char limit for ids - Limited fields are the exact length they need - Unified 1000 and 2000 char string classes to all be 2000 - Changed descriptions to be either 2000, except user & tag which is text 65535 as these may be used to store HTML later?! - Updated tests 🛠 Update importer tests - The old 001-003 tests are kind of less relevant now. - Rather than worrying about past versions of the data structure, we should check that the importer only imports what we consider to be valid data - I've changed the tests to treat the title-length check as a length-validation check, rather than a test for each of the old versions 🔥 Remove foreign key from subscribers.post_id - There's no real need to have an index on this column, it just makes deleting posts hard. - Same as created_by type columns, we can reference ids without needing keys/indexes
231 lines
14 KiB
JavaScript
231 lines
14 KiB
JavaScript
module.exports = {
|
|
posts: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
uuid: {type: 'string', maxlength: 36, nullable: false, validations: {isUUID: true}},
|
|
title: {type: 'string', maxlength: 2000, nullable: false},
|
|
slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
markdown: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
|
|
mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
|
|
html: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
|
|
amp: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
|
|
image: {type: 'string', maxlength: 2000, nullable: true},
|
|
featured: {type: 'bool', nullable: false, defaultTo: false},
|
|
page: {type: 'bool', nullable: false, defaultTo: false},
|
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'draft'},
|
|
language: {type: 'string', maxlength: 6, nullable: false, defaultTo: 'en_US'},
|
|
visibility: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]}},
|
|
meta_title: {type: 'string', maxlength: 2000, nullable: true},
|
|
meta_description: {type: 'string', maxlength: 2000, nullable: true},
|
|
author_id: {type: 'string', maxlength: 24, nullable: false},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true},
|
|
published_at: {type: 'dateTime', nullable: true},
|
|
published_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
users: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
name: {type: 'string', maxlength: 191, nullable: false},
|
|
slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
ghost_auth_access_token: {type: 'string', maxlength: 32, nullable: true},
|
|
password: {type: 'string', maxlength: 60, nullable: false},
|
|
email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
|
|
image: {type: 'string', maxlength: 2000, nullable: true},
|
|
cover: {type: 'string', maxlength: 2000, nullable: true},
|
|
bio: {type: 'text', maxlength: 65535, nullable: true},
|
|
website: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}},
|
|
location: {type: 'text', maxlength: 65535, nullable: true},
|
|
facebook: {type: 'string', maxlength: 2000, nullable: true},
|
|
twitter: {type: 'string', maxlength: 2000, nullable: true},
|
|
accessibility: {type: 'text', maxlength: 65535, nullable: true},
|
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'active'},
|
|
language: {type: 'string', maxlength: 6, nullable: false, defaultTo: 'en_US'},
|
|
visibility: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]}},
|
|
meta_title: {type: 'string', maxlength: 2000, nullable: true},
|
|
meta_description: {type: 'string', maxlength: 2000, nullable: true},
|
|
tour: {type: 'text', maxlength: 65535, nullable: true},
|
|
last_login: {type: 'dateTime', nullable: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
roles: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
name: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
description: {type: 'string', maxlength: 2000, nullable: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
roles_users: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
role_id: {type: 'string', maxlength: 24, nullable: false},
|
|
user_id: {type: 'string', maxlength: 24, nullable: false}
|
|
},
|
|
permissions: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
name: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
object_type: {type: 'string', maxlength: 50, nullable: false},
|
|
action_type: {type: 'string', maxlength: 50, nullable: false},
|
|
object_id: {type: 'string', maxlength: 24, nullable: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
permissions_users: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
user_id: {type: 'string', maxlength: 24, nullable: false},
|
|
permission_id: {type: 'string', maxlength: 24, nullable: false}
|
|
},
|
|
permissions_roles: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
role_id: {type: 'string', maxlength: 24, nullable: false},
|
|
permission_id: {type: 'string', maxlength: 24, nullable: false}
|
|
},
|
|
permissions_apps: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
app_id: {type: 'string', maxlength: 24, nullable: false},
|
|
permission_id: {type: 'string', maxlength: 24, nullable: false}
|
|
},
|
|
settings: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
key: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
value: {type: 'text', maxlength: 65535, nullable: true},
|
|
type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'core', validations: {isIn: [['core', 'blog', 'theme', 'app', 'plugin', 'private']]}},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
tags: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
name: {type: 'string', maxlength: 191, nullable: false, validations: {matches: /^([^,]|$)/}},
|
|
slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
description: {type: 'text', maxlength: 65535, nullable: true},
|
|
image: {type: 'string', maxlength: 2000, nullable: true},
|
|
parent_id: {type: 'string', nullable: true},
|
|
visibility: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public', 'internal']]}},
|
|
meta_title: {type: 'string', maxlength: 2000, nullable: true},
|
|
meta_description: {type: 'string', maxlength: 2000, nullable: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
posts_tags: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id'},
|
|
tag_id: {type: 'string', maxlength: 24, nullable: false, references: 'tags.id'},
|
|
sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
|
|
},
|
|
apps: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
name: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
version: {type: 'string', maxlength: 50, nullable: false},
|
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'inactive'},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
app_settings: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
key: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
value: {type: 'text', maxlength: 65535, nullable: true},
|
|
app_id: {type: 'string', maxlength: 24, nullable: false, references: 'apps.id'},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
app_fields: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
key: {type: 'string', maxlength: 50, nullable: false},
|
|
value: {type: 'text', maxlength: 65535, nullable: true},
|
|
type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'html'},
|
|
app_id: {type: 'string', maxlength: 24, nullable: false, references: 'apps.id'},
|
|
relatable_id: {type: 'string', maxlength: 24, nullable: false},
|
|
relatable_type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'posts'},
|
|
active: {type: 'bool', nullable: false, defaultTo: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
clients: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
uuid: {type: 'string', maxlength: 36, nullable: false},
|
|
name: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
slug: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
secret: {type: 'string', maxlength: 191, nullable: false},
|
|
redirection_uri: {type: 'string', maxlength: 2000, nullable: true},
|
|
client_uri: {type: 'string', maxlength: 2000, nullable: true},
|
|
auth_uri: {type: 'string', maxlength: 2000, nullable: true},
|
|
logo: {type: 'string', maxlength: 2000, nullable: true},
|
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'development'},
|
|
type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'ua', validations: {isIn: [['ua', 'web', 'native']]}},
|
|
description: {type: 'string', maxlength: 2000, nullable: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
client_trusted_domains: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
client_id: {type: 'string', maxlength: 24, nullable: false, references: 'clients.id'},
|
|
trusted_domain: {type: 'string', maxlength: 2000, nullable: true}
|
|
},
|
|
accesstokens: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
token: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
user_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'},
|
|
client_id: {type: 'string', maxlength: 24, nullable: false, references: 'clients.id'},
|
|
expires: {type: 'bigInteger', nullable: false}
|
|
},
|
|
refreshtokens: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
token: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
user_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'},
|
|
client_id: {type: 'string', maxlength: 24, nullable: false, references: 'clients.id'},
|
|
expires: {type: 'bigInteger', nullable: false}
|
|
},
|
|
subscribers: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
name: {type: 'string', maxlength: 191, nullable: true},
|
|
email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
|
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {isIn: [['subscribed', 'pending', 'unsubscribed']]}},
|
|
post_id: {type: 'string', maxlength: 24, nullable: true},
|
|
subscribed_url: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}},
|
|
subscribed_referrer: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}},
|
|
unsubscribed_url: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}},
|
|
unsubscribed_at: {type: 'dateTime', nullable: true},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
invites: {
|
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
role_id: {type: 'string', maxlength: 24, nullable: false},
|
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {isIn: [['pending', 'sent']]}},
|
|
token: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
|
|
expires: {type: 'bigInteger', nullable: false},
|
|
created_at: {type: 'dateTime', nullable: false},
|
|
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
updated_at: {type: 'dateTime', nullable: true},
|
|
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
},
|
|
brute: {
|
|
key: {type: 'string', maxlength: 191},
|
|
firstRequest: {type: 'bigInteger'},
|
|
lastRequest: {type: 'bigInteger'},
|
|
lifetime: {type: 'bigInteger'},
|
|
count: {type: 'integer'}
|
|
}
|
|
};
|