Files
landscape-template/prisma/seed/index.js

389 lines
11 KiB
JavaScript

const { PrismaClient } = require("@prisma/client");
const { generatePrivateKey, getPublicKey } = require("../../api/utils/nostr-tools");
const { categories, projects, tags, hackathons, roles, skills } = require("./data");
const Chance = require('chance');
const { getCoverImage, randomItems, random } = require("./helpers");
const chance = new Chance();
const prisma = new PrismaClient()
async function purge() {
await prisma.award.deleteMany();
await prisma.tag.deleteMany();
await prisma.vote.deleteMany();
await prisma.project.deleteMany();
await prisma.category.deleteMany();
}
async function generateNostrKeys() {
const allUsers = await prisma.user.findMany({
where: {
nostr_prv_key: null
}
})
for (const user of allUsers) {
const prvkey = generatePrivateKey();
const pubkey = getPublicKey(prvkey);
await prisma.user.update({
where: {
id: user.id,
},
data: {
nostr_prv_key: prvkey,
nostr_pub_key: pubkey
}
})
}
}
async function main() {
// console.log("Purging old data");
// await purge()
// await createCategories();
// await createTags();
// await createProjects();
// await createStories();
// await createHackathons();
// await fillUserKeysTable()
// await createRoles();
// await createSkills();
// await migrateOldImages();
}
async function migrateOldImages() {
console.log('Migrating old images data to HostedImage');
// Can't use prisma method createMany() for columns like Project.screenshots, because this method doesn't return created IDs.
/**
* Project
**/
const projects = await prisma.project.findMany({
select: {
id: true,
screenshots: true,
cover_image: true,
thumbnail_image: true
}
})
for (const project of projects) {
/**
* Project.screenshots to Project.screenshots_ids
**/
let projectScreenshotIds = [];
for (const screenshot of project.screenshots) {
let hostedImageId = await _insertInHostedImage(screenshot)
projectScreenshotIds.push(hostedImageId);
}
if (projectScreenshotIds.length > 0) {
await _updateObjectWithHostedImageId(prisma.project, project.id, {
screenshots_ids: projectScreenshotIds,
})
}
/**
* Project.cover_image to Project.cover_image_id
**/
if (project.cover_image) {
let hostedImageId = await _insertInHostedImage(project.cover_image)
await _updateObjectWithHostedImageId(prisma.project, project.id, {
cover_image_id: hostedImageId,
})
}
/**
* Project.thumbnail_image to Project.thumbnail_image_id
**/
if (project.cover_image) {
let hostedImageId = await _insertInHostedImage(project.thumbnail_image)
await _updateObjectWithHostedImageId(prisma.project, project.id, {
thumbnail_image_id: hostedImageId,
})
}
}
/**
* Category
**/
const categories = await prisma.category.findMany({
select: {
id: true,
cover_image: true,
}
})
for (const category of categories) {
if (category.cover_image) {
let hostedImageId = await _insertInHostedImage(category.cover_image)
await _updateObjectWithHostedImageId(prisma.category, category.id, {
cover_image_id: hostedImageId,
})
}
}
/**
* Award
**/
const awards = await prisma.award.findMany({
select: {
id: true,
image: true,
}
})
for (const award of awards) {
if (award.image) {
let hostedImageId = await _insertInHostedImage(award.image)
await _updateObjectWithHostedImageId(prisma.award, award.id, {
image_id: hostedImageId,
})
}
}
/**
* Hackaton
**/
const hackatons = await prisma.hackathon.findMany({
select: {
id: true,
cover_image: true,
}
})
for (const hackaton of hackatons) {
if (hackaton.cover_image) {
let hostedImageId = await _insertInHostedImage(hackaton.cover_image)
await _updateObjectWithHostedImageId(prisma.hackathon, hackaton.id, {
cover_image_id: hostedImageId,
})
}
}
/**
* Story
**/
const stories = await prisma.story.findMany({
select: {
id: true,
cover_image: true,
body: true,
}
})
for (const story of stories) {
/**
* Story.body to Story.body_image_ids
**/
let bodyImageIds = [];
const regex = /(?:!\[(.*?)\]\((.*?)\))/g
let match;
while((match = regex.exec(story.body))) {
const [,,value] = match
let hostedImageId = await _insertInHostedImage(value)
bodyImageIds.push(hostedImageId)
}
if (bodyImageIds.length > 0) {
await _updateObjectWithHostedImageId(prisma.story, story.id, {
body_image_ids: bodyImageIds,
})
}
/**
* Story.cover_image to Story.cover_image_id
**/
if (story.cover_image) {
let hostedImageId = await _insertInHostedImage(story.cover_image)
await _updateObjectWithHostedImageId(prisma.story, story.id, {
cover_image_id: hostedImageId,
})
}
}
/**
* User
**/
const users = await prisma.user.findMany({
select: {
id: true,
avatar: true,
}
})
for (const user of users) {
if (user.avatar) {
let hostedImageId = await _insertInHostedImage(user.avatar)
await _updateObjectWithHostedImageId(prisma.user, user.id, {
avatar_id: hostedImageId,
})
}
}
}
async function _insertInHostedImage(url){
const newHostedImage = await prisma.hostedImage.create({
data: {
filename: "default.png",
provider: "external",
provider_image_id: "",
url,
is_used: true
}
});
return newHostedImage.id;
}
async function _updateObjectWithHostedImageId(prismaObject, objectId, data){
await prismaObject.update({
where: { id: objectId },
data,
});
}
async function createCategories() {
console.log("Creating Categories");
await prisma.category.createMany({
data: categories.map(item => ({
id: item.id,
title: item.title,
cover_image: 'https://via.placeholder.com/1920x850.png?text=Category+Cover+Image',
icon: '🎭'
}))
})
}
async function createTags() {
console.log("Creating Tags");
await prisma.tag.createMany({
data: tags.map(item => ({
id: item.id,
title: item.title,
description: item.description,
isOfficial: item.isOfficial,
icon: item.icon,
}))
})
}
async function createProjects() {
console.log("Creating Projects");
for (let i = 0; i < projects.length; i++) {
const item = projects[i];
const { tags, ...feilds } = item
await prisma.project.create({
data: {
...feilds,
tags: {
connect: tags.map(t => ({
id: t.id
}))
},
description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.",
screenshots: Array(4).fill('https://via.placeholder.com/1280x729.png?text=Project+Screenshot')
}
})
}
}
async function createStories() {
console.log("Creating Stories");
const user = await prisma.user.findFirst();
for (let i = 0; i < 15; i++) {
const randomTags = randomItems(random(2, 5), tags)
await prisma.story.create({
data: {
body: chance.paragraph(),
excerpt: chance.paragraph({ sentences: 1 }),
title: chance.sentence({ words: chance.integer({ min: 3, max: 7 }) }),
cover_image: getCoverImage(),
is_published: true,
tags: {
connect: randomTags.map(t => ({ id: t.id }))
},
user_id: user.id,
votes_count: Math.floor(random(10, 6600)),
}
})
}
}
async function createHackathons() {
console.log("Creating Hackathons");
for (let i = 0; i < hackathons.length; i++) {
const item = hackathons[i];
const { tags, ...feilds } = item
await prisma.hackathon.create({
data: {
...feilds,
tags: {
connect: tags.map(t => ({
id: t.id
}))
},
description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.",
}
})
}
}
async function fillUserKeysTable() {
console.log('Filling Users Keys Table');
const allUsers = await prisma.user.findMany({
select: {
id: true,
pubKey: true,
}
})
await prisma.userKey.createMany({
data: allUsers.filter(u => !!u.pubKey).map(u => ({
key: u.pubKey,
user_id: u.id
}))
})
}
async function createRoles() {
console.log("Creating Users Roles");
await prisma.workRole.createMany({
data: roles.map(item => ({
id: item.id,
title: item.title,
icon: item.icon,
}))
})
}
async function createSkills() {
console.log("Creating Users Skills");
await prisma.skill.createMany({
data: skills.map(item => ({
id: item.id,
title: item.title,
}))
})
}
main()
.catch((e) => {
console.error(e)
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})