Add subcategories for places - seed
Some checks failed
CI / main (push) Failing after 3m7s

This commit is contained in:
Broks Randolfs Gailītis 2025-03-15 19:22:32 +02:00
parent 30db53bd95
commit 0577555198
5 changed files with 124 additions and 22 deletions

View File

@ -0,0 +1,10 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.seed = async function (knex) {
await knex('places').del();
await knex('subcategories').del();
await knex('categories').del();
await knex('users').del();
};

View File

@ -1,10 +1,99 @@
const CATEGORIES = require('./categories.json'); const { randomUUID } = require("crypto");
const CUISINES = [
"american",
"argentinian",
"armenian",
"asian",
"bakery",
"bar_grill",
"barbecue",
"bavarian",
"bbq",
"belgian",
"bistro",
"breakfast",
"bubble_tea",
"burger",
"cake",
"caucasian",
"chicken",
"chinese",
"chocolate",
"coffee",
"coffee_shop",
"czech",
"dessert",
"donut",
"eclair",
"european",
"falafel",
"fast_food",
"fine_dining",
"fish",
"french",
"fries",
"fusion",
"georgian",
"grill",
"ice_cream",
"indian",
"international",
"italian",
"italian_pizza",
"japanese",
"jewish",
"kebab",
"korean",
"latvian",
"local",
"lunch",
"meat",
"mediterranean",
"mexican",
"oriental",
"oyster",
"pancake",
"pastry",
"pizza",
"ramen",
"regional",
"russian",
"sandwich",
"savory_pancakes",
"seafood",
"soup",
"soviet",
"steak_house",
"sushi",
"tapas",
"tea",
"traditional",
"turkish",
"ukrainian",
"uzbek",
"vietnamese",
"waffle"
]
const CATEGORIES = [
{ id: randomUUID(), name: 'restaurant', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'cafe', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'bar', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'pub', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'biergarten', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'fast_food', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'food_court', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
{ id: randomUUID(), name: 'ice_cream', subcategories: CUISINES.map(name => ({ id: randomUUID(), name })) },
];
exports.CATEGORIES = CATEGORIES;
/** /**
* @param { import("knex").Knex } knex * @param { import("knex").Knex } knex
* @returns { Promise<void> } * @returns { Promise<void> }
*/ */
exports.seed = async function (knex) { exports.seed = async function (knex) {
await knex('categories').del() await knex('categories').insert(CATEGORIES.map(({ name, id }) => ({ name, id })));
await knex('categories').insert(CATEGORIES.map(({name}) => ({name}))); await knex('subcategories').insert(CATEGORIES.flatMap(({ subcategories, id }) => subcategories.map((s) => ({ id: s.id, name: s.name, category_id: id }))));
}; };

View File

@ -1,10 +0,0 @@
[
{ "name": "restaurant", "subcategories": [] },
{ "name": "cafe", "subcategories": [] },
{ "name": "bar", "subcategories": [] },
{ "name": "pub", "subcategories": [] },
{ "name": "biergarten", "subcategories": [] },
{ "name": "fast_food", "subcategories": [] },
{ "name": "food_court", "subcategories": [] },
{ "name": "ice_cream", "subcategories": [] }
]

View File

@ -1,5 +1,6 @@
const { fakerLV : faker } = require('@faker-js/faker'); const { fakerLV : faker } = require('@faker-js/faker');
// const CATEGORIES = require('./categories.json'); const { CATEGORIES } = require('./categories.js');
const { randomUUID } = require('crypto');
const PLACE_COUNT = 1000; const PLACE_COUNT = 1000;
const BBOX_RIGA = [23.755875,56.815914,24.466553,57.067617]; const BBOX_RIGA = [23.755875,56.815914,24.466553,57.067617];
const [ BBOX_MIN_LAT, BBOX_MIN_LON, BBOX_MAX_LAT, BBOX_MAX_LON ] = BBOX_RIGA; const [ BBOX_MIN_LAT, BBOX_MIN_LON, BBOX_MAX_LAT, BBOX_MAX_LON ] = BBOX_RIGA;
@ -10,8 +11,6 @@ const [ BBOX_MIN_LAT, BBOX_MIN_LON, BBOX_MAX_LAT, BBOX_MAX_LON ] = BBOX_RIGA;
*/ */
exports.seed = async function(knex) { exports.seed = async function(knex) {
const categories = await knex('categories').select('id');
const createPlace = () => { const createPlace = () => {
const coords = [ const coords = [
faker.location.latitude({ min: BBOX_MIN_LAT, max: BBOX_MAX_LAT }), faker.location.latitude({ min: BBOX_MIN_LAT, max: BBOX_MAX_LAT }),
@ -19,6 +18,7 @@ exports.seed = async function(knex) {
]; ];
return { return {
id: randomUUID(),
name: faker.company.name(), name: faker.company.name(),
coordinates: knex.raw('ST_SetSRID(ST_MakePoint(?, ?), 4326)', coords), coordinates: knex.raw('ST_SetSRID(ST_MakePoint(?, ?), 4326)', coords),
country: 'LV', country: 'LV',
@ -28,13 +28,27 @@ exports.seed = async function(knex) {
street: faker.location.street(), street: faker.location.street(),
house: faker.helpers.maybe(() => faker.person.lastName(), { probability: 0.1 }) || faker.location.buildingNumber(), house: faker.helpers.maybe(() => faker.person.lastName(), { probability: 0.1 }) || faker.location.buildingNumber(),
postalCode: faker.location.zipCode(), postalCode: faker.location.zipCode(),
category_id: faker.helpers.arrayElement(categories.map(c => c.id)), category_id: faker.helpers.arrayElement(CATEGORIES.map(c => c.id)),
} }
}; };
const places = new Array(PLACE_COUNT).fill(() => createPlace()).map((fn, i) => fn(i)); const places = new Array(PLACE_COUNT).fill(() => createPlace()).map((fn, i) => fn(i));
// Deletes ALL existing entries const placeSubcategories = places.flatMap(place => {
await knex('places').del() const options = CATEGORIES.find(category => category.id === place.category_id).subcategories;
const subcategoryCount = faker.number.int({ min: 0, max: 4 });
const subcategories = new Set();
for (let i = 0; i <= subcategoryCount; i++) {
subcategories.add(faker.helpers.arrayElement(options));
}
return Array.from(subcategories).map(subcategory => ({
place_id: place.id,
subcategory_id: subcategory.id
}));
});
await knex('places').insert(places); await knex('places').insert(places);
await knex('place_subcategories').insert(placeSubcategories);
}; };

View File

@ -21,7 +21,6 @@ exports.seed = async function(knex) {
} }
}; };
await knex('users').del()
await knex('users').insert([ await knex('users').insert([
createUser({ createUser({
first_name: 'Broks Randolfs', first_name: 'Broks Randolfs',