Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,10 @@ NEXT_PUBLIC_BASE_URL=http://localhost:3000
### Launch the app

Then install dependencies using `npm install`, run the dev server using `npm run dev`

### Generate seeds

If you want to generate random seed data, you can use the hasura console to export the Skill table to JSON
Then move it to `hasura/seeds/Skill.json`
You can now run `npm run seeds:generate`
And `npm run seeds:apply` to apply the random data to the database
2 changes: 2 additions & 0 deletions hasura/seeds/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Skill.json
seeds.sql
32 changes: 32 additions & 0 deletions hasura/seeds/Agency.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[
{
"name": "Paris"
},
{
"name": "Nantes"
},
{
"name": "Singapore"
},
{
"name": "Bordeaux"
},
{
"name": "Brest"
},
{
"name": "Montreal"
},
{
"name": "Grenoble"
},
{
"name": "Lyon"
},
{
"name": "Rennes"
},
{
"name": "Lille"
}
]
34 changes: 34 additions & 0 deletions hasura/seeds/Category.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
[
{
"index": 1,
"color": "yellow",
"label": "languages-and-frameworks",
"x": "left",
"y": "top",
"id": "89780de3-4a4c-40c2-bcdf-b5d15a48437a"
},
{
"index": 2,
"color": "violet",
"label": "platforms",
"x": "right",
"y": "top",
"id": "06420261-3e78-4a91-bc6a-1a52cad5d6a1"
},
{
"index": 3,
"color": "blue",
"label": "tools",
"x": "left",
"y": "bot",
"id": "c3341edb-3c1f-4e3d-bf89-8e795eb13690"
},
{
"index": 4,
"color": "cyan",
"label": "technics-and-methods",
"x": "right",
"y": "bot",
"id": "89f5e9a5-5ce6-416c-bed9-dd736546aa7f"
}
]
58 changes: 58 additions & 0 deletions hasura/seeds/Topic.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
[
{
"name": "Frontend",
"id": "71c8f42c-7182-444d-8133-3a3a52ae7912"
},
{
"name": "Backend",
"id": "16198ae7-40bb-4fcd-ae5d-ce371902dce2"
},
{
"name": "Agilité",
"id": "5a83e55d-22f2-428a-a5e2-effade6b6be5"
},
{
"name": "Maker",
"id": "b53a5cdb-6269-4965-ae5b-f42c9611664f"
},
{
"name": "Réseau",
"id": "817e3dae-01da-446a-920b-a3a5a9f57bea"
},
{
"name": "Web",
"id": "7e8e6f07-7844-4c1f-aa91-1dda49555ee3"
},
{
"name": "Security",
"id": "eb4edee0-9351-4fce-b04f-acbee63634b0"
},
{
"name": "Microservices",
"id": "c42d872f-227e-49ce-8a97-2af8aa021fbd"
},
{
"name": "Network",
"id": "6be68073-0f12-42bc-9835-07f8e81ea4a3"
},
{
"name": "Ops",
"id": "2117fd9e-bda8-4b0a-b1f1-6ea68bca3443"
},
{
"name": "DevOps",
"id": "7ee06efb-f337-4541-b160-10e35cd5b574"
},
{
"name": "IA",
"id": "5451823f-965c-40e7-85db-05ff8c7a370d"
},
{
"name": "Data",
"id": "fa4af642-a890-4966-9224-2c607807ef68"
},
{
"name": "Mobile",
"id": "c80dbcaa-b6d5-42fb-b375-0bb3146fcbbe"
}
]
141 changes: 141 additions & 0 deletions hasura/seeds/seedscript.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import { writeFile } from "fs/promises";
import { datatype, date, image, name, random } from "faker";
import newJsonSql from "json-sql";

const jsonSql = newJsonSql();
jsonSql.configure({
dialect: "postgresql",
wrappedIdentifiers: true,
separatedValues: false,
});

type Agency = { name: string };
type Skill = { id: string; name: string; categoryId: string };

const agencies: Agency[] = require("./Agency.json");
const categories = require("./Category.json");
const skills: Skill[] = require("./Skill.json");
const topics = require("./Topic.json");

type User = {
email: string;
name: string;
picture: string;
};

type UserAgency = {
userEmail: string;
agency: string;
created_at: string;
};

type UserSkillDesire = {
userEmail: string;
skillId: string;
skillLevel: number;
desireLevel: number;
created_at: string;
};

const config = {
nbUser: 500,
nbSkillEntriesPerUser: 30,
dateStart: "2020/01/01",
dateEnd: "2021/12/30",
};

const users: User[] = [];
const userSkillDesires: UserSkillDesire[] = [];
const userAgencies: UserAgency[] = [];

const generateUniqueDate = (
source: UserSkillDesire[],
userEmail: string,
skillid: string
) => {
let proposedDate = "";
do {
proposedDate = date
.between(config.dateStart, config.dateEnd)
.toISOString()
.split("T")[0];
} while (
source.find(
(row) =>
row.userEmail === userEmail &&
row.skillId === skillid &&
row.created_at === proposedDate
)
);
return proposedDate;
};

const generateUser = (): User => {
const firstName = name.firstName().replace("'", "");
const lastName = name.lastName().replace("'", "");
return {
email: `${firstName.toLowerCase()}.${lastName.toLowerCase()}@zenika.com`,
name: `${firstName} ${lastName}`,
picture: image.avatar(),
};
};

const generateUserAgency = (userEmail: string): UserAgency => {
return {
userEmail,
agency: random.arrayElement(agencies).name,
created_at: "2020/01/01",
};
};

const generateUserSkillAndDesire = (
userEmail: string
): UserSkillDesire => {
const skillId =
skills[datatype.number({ min: 0, max: skills.length - 1 })].id;
const created_at = generateUniqueDate(userSkillDesires, userEmail, skillId);
return {
userEmail,
skillId,
skillLevel: datatype.number({ min: 1, max: 5 }),
desireLevel: datatype.number({ min: 1, max: 5 }),
created_at,
};
};

for (let i = 0; i < config.nbUser; ++i) {
const user = generateUser();
users.push(user);
userAgencies.push(generateUserAgency(user.email));
for (let k = 0; k < config.nbSkillEntriesPerUser; ++k) {
const generatedSkillAndDesire = generateUserSkillAndDesire(user.email);
userSkillDesires.push(generatedSkillAndDesire);
}
}

const userInsertQuery = jsonSql.build({
type: "insert",
table: "User",
values: users,
});

const userAgenciesInsertQuery = jsonSql.build({
type: "insert",
table: "UserAgency",
values: userAgencies,
});

const userSkillsInsertQuery = jsonSql.build({
type: "insert",
table: "UserSkillDesire",
values: userSkillDesires,
});

const result = `${userInsertQuery.query}
${userAgenciesInsertQuery.query}
${userSkillsInsertQuery.query}`;

(async () => {
await writeFile("./hasura/seeds/seeds.sql", result);
console.log("Seeds succesfully generated into hasura/seeds/seeds.sql file");
})();
2 changes: 1 addition & 1 deletion next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const runtimeCaching = require("next-pwa/cache");

module.exports = withPWA({
images: {
domains: ["lh3.googleusercontent.com"],
domains: ["lh3.googleusercontent.com", "cdn.fakercloud.com"],
},
pwa: {
dest: "public",
Expand Down
Loading