/* String Column Sizes Information * (From: https://github.com/TryGhost/Ghost/pull/7932) * * Small strings = length 50 * Medium strings = length 191 * Large strings = length 1000-2000 * Text = length 65535 (64 KiB) * Long text = length 1,000,000,000 */ 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, validations: {isLength: {max: 255}}}, slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, html: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, comment_id: {type: 'string', maxlength: 50, nullable: true}, plaintext: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, feature_image: {type: 'string', maxlength: 2000, nullable: true}, featured: {type: 'bool', nullable: false, defaultTo: false}, type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'post', validations: {isIn: [['post', 'page']]}}, status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'draft'}, locale: {type: 'string', maxlength: 6, nullable: true}, visibility: { type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public', 'members', 'paid']]} }, send_email_when_published: {type: 'bool', nullable: true, defaultTo: false}, /** * @deprecated: `author_id`, might be removed in Ghost 3.0 * If we keep it, then only, because you can easier query post.author_id than posts_authors[*].sort_order. */ author_id: {type: 'string', maxlength: 24, nullable: false}, created_at: {type: 'dateTime', nullable: false}, /** * @deprecated: https://github.com/TryGhost/Ghost/issues/10286 * * This is valid for all x_by fields. */ 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}, custom_excerpt: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}}, codeinjection_head: {type: 'text', maxlength: 65535, nullable: true}, codeinjection_foot: {type: 'text', maxlength: 65535, nullable: true}, custom_template: {type: 'string', maxlength: 100, nullable: true}, canonical_url: {type: 'text', maxlength: 2000, nullable: true} }, posts_meta: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id', unique: true}, og_image: {type: 'string', maxlength: 2000, nullable: true}, og_title: {type: 'string', maxlength: 300, nullable: true}, og_description: {type: 'string', maxlength: 500, nullable: true}, twitter_image: {type: 'string', maxlength: 2000, nullable: true}, twitter_title: {type: 'string', maxlength: 300, nullable: true}, twitter_description: {type: 'string', maxlength: 500, nullable: true}, meta_title: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}}, meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}}, email_subject: {type: 'string', maxlength: 300, 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}, password: {type: 'string', maxlength: 60, nullable: false}, email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}}, profile_image: {type: 'string', maxlength: 2000, nullable: true}, cover_image: {type: 'string', maxlength: 2000, nullable: true}, bio: {type: 'text', maxlength: 65535, nullable: true, validations: {isLength: {max: 200}}}, website: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, location: {type: 'text', maxlength: 65535, nullable: true, validations: {isLength: {max: 150}}}, 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'}, locale: {type: 'string', maxlength: 6, nullable: true}, visibility: { type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]} }, meta_title: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}}, meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}}, tour: {type: 'text', maxlength: 65535, nullable: true}, last_seen: {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} }, posts_authors: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id'}, author_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'}, sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0} }, 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', 'members', 'bulk_email']]} }, 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, validations: {isLength: {max: 500}}}, feature_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, validations: {isLength: {max: 300}}}, meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}}, 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} }, 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'} }, webhooks: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, event: {type: 'string', maxlength: 50, nullable: false, validations: {isLowercase: true}}, target_url: {type: 'string', maxlength: 2000, nullable: false}, name: {type: 'string', maxlength: 191, nullable: true}, secret: {type: 'string', maxlength: 191, nullable: true}, api_version: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'v2'}, integration_id: {type: 'string', maxlength: 24, nullable: true}, status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'available'}, last_triggered_at: {type: 'dateTime', nullable: true}, last_triggered_status: {type: 'string', maxlength: 50, nullable: true}, last_triggered_error: {type: 'string', maxlength: 50, 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} }, sessions: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, session_id: {type: 'string', maxlength: 32, nullable: false, unique: true}, user_id: {type: 'string', maxlength: 24, nullable: false}, session_data: {type: 'string', maxlength: 2000, nullable: false}, created_at: {type: 'dateTime', nullable: false}, updated_at: {type: 'dateTime', nullable: true} }, integrations: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, type: { type: 'string', maxlength: 50, nullable: false, defaultTo: 'custom', validations: {isIn: [['internal', 'builtin', 'custom']]} }, name: {type: 'string', maxlength: 191, nullable: false}, slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, icon_image: {type: 'string', maxlength: 2000, nullable: 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} }, api_keys: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, type: { type: 'string', maxlength: 50, nullable: false, validations: {isIn: [['content', 'admin']]} }, secret: { type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isLength: {min: 26, max: 128}} }, role_id: {type: 'string', maxlength: 24, nullable: true}, // integration_id is nullable to allow "internal" API keys that don't show in the UI integration_id: {type: 'string', maxlength: 24, nullable: true}, last_seen_at: {type: 'dateTime', nullable: true}, last_seen_version: {type: 'string', maxlength: 50, 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} }, mobiledoc_revisions: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, post_id: {type: 'string', maxlength: 24, nullable: false, index: true}, mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, created_at_ts: {type: 'bigInteger', nullable: false}, created_at: {type: 'dateTime', nullable: false} }, members: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, uuid: {type: 'string', maxlength: 36, nullable: true, unique: true, validations: {isUUID: true}}, email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}}, name: {type: 'string', maxlength: 191, nullable: true}, note: {type: 'string', maxlength: 2000, nullable: true}, subscribed: {type: 'bool', nullable: true, 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} }, members_stripe_customers: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, member_id: {type: 'string', maxlength: 24, nullable: false, unique: false}, // customer_id is unique: false because mysql with innodb utf8mb4 cannot have unqiue columns larger than 191 chars customer_id: {type: 'string', maxlength: 255, nullable: false, unique: false}, name: {type: 'string', maxlength: 191, nullable: true}, email: {type: 'string', maxlength: 191, 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} }, members_stripe_customers_subscriptions: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, customer_id: {type: 'string', maxlength: 255, nullable: false, unique: false}, subscription_id: {type: 'string', maxlength: 255, nullable: false, unique: false}, plan_id: {type: 'string', maxlength: 255, nullable: false, unique: false}, status: {type: 'string', maxlength: 50, nullable: false}, current_period_end: {type: 'dateTime', nullable: false}, start_date: {type: 'dateTime', nullable: false}, default_payment_card_last4: {type: 'string', maxlength: 4, 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}, /* Below fields eventually should be normalised e.g. stripe_plans table, link to here on plan_id */ plan_nickname: {type: 'string', maxlength: 50, nullable: false}, plan_interval: {type: 'string', maxlength: 50, nullable: false}, plan_amount: {type: 'integer', nullable: false}, plan_currency: {type: 'string', maxLength: 3, nullable: false} }, actions: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, resource_id: {type: 'string', maxlength: 24, nullable: true}, resource_type: {type: 'string', maxlength: 50, nullable: false}, actor_id: {type: 'string', maxlength: 24, nullable: false}, actor_type: {type: 'string', maxlength: 50, nullable: false}, // @NOTE: The event column contains short buzzwords e.g. subscribed, started, added, deleted, edited etc. // We already store and require the target resource type. No need to remember e.g. post.edited event: {type: 'string', maxlength: 50, nullable: false}, // @NOTE: The context object can be used to store information about an action e.g. diffs, meta context: {type: 'text', maxlength: 1000000000, nullable: true}, created_at: {type: 'dateTime', nullable: false} }, emails: { id: {type: 'string', maxlength: 24, nullable: false, primary: true}, post_id: {type: 'string', maxlength: 24, nullable: false, index: true, unique: true}, uuid: {type: 'string', maxlength: 36, nullable: false, validations: {isUUID: true}}, status: { type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {isIn: [['pending', 'submitting', 'submitted', 'failed']]} }, error: {type: 'string', maxlength: 2000, nullable: true}, meta: {type: 'text', maxlength: 65535, nullable: true}, stats: {type: 'text', maxlength: 65535, nullable: true}, email_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}, subject: {type: 'string', maxlength: 300, nullable: true}, html: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, plaintext: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, submitted_at: {type: 'dateTime', 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} } };