🗑️ Remove keystone stuff
This commit is contained in:
		| @@ -1 +0,0 @@ | |||||||
| PUBLIC_CMS="http://localhost:3000" |  | ||||||
							
								
								
									
										4
									
								
								content/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								content/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +0,0 @@ | |||||||
| node_modules |  | ||||||
| .keystone/admin |  | ||||||
| keystone.db |  | ||||||
| *.log |  | ||||||
| @@ -1,488 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __defProp = Object.defineProperty; |  | ||||||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; |  | ||||||
| var __getOwnPropNames = Object.getOwnPropertyNames; |  | ||||||
| var __hasOwnProp = Object.prototype.hasOwnProperty; |  | ||||||
| var __export = (target, all) => { |  | ||||||
|   for (var name in all) |  | ||||||
|     __defProp(target, name, { get: all[name], enumerable: true }); |  | ||||||
| }; |  | ||||||
| var __copyProps = (to, from, except, desc) => { |  | ||||||
|   if (from && typeof from === "object" || typeof from === "function") { |  | ||||||
|     for (let key of __getOwnPropNames(from)) |  | ||||||
|       if (!__hasOwnProp.call(to, key) && key !== except) |  | ||||||
|         __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); |  | ||||||
|   } |  | ||||||
|   return to; |  | ||||||
| }; |  | ||||||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); |  | ||||||
|  |  | ||||||
| // keystone.ts |  | ||||||
| var keystone_exports = {}; |  | ||||||
| __export(keystone_exports, { |  | ||||||
|   default: () => keystone_default |  | ||||||
| }); |  | ||||||
| module.exports = __toCommonJS(keystone_exports); |  | ||||||
| var import_core8 = require("@keystone-6/core"); |  | ||||||
|  |  | ||||||
| // schema/index.ts |  | ||||||
| var import_core7 = require("@keystone-6/core"); |  | ||||||
| var import_fields7 = require("@keystone-6/core/fields"); |  | ||||||
|  |  | ||||||
| // limit.ts |  | ||||||
| var isUser = ({ session: session2 }) => session2?.data.id != null; |  | ||||||
| var allowUser = { |  | ||||||
|   operation: { |  | ||||||
|     create: isUser, |  | ||||||
|     update: isUser, |  | ||||||
|     delete: isUser |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| var isEditor = ({ session: session2 }) => session2?.data.isEditor || session2?.data.isAdmin; |  | ||||||
| var allowEditor = { |  | ||||||
|   operation: { |  | ||||||
|     create: isEditor, |  | ||||||
|     update: isEditor, |  | ||||||
|     delete: isEditor |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| var isAdmin = ({ session: session2 }) => session2?.data.isAdmin; |  | ||||||
| var allowAdmin = { |  | ||||||
|   operation: { |  | ||||||
|     create: isAdmin, |  | ||||||
|     update: isAdmin, |  | ||||||
|     delete: isAdmin |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // schema/assets.ts |  | ||||||
| var import_fields = require("@keystone-6/core/fields"); |  | ||||||
| var import_core = require("@keystone-6/core"); |  | ||||||
| var Image = (0, import_core.list)({ |  | ||||||
|   access: allowEditor, |  | ||||||
|   fields: { |  | ||||||
|     caption: (0, import_fields.text)(), |  | ||||||
|     image: (0, import_fields.image)({ storage: "localImages" }), |  | ||||||
|     createdAt: (0, import_fields.timestamp)({ |  | ||||||
|       defaultValue: { kind: "now" } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| var Asset = (0, import_core.list)({ |  | ||||||
|   access: allowEditor, |  | ||||||
|   fields: { |  | ||||||
|     caption: (0, import_fields.text)(), |  | ||||||
|     url: (0, import_fields.text)({ validation: { isRequired: true } }), |  | ||||||
|     type: (0, import_fields.select)({ |  | ||||||
|       type: "enum", |  | ||||||
|       options: [ |  | ||||||
|         { label: "Video", value: "video" }, |  | ||||||
|         { label: "Audio", value: "audio" } |  | ||||||
|       ], |  | ||||||
|       defaultValue: "video", |  | ||||||
|       db: { map: "media_type" }, |  | ||||||
|       validation: { isRequired: true }, |  | ||||||
|       ui: { displayMode: "select" } |  | ||||||
|     }), |  | ||||||
|     createdAt: (0, import_fields.timestamp)({ |  | ||||||
|       defaultValue: { kind: "now" } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // schema/moments.ts |  | ||||||
| var import_core2 = require("@keystone-6/core"); |  | ||||||
| var import_fields_document = require("@keystone-6/fields-document"); |  | ||||||
| var import_fields2 = require("@keystone-6/core/fields"); |  | ||||||
| var Moment = (0, import_core2.list)({ |  | ||||||
|   access: allowUser, |  | ||||||
|   fields: { |  | ||||||
|     title: (0, import_fields2.text)({ validation: { isRequired: true } }), |  | ||||||
|     images: (0, import_fields2.relationship)({ ref: "Image", many: true }), |  | ||||||
|     content: (0, import_fields_document.document)({ |  | ||||||
|       formatting: true, |  | ||||||
|       layouts: [ |  | ||||||
|         [1, 1], |  | ||||||
|         [1, 1, 1], |  | ||||||
|         [2, 1], |  | ||||||
|         [1, 2], |  | ||||||
|         [1, 2, 1] |  | ||||||
|       ], |  | ||||||
|       links: true, |  | ||||||
|       dividers: true |  | ||||||
|     }), |  | ||||||
|     author: (0, import_fields2.relationship)({ |  | ||||||
|       ref: "User.moments", |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name", "email"], |  | ||||||
|         inlineEdit: { fields: ["name", "email"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true |  | ||||||
|       }, |  | ||||||
|       many: false |  | ||||||
|     }), |  | ||||||
|     categories: (0, import_fields2.relationship)({ |  | ||||||
|       ref: "Category.moments", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] } |  | ||||||
|       } |  | ||||||
|     }), |  | ||||||
|     tags: (0, import_fields2.relationship)({ |  | ||||||
|       ref: "Tag.moments", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] } |  | ||||||
|       } |  | ||||||
|     }), |  | ||||||
|     createdAt: (0, import_fields2.timestamp)({ |  | ||||||
|       defaultValue: { kind: "now" } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // schema/categories.ts |  | ||||||
| var import_core3 = require("@keystone-6/core"); |  | ||||||
| var import_fields3 = require("@keystone-6/core/fields"); |  | ||||||
| var Category = (0, import_core3.list)({ |  | ||||||
|   access: allowEditor, |  | ||||||
|   fields: { |  | ||||||
|     slug: (0, import_fields3.text)({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique" |  | ||||||
|     }), |  | ||||||
|     name: (0, import_fields3.text)(), |  | ||||||
|     posts: (0, import_fields3.relationship)({ ref: "Post.categories", many: true }), |  | ||||||
|     moments: (0, import_fields3.relationship)({ ref: "Moment.categories", many: true }), |  | ||||||
|     events: (0, import_fields3.relationship)({ ref: "Event.categories", many: true }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| var Tag = (0, import_core3.list)({ |  | ||||||
|   access: allowEditor, |  | ||||||
|   fields: { |  | ||||||
|     slug: (0, import_fields3.text)({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique" |  | ||||||
|     }), |  | ||||||
|     name: (0, import_fields3.text)(), |  | ||||||
|     posts: (0, import_fields3.relationship)({ ref: "Post.tags", many: true }), |  | ||||||
|     moments: (0, import_fields3.relationship)({ ref: "Moment.tags", many: true }), |  | ||||||
|     events: (0, import_fields3.relationship)({ ref: "Event.tags", many: true }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // schema/projects.ts |  | ||||||
| var import_fields4 = require("@keystone-6/core/fields"); |  | ||||||
| var import_core4 = require("@keystone-6/core"); |  | ||||||
| var Project = (0, import_core4.list)({ |  | ||||||
|   access: { |  | ||||||
|     ...allowAdmin, |  | ||||||
|     filter: { |  | ||||||
|       query: ({ session: session2 }) => { |  | ||||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) |  | ||||||
|           return true; |  | ||||||
|         return { isPublished: { equals: true } }; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   }, |  | ||||||
|   fields: { |  | ||||||
|     icon: (0, import_fields4.relationship)({ ref: "Image" }), |  | ||||||
|     name: (0, import_fields4.text)({ validation: { isRequired: true } }), |  | ||||||
|     description: (0, import_fields4.text)(), |  | ||||||
|     link: (0, import_fields4.text)(), |  | ||||||
|     isPublished: (0, import_fields4.checkbox)(), |  | ||||||
|     status: (0, import_fields4.select)({ |  | ||||||
|       type: "enum", |  | ||||||
|       options: [ |  | ||||||
|         { label: "Pending", value: "pending" }, |  | ||||||
|         { label: "Constructing", value: "constructing" }, |  | ||||||
|         { label: "Published", value: "published" }, |  | ||||||
|         { label: "Abandoned", value: "abandoned" } |  | ||||||
|       ], |  | ||||||
|       defaultValue: "pending", |  | ||||||
|       db: { map: "project_status" }, |  | ||||||
|       validation: { isRequired: true }, |  | ||||||
|       ui: { displayMode: "select" } |  | ||||||
|     }), |  | ||||||
|     post: (0, import_fields4.relationship)({ ref: "Post" }), |  | ||||||
|     createdAt: (0, import_fields4.timestamp)({ |  | ||||||
|       defaultValue: { kind: "now" } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // schema/posts.ts |  | ||||||
| var import_fields5 = require("@keystone-6/core/fields"); |  | ||||||
| var import_fields_document2 = require("@keystone-6/fields-document"); |  | ||||||
| var import_core5 = require("@keystone-6/core"); |  | ||||||
| var Post = (0, import_core5.list)({ |  | ||||||
|   access: { |  | ||||||
|     ...allowEditor, |  | ||||||
|     filter: { |  | ||||||
|       query: ({ session: session2 }) => { |  | ||||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) |  | ||||||
|           return true; |  | ||||||
|         return { isPublished: { equals: true } }; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   }, |  | ||||||
|   fields: { |  | ||||||
|     slug: (0, import_fields5.text)({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique" |  | ||||||
|     }), |  | ||||||
|     title: (0, import_fields5.text)({ validation: { isRequired: true } }), |  | ||||||
|     cover: (0, import_fields5.relationship)({ ref: "Image" }), |  | ||||||
|     description: (0, import_fields5.text)(), |  | ||||||
|     assets: (0, import_fields5.relationship)({ ref: "Asset", many: true }), |  | ||||||
|     images: (0, import_fields5.relationship)({ ref: "Image", many: true }), |  | ||||||
|     content: (0, import_fields_document2.document)({ |  | ||||||
|       formatting: true, |  | ||||||
|       layouts: [ |  | ||||||
|         [1, 1], |  | ||||||
|         [1, 1, 1], |  | ||||||
|         [2, 1], |  | ||||||
|         [1, 2], |  | ||||||
|         [1, 2, 1] |  | ||||||
|       ], |  | ||||||
|       links: true, |  | ||||||
|       dividers: true |  | ||||||
|     }), |  | ||||||
|     type: (0, import_fields5.select)({ |  | ||||||
|       type: "enum", |  | ||||||
|       options: [ |  | ||||||
|         { label: "Article", value: "article" }, |  | ||||||
|         { label: "Podcast", value: "podcast" } |  | ||||||
|       ], |  | ||||||
|       defaultValue: "article", |  | ||||||
|       db: { map: "post_type" }, |  | ||||||
|       validation: { isRequired: true }, |  | ||||||
|       ui: { displayMode: "select" } |  | ||||||
|     }), |  | ||||||
|     isPublished: (0, import_fields5.checkbox)(), |  | ||||||
|     author: (0, import_fields5.relationship)({ |  | ||||||
|       ref: "User.posts", |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name", "email"], |  | ||||||
|         inlineEdit: { fields: ["name", "email"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true |  | ||||||
|       }, |  | ||||||
|       many: false |  | ||||||
|     }), |  | ||||||
|     categories: (0, import_fields5.relationship)({ |  | ||||||
|       ref: "Category.posts", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] } |  | ||||||
|       } |  | ||||||
|     }), |  | ||||||
|     tags: (0, import_fields5.relationship)({ |  | ||||||
|       ref: "Tag.posts", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] } |  | ||||||
|       } |  | ||||||
|     }), |  | ||||||
|     createdAt: (0, import_fields5.timestamp)({ |  | ||||||
|       defaultValue: { kind: "now" } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // schema/events.ts |  | ||||||
| var import_fields6 = require("@keystone-6/core/fields"); |  | ||||||
| var import_fields_document3 = require("@keystone-6/fields-document"); |  | ||||||
| var import_core6 = require("@keystone-6/core"); |  | ||||||
| var Event = (0, import_core6.list)({ |  | ||||||
|   access: { |  | ||||||
|     ...allowEditor, |  | ||||||
|     filter: { |  | ||||||
|       query: ({ session: session2 }) => { |  | ||||||
|         if (session2?.data.isEditor || session2?.data.isAdmin) |  | ||||||
|           return true; |  | ||||||
|         return { isPublished: { equals: true } }; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   }, |  | ||||||
|   fields: { |  | ||||||
|     slug: (0, import_fields6.text)({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique" |  | ||||||
|     }), |  | ||||||
|     title: (0, import_fields6.text)({ validation: { isRequired: true } }), |  | ||||||
|     description: (0, import_fields6.text)(), |  | ||||||
|     content: (0, import_fields_document3.document)({ |  | ||||||
|       formatting: true, |  | ||||||
|       layouts: [ |  | ||||||
|         [1, 1], |  | ||||||
|         [1, 1, 1], |  | ||||||
|         [2, 1], |  | ||||||
|         [1, 2], |  | ||||||
|         [1, 2, 1] |  | ||||||
|       ], |  | ||||||
|       links: true, |  | ||||||
|       dividers: true |  | ||||||
|     }), |  | ||||||
|     isPublished: (0, import_fields6.checkbox)(), |  | ||||||
|     isHistory: (0, import_fields6.checkbox)(), |  | ||||||
|     author: (0, import_fields6.relationship)({ |  | ||||||
|       ref: "User.events", |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name", "email"], |  | ||||||
|         inlineEdit: { fields: ["name", "email"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true |  | ||||||
|       }, |  | ||||||
|       many: false |  | ||||||
|     }), |  | ||||||
|     categories: (0, import_fields6.relationship)({ |  | ||||||
|       ref: "Category.events", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] } |  | ||||||
|       } |  | ||||||
|     }), |  | ||||||
|     tags: (0, import_fields6.relationship)({ |  | ||||||
|       ref: "Tag.events", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] } |  | ||||||
|       } |  | ||||||
|     }), |  | ||||||
|     createdAt: (0, import_fields6.timestamp)({ |  | ||||||
|       defaultValue: { kind: "now" } |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // schema/index.ts |  | ||||||
| var lists = { |  | ||||||
|   User: (0, import_core7.list)({ |  | ||||||
|     access: allowAdmin, |  | ||||||
|     fields: { |  | ||||||
|       name: (0, import_fields7.text)({ validation: { isRequired: true } }), |  | ||||||
|       email: (0, import_fields7.text)({ |  | ||||||
|         validation: { isRequired: true }, |  | ||||||
|         isIndexed: "unique" |  | ||||||
|       }), |  | ||||||
|       password: (0, import_fields7.password)({ validation: { isRequired: true } }), |  | ||||||
|       posts: (0, import_fields7.relationship)({ ref: "Post.author", many: true }), |  | ||||||
|       moments: (0, import_fields7.relationship)({ ref: "Moment.author", many: true }), |  | ||||||
|       events: (0, import_fields7.relationship)({ ref: "Event.author", many: true }), |  | ||||||
|       isAdmin: (0, import_fields7.checkbox)(), |  | ||||||
|       isEditor: (0, import_fields7.checkbox)(), |  | ||||||
|       createdAt: (0, import_fields7.timestamp)({ |  | ||||||
|         defaultValue: { kind: "now" } |  | ||||||
|       }) |  | ||||||
|     } |  | ||||||
|   }), |  | ||||||
|   Image, |  | ||||||
|   Asset, |  | ||||||
|   Post, |  | ||||||
|   Moment, |  | ||||||
|   Project, |  | ||||||
|   Event, |  | ||||||
|   Category, |  | ||||||
|   Tag |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // auth.ts |  | ||||||
| var import_crypto = require("crypto"); |  | ||||||
| var import_auth = require("@keystone-6/auth"); |  | ||||||
| var import_session = require("@keystone-6/core/session"); |  | ||||||
| var sessionSecret = process.env.SESSION_SECRET; |  | ||||||
| if (!sessionSecret && process.env.NODE_ENV !== "production") { |  | ||||||
|   sessionSecret = (0, import_crypto.randomBytes)(32).toString("hex"); |  | ||||||
| } |  | ||||||
| var { withAuth } = (0, import_auth.createAuth)({ |  | ||||||
|   listKey: "User", |  | ||||||
|   identityField: "email", |  | ||||||
|   sessionData: "id name createdAt isAdmin isEditor", |  | ||||||
|   secretField: "password", |  | ||||||
|   initFirstItem: { |  | ||||||
|     fields: ["name", "email", "password", "isAdmin"] |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| var sessionMaxAge = 60 * 60 * 24 * 30; |  | ||||||
| var session = (0, import_session.statelessSessions)({ |  | ||||||
|   maxAge: sessionMaxAge, |  | ||||||
|   secret: sessionSecret |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| // keystone.ts |  | ||||||
| var baseUrl = process.env.BASE_URL ?? "http://localhost:3000"; |  | ||||||
| var databaseUrl = process.env.DATABASE_URL ?? "postgresql://postgres:password@127.0.0.1:5432/capital"; |  | ||||||
| var databaseProvider = process.env.DATABASE_PROVIDER ?? "postgresql"; |  | ||||||
| var keystone_default = withAuth( |  | ||||||
|   (0, import_core8.config)({ |  | ||||||
|     ui: { |  | ||||||
|       basePath: "/cms" |  | ||||||
|     }, |  | ||||||
|     db: { |  | ||||||
|       provider: databaseProvider, |  | ||||||
|       url: databaseUrl |  | ||||||
|     }, |  | ||||||
|     server: { |  | ||||||
|       cors: { |  | ||||||
|         origin: "*", |  | ||||||
|         methods: "GET,HEAD,PUT,PATCH,POST,DELETE" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     storage: { |  | ||||||
|       localImages: { |  | ||||||
|         kind: "local", |  | ||||||
|         type: "image", |  | ||||||
|         generateUrl: (path) => `${baseUrl}/images${path}`, |  | ||||||
|         serverRoute: { |  | ||||||
|           path: "/images" |  | ||||||
|         }, |  | ||||||
|         storagePath: "public/images" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     lists, |  | ||||||
|     session |  | ||||||
|   }) |  | ||||||
| ); |  | ||||||
| //# sourceMappingURL=config.js.map |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,40 +0,0 @@ | |||||||
| import { randomBytes } from "crypto"; |  | ||||||
| import { createAuth } from "@keystone-6/auth"; |  | ||||||
|  |  | ||||||
| import { statelessSessions } from "@keystone-6/core/session"; |  | ||||||
|  |  | ||||||
| let sessionSecret = process.env.SESSION_SECRET; |  | ||||||
| if (!sessionSecret && process.env.NODE_ENV !== "production") { |  | ||||||
|   sessionSecret = randomBytes(32).toString("hex"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export type Session = { |  | ||||||
|   data: { |  | ||||||
|     id: string; |  | ||||||
|     name: string; |  | ||||||
|     isAdmin: boolean; |  | ||||||
|     isEditor: boolean; |  | ||||||
|     createdAt: Date; |  | ||||||
|   }; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| const { withAuth } = createAuth({ |  | ||||||
|   listKey: "User", |  | ||||||
|   identityField: "email", |  | ||||||
|  |  | ||||||
|   sessionData: "id name createdAt isAdmin isEditor", |  | ||||||
|   secretField: "password", |  | ||||||
|  |  | ||||||
|   initFirstItem: { |  | ||||||
|     fields: ["name", "email", "password", "isAdmin"], |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| const sessionMaxAge = 60 * 60 * 24 * 30; |  | ||||||
|  |  | ||||||
| const session = statelessSessions({ |  | ||||||
|   maxAge: sessionMaxAge, |  | ||||||
|   secret: sessionSecret!, |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| export { withAuth, session }; |  | ||||||
| @@ -1,6 +0,0 @@ | |||||||
| #!/bin/sh |  | ||||||
|  |  | ||||||
| cd /app; |  | ||||||
| npm install; |  | ||||||
| npx prisma db push; |  | ||||||
| npm run start; |  | ||||||
| @@ -1,41 +0,0 @@ | |||||||
| import { config } from "@keystone-6/core"; |  | ||||||
|  |  | ||||||
| import { lists } from "./schema"; |  | ||||||
|  |  | ||||||
| import { withAuth, session } from "./auth"; |  | ||||||
| import { DatabaseProvider } from "@keystone-6/core/types"; |  | ||||||
|  |  | ||||||
| const baseUrl = process.env.BASE_URL ?? "http://localhost:3000"; |  | ||||||
| const databaseUrl = process.env.DATABASE_URL ?? "postgresql://postgres:password@127.0.0.1:5432/capital"; |  | ||||||
| const databaseProvider = process.env.DATABASE_PROVIDER ?? "postgresql"; |  | ||||||
|  |  | ||||||
| export default withAuth( |  | ||||||
|   config({ |  | ||||||
|     ui: { |  | ||||||
|       basePath: "/cms", |  | ||||||
|     }, |  | ||||||
|     db: { |  | ||||||
|       provider: databaseProvider as DatabaseProvider, |  | ||||||
|       url: databaseUrl, |  | ||||||
|     }, |  | ||||||
|     server: { |  | ||||||
|       cors: { |  | ||||||
|         origin: "*", |  | ||||||
|         methods: "GET,HEAD,PUT,PATCH,POST,DELETE", |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|     storage: { |  | ||||||
|       localImages: { |  | ||||||
|         kind: "local", |  | ||||||
|         type: "image", |  | ||||||
|         generateUrl: (path) => `${baseUrl}/images${path}`, |  | ||||||
|         serverRoute: { |  | ||||||
|           path: "/images", |  | ||||||
|         }, |  | ||||||
|         storagePath: "public/images", |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|     lists, |  | ||||||
|     session, |  | ||||||
|   }), |  | ||||||
| ); |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| const isUser = ({ session }: { session: any }) => session?.data.id != null; |  | ||||||
| const allowUser: any = { |  | ||||||
|   operation: { |  | ||||||
|     create: isUser, |  | ||||||
|     update: isUser, |  | ||||||
|     delete: isUser, |  | ||||||
|   }, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| const isEditor = ({ session }: { session: any }) => session?.data.isEditor || session?.data.isAdmin; |  | ||||||
| const allowEditor: any = { |  | ||||||
|   operation: { |  | ||||||
|     create: isEditor, |  | ||||||
|     update: isEditor, |  | ||||||
|     delete: isEditor, |  | ||||||
|   }, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| const isAdmin = ({ session }: { session: any }) => session?.data.isAdmin; |  | ||||||
| const allowAdmin: any = { |  | ||||||
|   operation: { |  | ||||||
|     create: isAdmin, |  | ||||||
|     update: isAdmin, |  | ||||||
|     delete: isAdmin, |  | ||||||
|   }, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| export { isUser, isAdmin, isEditor, allowUser, allowAdmin, allowEditor }; |  | ||||||
							
								
								
									
										11019
									
								
								content/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										11019
									
								
								content/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,17 +0,0 @@ | |||||||
| { |  | ||||||
|   "name": "keystone-app", |  | ||||||
|   "version": "1.0.2", |  | ||||||
|   "private": true, |  | ||||||
|   "scripts": { |  | ||||||
|     "dev": "keystone dev", |  | ||||||
|     "start": "keystone start", |  | ||||||
|     "build": "keystone build", |  | ||||||
|     "postinstall": "keystone build --no-ui --frozen" |  | ||||||
|   }, |  | ||||||
|   "dependencies": { |  | ||||||
|     "@keystone-6/auth": "^7.0.0", |  | ||||||
|     "@keystone-6/core": "^5.0.0", |  | ||||||
|     "@keystone-6/fields-document": "^7.0.0", |  | ||||||
|     "typescript": "^4.9.5" |  | ||||||
|   } |  | ||||||
| } |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.3 MiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.3 MiB | 
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,155 +0,0 @@ | |||||||
| // This file is automatically generated by Keystone, do not modify it manually. |  | ||||||
| // Modify your Keystone config when you want to change this. |  | ||||||
|  |  | ||||||
| datasource postgresql { |  | ||||||
|   url               = env("DATABASE_URL") |  | ||||||
|   shadowDatabaseUrl = env("SHADOW_DATABASE_URL") |  | ||||||
|   provider          = "postgresql" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| generator client { |  | ||||||
|   provider = "prisma-client-js" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model User { |  | ||||||
|   id        String    @id @default(cuid()) |  | ||||||
|   name      String    @default("") |  | ||||||
|   email     String    @unique @default("") |  | ||||||
|   password  String |  | ||||||
|   posts     Post[]    @relation("Post_author") |  | ||||||
|   moments   Moment[]  @relation("Moment_author") |  | ||||||
|   events    Event[]   @relation("Event_author") |  | ||||||
|   isAdmin   Boolean   @default(false) |  | ||||||
|   isEditor  Boolean   @default(false) |  | ||||||
|   createdAt DateTime? @default(now()) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Image { |  | ||||||
|   id                 String    @id @default(cuid()) |  | ||||||
|   caption            String    @default("") |  | ||||||
|   image_filesize     Int? |  | ||||||
|   image_extension    String? |  | ||||||
|   image_width        Int? |  | ||||||
|   image_height       Int? |  | ||||||
|   image_id           String? |  | ||||||
|   createdAt          DateTime? @default(now()) |  | ||||||
|   from_Post_cover    Post[]    @relation("Post_cover") |  | ||||||
|   from_Post_images   Post[]    @relation("Post_images") |  | ||||||
|   from_Moment_images Moment[]  @relation("Moment_images") |  | ||||||
|   from_Project_icon  Project[] @relation("Project_icon") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Asset { |  | ||||||
|   id               String        @id @default(cuid()) |  | ||||||
|   caption          String        @default("") |  | ||||||
|   url              String        @default("") |  | ||||||
|   type             AssetTypeType @default(video) @map("media_type") |  | ||||||
|   createdAt        DateTime?     @default(now()) |  | ||||||
|   from_Post_assets Post[]        @relation("Post_assets") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Post { |  | ||||||
|   id                String       @id @default(cuid()) |  | ||||||
|   slug              String       @unique @default("") |  | ||||||
|   title             String       @default("") |  | ||||||
|   cover             Image?       @relation("Post_cover", fields: [coverId], references: [id]) |  | ||||||
|   coverId           String?      @map("cover") |  | ||||||
|   description       String       @default("") |  | ||||||
|   assets            Asset[]      @relation("Post_assets") |  | ||||||
|   images            Image[]      @relation("Post_images") |  | ||||||
|   content           Json         @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]") |  | ||||||
|   type              PostTypeType @default(article) @map("post_type") |  | ||||||
|   isPublished       Boolean      @default(false) |  | ||||||
|   author            User?        @relation("Post_author", fields: [authorId], references: [id]) |  | ||||||
|   authorId          String?      @map("author") |  | ||||||
|   categories        Category[]   @relation("Category_posts") |  | ||||||
|   tags              Tag[]        @relation("Post_tags") |  | ||||||
|   createdAt         DateTime?    @default(now()) |  | ||||||
|   from_Project_post Project[]    @relation("Project_post") |  | ||||||
|  |  | ||||||
|   @@index([coverId]) |  | ||||||
|   @@index([authorId]) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Moment { |  | ||||||
|   id         String     @id @default(cuid()) |  | ||||||
|   title      String     @default("") |  | ||||||
|   images     Image[]    @relation("Moment_images") |  | ||||||
|   content    Json       @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]") |  | ||||||
|   author     User?      @relation("Moment_author", fields: [authorId], references: [id]) |  | ||||||
|   authorId   String?    @map("author") |  | ||||||
|   categories Category[] @relation("Category_moments") |  | ||||||
|   tags       Tag[]      @relation("Moment_tags") |  | ||||||
|   createdAt  DateTime?  @default(now()) |  | ||||||
|  |  | ||||||
|   @@index([authorId]) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Project { |  | ||||||
|   id          String            @id @default(cuid()) |  | ||||||
|   icon        Image?            @relation("Project_icon", fields: [iconId], references: [id]) |  | ||||||
|   iconId      String?           @map("icon") |  | ||||||
|   name        String            @default("") |  | ||||||
|   description String            @default("") |  | ||||||
|   link        String            @default("") |  | ||||||
|   isPublished Boolean           @default(false) |  | ||||||
|   status      ProjectStatusType @default(pending) @map("project_status") |  | ||||||
|   post        Post?             @relation("Project_post", fields: [postId], references: [id]) |  | ||||||
|   postId      String?           @map("post") |  | ||||||
|   createdAt   DateTime?         @default(now()) |  | ||||||
|  |  | ||||||
|   @@index([iconId]) |  | ||||||
|   @@index([postId]) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Event { |  | ||||||
|   id          String     @id @default(cuid()) |  | ||||||
|   slug        String     @unique @default("") |  | ||||||
|   title       String     @default("") |  | ||||||
|   description String     @default("") |  | ||||||
|   content     Json       @default("[{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]}]") |  | ||||||
|   isPublished Boolean    @default(false) |  | ||||||
|   isHistory   Boolean    @default(false) |  | ||||||
|   author      User?      @relation("Event_author", fields: [authorId], references: [id]) |  | ||||||
|   authorId    String?    @map("author") |  | ||||||
|   categories  Category[] @relation("Category_events") |  | ||||||
|   tags        Tag[]      @relation("Event_tags") |  | ||||||
|   createdAt   DateTime?  @default(now()) |  | ||||||
|  |  | ||||||
|   @@index([authorId]) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Category { |  | ||||||
|   id      String   @id @default(cuid()) |  | ||||||
|   slug    String   @unique @default("") |  | ||||||
|   name    String   @default("") |  | ||||||
|   posts   Post[]   @relation("Category_posts") |  | ||||||
|   moments Moment[] @relation("Category_moments") |  | ||||||
|   events  Event[]  @relation("Category_events") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| model Tag { |  | ||||||
|   id      String   @id @default(cuid()) |  | ||||||
|   slug    String   @unique @default("") |  | ||||||
|   name    String   @default("") |  | ||||||
|   posts   Post[]   @relation("Post_tags") |  | ||||||
|   moments Moment[] @relation("Moment_tags") |  | ||||||
|   events  Event[]  @relation("Event_tags") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum AssetTypeType { |  | ||||||
|   video |  | ||||||
|   audio |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum PostTypeType { |  | ||||||
|   article |  | ||||||
|   podcast |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum ProjectStatusType { |  | ||||||
|   pending |  | ||||||
|   constructing |  | ||||||
|   published |  | ||||||
|   abandoned |  | ||||||
| } |  | ||||||
| @@ -1,41 +0,0 @@ | |||||||
| import { image, select, text, timestamp } from "@keystone-6/core/fields"; |  | ||||||
| import { list } from "@keystone-6/core"; |  | ||||||
|  |  | ||||||
| import { allowEditor } from "../limit"; |  | ||||||
|  |  | ||||||
| export const Image = list({ |  | ||||||
|   access: allowEditor, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     caption: text(), |  | ||||||
|     image: image({ storage: "localImages" }), |  | ||||||
|  |  | ||||||
|     createdAt: timestamp({ |  | ||||||
|       defaultValue: { kind: "now" }, |  | ||||||
|     }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| export const Asset = list({ |  | ||||||
|   access: allowEditor, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     caption: text(), |  | ||||||
|     url: text({ validation: { isRequired: true } }), |  | ||||||
|     type: select({ |  | ||||||
|       type: "enum", |  | ||||||
|       options: [ |  | ||||||
|         { label: "Video", value: "video" }, |  | ||||||
|         { label: "Audio", value: "audio" }, |  | ||||||
|       ], |  | ||||||
|       defaultValue: "video", |  | ||||||
|       db: { map: "media_type" }, |  | ||||||
|       validation: { isRequired: true }, |  | ||||||
|       ui: { displayMode: "select" }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     createdAt: timestamp({ |  | ||||||
|       defaultValue: { kind: "now" }, |  | ||||||
|     }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| import { list } from "@keystone-6/core"; |  | ||||||
| import { allowEditor } from "../limit"; |  | ||||||
| import { relationship, text } from "@keystone-6/core/fields"; |  | ||||||
|  |  | ||||||
| export const Category = list({ |  | ||||||
|   access: allowEditor, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     slug: text({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true, |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique", |  | ||||||
|     }), |  | ||||||
|     name: text(), |  | ||||||
|     posts: relationship({ ref: "Post.categories", many: true }), |  | ||||||
|     moments: relationship({ ref: "Moment.categories", many: true }), |  | ||||||
|     events: relationship({ ref: "Event.categories", many: true }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
|  |  | ||||||
| export const Tag = list({ |  | ||||||
|   access: allowEditor, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     slug: text({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true, |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique", |  | ||||||
|     }), |  | ||||||
|     name: text(), |  | ||||||
|     posts: relationship({ ref: "Post.tags", many: true }), |  | ||||||
|     moments: relationship({ ref: "Moment.tags", many: true }), |  | ||||||
|     events: relationship({ ref: "Event.tags", many: true }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
| @@ -1,89 +0,0 @@ | |||||||
| import { checkbox, relationship, text, timestamp } from "@keystone-6/core/fields"; |  | ||||||
| import { document } from "@keystone-6/fields-document"; |  | ||||||
| import { list } from "@keystone-6/core"; |  | ||||||
| import { allowEditor } from "../limit"; |  | ||||||
| import { Session } from "../auth"; |  | ||||||
|  |  | ||||||
| export const Event = list({ |  | ||||||
|   access: { |  | ||||||
|     ...allowEditor, |  | ||||||
|  |  | ||||||
|     filter: { |  | ||||||
|       query: ({ session }: { session: Session }) => { |  | ||||||
|         if (session?.data.isEditor || session?.data.isAdmin) return true; |  | ||||||
|         return { isPublished: { equals: true } }; |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|   }, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     slug: text({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true, |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique", |  | ||||||
|     }), |  | ||||||
|     title: text({ validation: { isRequired: true } }), |  | ||||||
|     description: text(), |  | ||||||
|  |  | ||||||
|     content: document({ |  | ||||||
|       formatting: true, |  | ||||||
|       layouts: [ |  | ||||||
|         [1, 1], |  | ||||||
|         [1, 1, 1], |  | ||||||
|         [2, 1], |  | ||||||
|         [1, 2], |  | ||||||
|         [1, 2, 1], |  | ||||||
|       ], |  | ||||||
|       links: true, |  | ||||||
|       dividers: true, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     isPublished: checkbox(), |  | ||||||
|     isHistory: checkbox(), |  | ||||||
|  |  | ||||||
|     author: relationship({ |  | ||||||
|       ref: "User.events", |  | ||||||
|  |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name", "email"], |  | ||||||
|         inlineEdit: { fields: ["name", "email"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|       }, |  | ||||||
|  |  | ||||||
|       many: false, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     categories: relationship({ |  | ||||||
|       ref: "Category.events", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] }, |  | ||||||
|       }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     tags: relationship({ |  | ||||||
|       ref: "Tag.events", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] }, |  | ||||||
|       }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     createdAt: timestamp({ |  | ||||||
|       defaultValue: { kind: "now" }, |  | ||||||
|     }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
| @@ -1,49 +0,0 @@ | |||||||
| import { list } from "@keystone-6/core"; |  | ||||||
|  |  | ||||||
| import { text, relationship, password, timestamp, checkbox } from "@keystone-6/core/fields"; |  | ||||||
|  |  | ||||||
| import { allowAdmin } from "../limit"; |  | ||||||
|  |  | ||||||
| import { Image, Asset } from "./assets"; |  | ||||||
| import { Moment } from "./moments"; |  | ||||||
| import { Category, Tag } from "./categories"; |  | ||||||
| import { Project } from "./projects"; |  | ||||||
| import { Post } from "./posts"; |  | ||||||
| import { Event } from "./events"; |  | ||||||
|  |  | ||||||
| export const lists = { |  | ||||||
|   User: list({ |  | ||||||
|     access: allowAdmin, |  | ||||||
|  |  | ||||||
|     fields: { |  | ||||||
|       name: text({ validation: { isRequired: true } }), |  | ||||||
|       email: text({ |  | ||||||
|         validation: { isRequired: true }, |  | ||||||
|         isIndexed: "unique", |  | ||||||
|       }), |  | ||||||
|  |  | ||||||
|       password: password({ validation: { isRequired: true } }), |  | ||||||
|       posts: relationship({ ref: "Post.author", many: true }), |  | ||||||
|       moments: relationship({ ref: "Moment.author", many: true }), |  | ||||||
|       events: relationship({ ref: "Event.author", many: true }), |  | ||||||
|  |  | ||||||
|       isAdmin: checkbox(), |  | ||||||
|       isEditor: checkbox(), |  | ||||||
|  |  | ||||||
|       createdAt: timestamp({ |  | ||||||
|         defaultValue: { kind: "now" }, |  | ||||||
|       }), |  | ||||||
|     }, |  | ||||||
|   }), |  | ||||||
|  |  | ||||||
|   Image, |  | ||||||
|   Asset, |  | ||||||
|  |  | ||||||
|   Post, |  | ||||||
|   Moment, |  | ||||||
|   Project, |  | ||||||
|   Event, |  | ||||||
|  |  | ||||||
|   Category, |  | ||||||
|   Tag, |  | ||||||
| }; |  | ||||||
| @@ -1,70 +0,0 @@ | |||||||
| import { list } from "@keystone-6/core"; |  | ||||||
| import { allowUser } from "../limit"; |  | ||||||
| import { document } from "@keystone-6/fields-document"; |  | ||||||
| import { relationship, text, timestamp } from "@keystone-6/core/fields"; |  | ||||||
|  |  | ||||||
| export const Moment = list({ |  | ||||||
|   access: allowUser, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     title: text({ validation: { isRequired: true } }), |  | ||||||
|     images: relationship({ ref: "Image", many: true }), |  | ||||||
|  |  | ||||||
|     content: document({ |  | ||||||
|       formatting: true, |  | ||||||
|       layouts: [ |  | ||||||
|         [1, 1], |  | ||||||
|         [1, 1, 1], |  | ||||||
|         [2, 1], |  | ||||||
|         [1, 2], |  | ||||||
|         [1, 2, 1], |  | ||||||
|       ], |  | ||||||
|       links: true, |  | ||||||
|       dividers: true, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     author: relationship({ |  | ||||||
|       ref: "User.moments", |  | ||||||
|  |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name", "email"], |  | ||||||
|         inlineEdit: { fields: ["name", "email"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|       }, |  | ||||||
|  |  | ||||||
|       many: false, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     categories: relationship({ |  | ||||||
|       ref: "Category.moments", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] }, |  | ||||||
|       }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     tags: relationship({ |  | ||||||
|       ref: "Tag.moments", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] }, |  | ||||||
|       }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     createdAt: timestamp({ |  | ||||||
|       defaultValue: { kind: "now" }, |  | ||||||
|     }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
| @@ -1,104 +0,0 @@ | |||||||
| import { checkbox, relationship, select, text, timestamp } from "@keystone-6/core/fields"; |  | ||||||
| import { document } from "@keystone-6/fields-document"; |  | ||||||
| import { list } from "@keystone-6/core"; |  | ||||||
| import { allowEditor } from "../limit"; |  | ||||||
| import { Session } from "../auth"; |  | ||||||
|  |  | ||||||
| export const Post = list({ |  | ||||||
|   access: { |  | ||||||
|     ...allowEditor, |  | ||||||
|  |  | ||||||
|     filter: { |  | ||||||
|       query: ({ session }: { session: Session }) => { |  | ||||||
|         if (session?.data.isEditor || session?.data.isAdmin) return true; |  | ||||||
|         return { isPublished: { equals: true } }; |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|   }, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     slug: text({ |  | ||||||
|       validation: { |  | ||||||
|         isRequired: true, |  | ||||||
|       }, |  | ||||||
|       isIndexed: "unique", |  | ||||||
|     }), |  | ||||||
|     title: text({ validation: { isRequired: true } }), |  | ||||||
|     cover: relationship({ ref: "Image" }), |  | ||||||
|  |  | ||||||
|     description: text(), |  | ||||||
|  |  | ||||||
|     assets: relationship({ ref: "Asset", many: true }), |  | ||||||
|     images: relationship({ ref: "Image", many: true }), |  | ||||||
|     content: document({ |  | ||||||
|       formatting: true, |  | ||||||
|       layouts: [ |  | ||||||
|         [1, 1], |  | ||||||
|         [1, 1, 1], |  | ||||||
|         [2, 1], |  | ||||||
|         [1, 2], |  | ||||||
|         [1, 2, 1], |  | ||||||
|       ], |  | ||||||
|       links: true, |  | ||||||
|       dividers: true, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     type: select({ |  | ||||||
|       type: "enum", |  | ||||||
|       options: [ |  | ||||||
|         { label: "Article", value: "article" }, |  | ||||||
|         { label: "Podcast", value: "podcast" }, |  | ||||||
|       ], |  | ||||||
|       defaultValue: "article", |  | ||||||
|       db: { map: "post_type" }, |  | ||||||
|       validation: { isRequired: true }, |  | ||||||
|       ui: { displayMode: "select" }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     isPublished: checkbox(), |  | ||||||
|  |  | ||||||
|     author: relationship({ |  | ||||||
|       ref: "User.posts", |  | ||||||
|  |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name", "email"], |  | ||||||
|         inlineEdit: { fields: ["name", "email"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|       }, |  | ||||||
|  |  | ||||||
|       many: false, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     categories: relationship({ |  | ||||||
|       ref: "Category.posts", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] }, |  | ||||||
|       }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     tags: relationship({ |  | ||||||
|       ref: "Tag.posts", |  | ||||||
|       many: true, |  | ||||||
|       ui: { |  | ||||||
|         displayMode: "cards", |  | ||||||
|         cardFields: ["name"], |  | ||||||
|         inlineEdit: { fields: ["name"] }, |  | ||||||
|         linkToItem: true, |  | ||||||
|         inlineConnect: true, |  | ||||||
|         inlineCreate: { fields: ["name"] }, |  | ||||||
|       }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     createdAt: timestamp({ |  | ||||||
|       defaultValue: { kind: "now" }, |  | ||||||
|     }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
| @@ -1,46 +0,0 @@ | |||||||
| import { checkbox, relationship, select, text, timestamp } from "@keystone-6/core/fields"; |  | ||||||
| import { list } from "@keystone-6/core"; |  | ||||||
| import { allowAdmin } from "../limit"; |  | ||||||
| import { Session } from "../auth"; |  | ||||||
|  |  | ||||||
| export const Project = list({ |  | ||||||
|   access: { |  | ||||||
|     ...allowAdmin, |  | ||||||
|  |  | ||||||
|     filter: { |  | ||||||
|       query: ({ session }: { session: Session }) => { |  | ||||||
|         if (session?.data.isEditor || session?.data.isAdmin) return true; |  | ||||||
|         return { isPublished: { equals: true } }; |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|   }, |  | ||||||
|  |  | ||||||
|   fields: { |  | ||||||
|     icon: relationship({ ref: "Image" }), |  | ||||||
|     name: text({ validation: { isRequired: true } }), |  | ||||||
|     description: text(), |  | ||||||
|     link: text(), |  | ||||||
|  |  | ||||||
|     isPublished: checkbox(), |  | ||||||
|  |  | ||||||
|     status: select({ |  | ||||||
|       type: "enum", |  | ||||||
|       options: [ |  | ||||||
|         { label: "Pending", value: "pending" }, |  | ||||||
|         { label: "Constructing", value: "constructing" }, |  | ||||||
|         { label: "Published", value: "published" }, |  | ||||||
|         { label: "Abandoned", value: "abandoned" }, |  | ||||||
|       ], |  | ||||||
|       defaultValue: "pending", |  | ||||||
|       db: { map: "project_status" }, |  | ||||||
|       validation: { isRequired: true }, |  | ||||||
|       ui: { displayMode: "select" }, |  | ||||||
|     }), |  | ||||||
|  |  | ||||||
|     post: relationship({ ref: "Post" }), |  | ||||||
|  |  | ||||||
|     createdAt: timestamp({ |  | ||||||
|       defaultValue: { kind: "now" }, |  | ||||||
|     }), |  | ||||||
|   }, |  | ||||||
| }); |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| { |  | ||||||
|   "compilerOptions": { |  | ||||||
|     "target": "esnext", |  | ||||||
|     "module": "commonjs", |  | ||||||
|     "strict": true, |  | ||||||
|     "noEmit": true, |  | ||||||
|     "esModuleInterop": true, |  | ||||||
|     "forceConsistentCasingInFileNames": true, |  | ||||||
|   }, |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user