Skip to content
This repository was archived by the owner on Dec 26, 2023. It is now read-only.

Commit 59d342e

Browse files
authored
✨ [Issue-6] Build Data model for Home Page (#8)
* 🔧 small update to data generation: keep logical link between name and username * 📝 add note regarding user during seed creation * 🎉 [Issue-6] Build Home Page data - add Open Graph component - add Statement component - add Link component - add Current Status component - add news_ticker to Home Page - add missions to Home Page - add values to Home Page - add goals to Home Page - add heading to Home Page - add sub_heading to Home Page - add current_status to Home Page * 🔨 👽 Seeding Home Page - fill Home Page - add uploadFile util * [issue-6] Remove `home-page: true` indicator such as Single Collection always has only 1 object
1 parent 30fb4fc commit 59d342e

File tree

15 files changed

+422
-19
lines changed

15 files changed

+422
-19
lines changed

cms/src/_seed/helpers.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const { APPLICATION_COLLECTION_TYPE_UIDS } = require('./constants');
2+
const { statSync } = require('fs');
23

34
/**
45
* @param {Strapi} strapi
@@ -47,9 +48,42 @@ const sampleSize = (arr, num = Math.floor(Math.random() * arr.length)) => {
4748
return shuffled.slice(0, num);
4849
}
4950

51+
/**
52+
* @param {Strapi} strapi
53+
* @param {Object} data
54+
* @param {Object} file
55+
* @returns {Promise<{ id }>}
56+
*/
57+
const uploadFile = async (strapi, {
58+
data,
59+
file,
60+
}) => {
61+
const { refId, ref, field } = data
62+
const { name, path, type } = file
63+
64+
const fileStat = statSync(path);
65+
66+
const [uploadedFile] = await strapi.plugins.upload.services.upload.upload({
67+
data: {
68+
refId,
69+
ref,
70+
field
71+
},
72+
files: {
73+
path,
74+
name,
75+
type,
76+
size: fileStat.size,
77+
},
78+
});
79+
80+
return uploadedFile
81+
}
82+
5083
module.exports = {
5184
ensureSQLite,
5285
randomBoolean,
5386
clearData,
54-
sampleSize
87+
sampleSize,
88+
uploadFile,
5589
}

cms/src/_seed/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { seedUserExists, generateUserData } = require('./user');
22
const { clearData } = require('./helpers');
33
const { generatePartnerData } = require('./partner');
44
const { generateProjectAndContributorData } = require('./project-and-contributor');
5+
const { fillHomePage } = require('./pages');
56

67
/**
78
* @param {Strapi} strapi
@@ -35,6 +36,14 @@ const generateSeedData = async (strapi) => {
3536
throw new Error(e)
3637
})
3738

39+
// Pages
40+
await Promise.all([
41+
fillHomePage(strapi),
42+
]).catch(e => {
43+
console.error('error during generating page data! Stopping the application...')
44+
throw new Error(e)
45+
})
46+
3847
console.log('generating seed data has been finished successfully!')
3948
}
4049

cms/src/_seed/media/d_d-dark.jpeg

6.74 KB
Loading

cms/src/_seed/media/d_d-light.jpeg

39.4 KB
Loading

cms/src/_seed/pages/home-page.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
const { join } = require('path')
2+
const { uploadFile } = require('../helpers');
3+
4+
/**
5+
* @param {Strapi} strapi
6+
* @returns {Promise<void>}
7+
*/
8+
const fillHomePage = async (strapi) => {
9+
console.log('filling home page...')
10+
11+
let homePageObject = await strapi.entityService.findMany('api::home-page.home-page', {})
12+
13+
if (!homePageObject) {
14+
homePageObject = await strapi.entityService.create('api::home-page.home-page', {
15+
data: {
16+
heading: 'tmp_required_value',
17+
publishedAt: new Date().toISOString()
18+
}
19+
})
20+
}
21+
22+
const logoPath = join(__dirname, '../media/d_d-dark.jpeg')
23+
const logo = await uploadFile(strapi, {
24+
data: {
25+
refId: homePageObject.id,
26+
ref: 'api::home-page.home-page',
27+
field: 'logo',
28+
},
29+
file: {
30+
path: logoPath,
31+
name: 'd_d-dark.jpeg',
32+
type: 'image/jpeg'
33+
},
34+
})
35+
36+
console.log('logo for Footer has been created!')
37+
38+
const partners = (await strapi.entityService.findMany('api::partner.partner', {
39+
limit: 5
40+
})).map(partner => partner.id)
41+
42+
await strapi.entityService.update('api::home-page.home-page', homePageObject.id, {
43+
data: {
44+
heading: 'Build web3 with friends.',
45+
sub_heading: 'Developer DAO is a community of thousand of web3 builders creating a better internet. Join us and create the future.',
46+
news_ticker: [{
47+
name: 'membership',
48+
title: 'MEMBERSHIP_OPEN!',
49+
description: 'Good luck getting the DAO NFT!'
50+
}, {
51+
name: 'status',
52+
title: 'Current Status: Season 0',
53+
description: 'GM frens!'
54+
}],
55+
values: [{
56+
name: 'transparency',
57+
title: 'Transparency',
58+
description: 'Open Source Everything, Conversations In Public, Document And Share Journey',
59+
}, {
60+
name: 'diversity_inclusion',
61+
title: 'Diversity and Inclusion',
62+
description: 'Seek To Foster As Diverse A Membership As Possible And Support Everyone To Contribute',
63+
}, {
64+
name: 'responsibility',
65+
title: 'Responsibility',
66+
description: 'As A Self-governed Community We Rely On Members To Be Personally Responsible For Their Actions And Commitments To The Community',
67+
}, {
68+
name: 'kindness_empathy',
69+
title: 'Kindness and Empathy',
70+
description: 'We Know That We Are Living In A Complex, Stressful, And Diverse World And Go Out Of Our Way To Make People’s Lives And Days Better Through Our Interactions',
71+
}],
72+
mission: 'Developer DAO exists to accelerate the education and impact of a new wave of web3 builders.',
73+
goals: [{
74+
name: 'goal_1',
75+
title: 'goal_1',
76+
description: 'Onboard, Educate & Support Web3 Developers'
77+
}, {
78+
name: 'goal_2',
79+
title: 'goal_2',
80+
description: 'Foster & Build Web3 Tools & Public Goods'
81+
}],
82+
partners,
83+
footer: {
84+
logo: logo.id,
85+
useful_links: [{
86+
name: 'developerdao_wiki',
87+
title: 'Wiki',
88+
link: 'https://developerdao.notion.site/developerdao/Developer-DAO-Wiki-eff4dcb00bef46fbaa93e9e4cf940e2e',
89+
}, {
90+
name: 'developerdao_forum',
91+
title: 'Forum',
92+
link: 'https://forum.developerdao.com/',
93+
}],
94+
discover: [{
95+
name: 'developerdao_blog',
96+
title: 'Blog',
97+
link: 'https://developerdao.notion.site/Newsletter-d9c971f2bea446338624042ea20547f9'
98+
}],
99+
social: [{
100+
name: 'twitter',
101+
title: 'Twitter',
102+
link: 'https://twitter.com/developer_dao',
103+
type: 'social'
104+
}]
105+
},
106+
meta_og: {
107+
title: 'The Developer DAO',
108+
description: 'Building web3 with friends',
109+
image: 'https://www.developerdao.com/D_D_logo-dark.svg',
110+
image_media: logo.id
111+
},
112+
current_status: {
113+
statement: {
114+
name: 'season_0',
115+
title: 'Current Status: Season 0',
116+
description: 'We’re forming guilds, creating culture, strengthening our community, teaching & learning, and building cool things together.'
117+
},
118+
link: {
119+
name: 'snapshot',
120+
title: 'Read our snapshot',
121+
link: 'https://developerdao.notion.site/How-to-use-Snapshot-32692309faf446ddb2a898f22050fb5f#05f55b4052c044169402a443b36945ff'
122+
}
123+
}
124+
}
125+
})
126+
127+
console.log('home page has been filled successfully!')
128+
}
129+
130+
module.exports = {
131+
fillHomePage,
132+
}

cms/src/_seed/pages/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const { fillHomePage } = require('./home-page')
2+
3+
module.exports = {
4+
fillHomePage
5+
}

cms/src/_seed/partner.js

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const { faker } = require('@faker-js/faker');
2-
const { randomBoolean } = require('./helpers');
2+
const { randomBoolean, uploadFile } = require('./helpers');
3+
const { join } = require('path');
34

45
/**
56
* @param {Strapi} strapi
@@ -11,29 +12,58 @@ const generatePartnerData = async (strapi) => {
1112
const { DEV_SEED_DATA_PARTNERS } = process.env
1213
const partnersSize = DEV_SEED_DATA_PARTNERS ? parseInt(DEV_SEED_DATA_PARTNERS) : 5
1314

15+
const logoLight = await uploadFile(strapi, {
16+
data: {
17+
refId: Date.now(),
18+
ref: 'api::partner.partner',
19+
field: 'logo_light',
20+
},
21+
file: {
22+
path: join(__dirname, './media/d_d-light.jpeg'),
23+
name: 'd_d-light.jpeg',
24+
type: 'image/jpeg'
25+
},
26+
})
27+
const logoDark = await uploadFile(strapi, {
28+
data: {
29+
refId: Date.now(),
30+
ref: 'api::partner.partner',
31+
field: 'logo_dark',
32+
},
33+
file: {
34+
path: join(__dirname, './media/d_d-dark.jpeg'),
35+
name: 'd_d-dark.jpeg',
36+
type: 'image/jpeg'
37+
},
38+
})
39+
1440
const bulkPartnerPromises = []
1541
const randomPartnersData = new Array(partnersSize).fill(null).map(_randomPartner)
1642

1743
for (const randomPartnerData of randomPartnersData) {
18-
const randomPartnerPromise = strapi.entityService.create('api::partner.partner', { data: randomPartnerData })
44+
const randomPartnerPromise = strapi.entityService.create('api::partner.partner', {
45+
data: {
46+
...randomPartnerData,
47+
logo_light: logoLight.id,
48+
logo_dark: logoDark.id,
49+
}
50+
})
1951
bulkPartnerPromises.push(randomPartnerPromise)
2052
}
2153

2254
await Promise.all(bulkPartnerPromises)
2355
}
2456

25-
const _randomPartner = () => ({
26-
name: faker.company.companyName(),
27-
website: faker.internet.url(),
28-
twitter_handle: faker.internet.userName().toLowerCase(),
29-
publishedAt: randomBoolean() ? new Date().toISOString() : null
30-
/**
31-
* "Media Library Upload" is only working via RestAPI, but when we generate seed data, no server is running
32-
* Skipping logos generation so far
33-
*/
34-
// logo_dark
35-
// logo_light
36-
})
57+
const _randomPartner = () => {
58+
const name = faker.company.companyName()
59+
60+
return {
61+
name,
62+
website: faker.internet.url(),
63+
twitter_handle: faker.internet.userName(name).toLowerCase(),
64+
publishedAt: randomBoolean() ? new Date().toISOString() : null
65+
}
66+
}
3767

3868
module.exports = {
3969
generatePartnerData

cms/src/_seed/project-and-contributor.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,11 @@ const generateProjectAndContributorData = async (strapi) => {
4040
}
4141

4242
const _randomProject = () => {
43-
const username = faker.internet.userName().toLowerCase()
43+
const name = faker.company.companyName()
44+
const username = faker.internet.userName(name).toLowerCase()
4445

4546
return {
46-
name: faker.company.companyName(),
47+
name,
4748
hero_image: faker.image.avatar(),
4849
description_short: faker.company.bs(),
4950
description_long: faker.lorem.paragraph(),
@@ -55,10 +56,11 @@ const _randomProject = () => {
5556
}
5657

5758
const _randomContributor = () => {
58-
const username = faker.internet.userName().toLowerCase()
59+
const name = faker.name.findName()
60+
const username = faker.internet.userName(name).toLowerCase()
5961

6062
return {
61-
name: faker.name.findName(),
63+
name,
6264
ens_name: `${ username }.eth`,
6365
twitter_handle: username,
6466
discord_handle: `${ username }#${ faker.random.numeric(4) }`,

cms/src/_seed/user.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ const seedUserExists = async (strapi) => {
1818
* @returns {Promise<void>}
1919
*/
2020
const createSeedUser = async (strapi) => {
21+
// TODO: needs update - cannot login with this API-created user
22+
// checkout how [user-permissions] plugin registers user via REST - jwt issuing required
23+
// https://github.com/strapi/strapi/blob/master/packages/plugins/users-permissions/server/controllers/auth.js#L239
24+
2125
const now = Date.now()
2226

2327
await strapi.entityService.create('plugin::users-permissions.user', {

cms/src/api/home-page/content-types/home-page/schema.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,47 @@
1616
"type": "relation",
1717
"relation": "oneToMany",
1818
"target": "api::partner.partner"
19+
},
20+
"heading": {
21+
"type": "string",
22+
"required": true
23+
},
24+
"sub_heading": {
25+
"type": "text"
26+
},
27+
"footer": {
28+
"type": "component",
29+
"repeatable": false,
30+
"component": "general.footer",
31+
"required": false
32+
},
33+
"mission": {
34+
"type": "text"
35+
},
36+
"values": {
37+
"type": "component",
38+
"repeatable": true,
39+
"component": "general.statement"
40+
},
41+
"goals": {
42+
"type": "component",
43+
"repeatable": true,
44+
"component": "general.statement"
45+
},
46+
"news_ticker": {
47+
"type": "component",
48+
"repeatable": true,
49+
"component": "general.statement"
50+
},
51+
"meta_og": {
52+
"type": "component",
53+
"repeatable": false,
54+
"component": "general.open-graph"
55+
},
56+
"current_status": {
57+
"type": "component",
58+
"repeatable": false,
59+
"component": "home-page.current-status"
1960
}
2061
}
2162
}

0 commit comments

Comments
 (0)