Add fourth lecture projects
This commit is contained in:
parent
b84e183651
commit
8e5912fcf9
6
lecture_4/dinosaurs-without-db/.prettierrc.json
Normal file
6
lecture_4/dinosaurs-without-db/.prettierrc.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"useTabs": true,
|
||||||
|
"printWidth": 120,
|
||||||
|
"tabWidth": 4
|
||||||
|
}
|
||||||
30
lecture_4/dinosaurs-without-db/dinosaurs.http
Normal file
30
lecture_4/dinosaurs-without-db/dinosaurs.http
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
### List all dinosaurs
|
||||||
|
GET http://localhost:3000/dinosaurs
|
||||||
|
|
||||||
|
### Get one dinosaur
|
||||||
|
GET http://localhost:3000/dinosaurs/1
|
||||||
|
|
||||||
|
### Create a dinosaur
|
||||||
|
POST http://localhost:3000/dinosaurs
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Triceratops",
|
||||||
|
"description" : "Triceratops (neboli „třírohá tvář“) …",
|
||||||
|
"period": "křída",
|
||||||
|
"wikipediaAddress": "https://cs.wikipedia.org/wiki/Triceratops"
|
||||||
|
}
|
||||||
|
|
||||||
|
### Replace a dinosaur
|
||||||
|
PUT http://localhost:3000/dinosaurs/1
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Tyrannosaurus",
|
||||||
|
"description": "Tyrannosaurus …",
|
||||||
|
"period": "křída",
|
||||||
|
"wikipediaAddress": "https://en.wikipedia.org/wiki/Tyrannosaurus"
|
||||||
|
}
|
||||||
|
|
||||||
|
### Delete a dinosaur
|
||||||
|
DELETE http://localhost:3000/dinosaurs/1
|
||||||
24
lecture_4/dinosaurs-without-db/eslint.config.js
Normal file
24
lecture_4/dinosaurs-without-db/eslint.config.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import js from "@eslint/js";
|
||||||
|
import globals from "globals";
|
||||||
|
import json from "@eslint/json";
|
||||||
|
import { defineConfig } from "eslint/config";
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
{
|
||||||
|
ignores: ["node_modules/**", "package-lock.json"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: ["**/*.{js,mjs,cjs}"],
|
||||||
|
plugins: { js },
|
||||||
|
extends: ["js/recommended"],
|
||||||
|
languageOptions: { globals: globals.node, ecmaVersion: 2025 },
|
||||||
|
rules: {
|
||||||
|
indent: ["error", "tab"],
|
||||||
|
"linebreak-style": ["error", "unix"],
|
||||||
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
|
||||||
|
quotes: ["error", "double"],
|
||||||
|
semi: ["error", "always"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ files: ["**/*.json"], plugins: { json }, language: "json/json", extends: ["json/recommended"] },
|
||||||
|
]);
|
||||||
136
lecture_4/dinosaurs-without-db/index.js
Normal file
136
lecture_4/dinosaurs-without-db/index.js
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
import express from "express";
|
||||||
|
|
||||||
|
// This array acts as temporary storage, so all changes are lost when the server restarts.
|
||||||
|
const DINOSAURS = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "Tyrannosaurus",
|
||||||
|
description:
|
||||||
|
"Tyrannosaurus („tyranský ještěr“ – odvozeno ze starořeckého τύραννος – tyrannos = vládce, resp. krutovládce; v případě druhu T. rex pak latinského rex = král) byl jeden z největších masožravých dinosaurů (teropodů) a zároveň jedním z největších suchozemských predátorů všech dob.",
|
||||||
|
period: "křída",
|
||||||
|
wikipediaAddress: "https://cs.wikipedia.org/wiki/Tyrannosaurus",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: "Stegosaurus",
|
||||||
|
description:
|
||||||
|
"Stegosaurus („zastřešený ještěr“) byl rod ptakopánvého dinosaura, který žil v období pozdní jury (asi před 150 miliony let) na území Severní Ameriky. Jeho pojmenování znamená „střechovitý či zastřešený ještěr“, toto označení dostal podle plochých desek, menší měl na krku a větší na hřbetě a přední části ocasu.",
|
||||||
|
period: "jura",
|
||||||
|
wikipediaAddress: "https://cs.wikipedia.org/wiki/Stegosaurus",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: "Iguanodon",
|
||||||
|
description:
|
||||||
|
"Iguanodon (z latiny: „leguání zub“, český název je také iguanodon) je rod ornitopodního dinosaura, který se vývojově nacházel někde mezi prvními hbitými dvounohými hypsilofodonty a kachnozobými dinosaury, jimiž věk ornitopodů vrcholil.",
|
||||||
|
period: "křída",
|
||||||
|
wikipediaAddress: "https://cs.wikipedia.org/wiki/Iguanodon",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
name: "Velociraptor",
|
||||||
|
description:
|
||||||
|
"Velociraptor byl rod poměrně malého teropodního dinosaura, patřícího mezi dravé dromeosauridy. Byl zástupcem skupiny velociraptorinů, menších „srpodrápých“ teropodů, obývajících severní kontinenty v období pozdní křídy.",
|
||||||
|
period: "křída",
|
||||||
|
wikipediaAddress: "https://cs.wikipedia.org/wiki/Velociraptor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
name: "Brontosaurus",
|
||||||
|
description:
|
||||||
|
"Brontosaurus (z řec. βροντή, brontē = hrom + σαυρος, sauros = ještěr: „hřmotný ještěr“ či „hromový ještěr“) byl rod velkého sauropodního dinosaura z čeledi Diplodocidae. Žil v období svrchní jury, asi před 155 až 152 miliony let na území západu Severní Ameriky.",
|
||||||
|
period: "jura",
|
||||||
|
wikipediaAddress: "https://cs.wikipedia.org/wiki/Brontosaurus_(dinosaurus)",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const port = Number(process.env.PORT ?? 3000);
|
||||||
|
|
||||||
|
app.use(express.json());
|
||||||
|
|
||||||
|
// Return the complete in-memory collection.
|
||||||
|
app.get("/dinosaurs", (_request, response) => {
|
||||||
|
response.json(DINOSAURS);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get("/dinosaurs/:id", (request, response) => {
|
||||||
|
const dinosaurId = Number(request.params.id);
|
||||||
|
|
||||||
|
const dinosaur = DINOSAURS.find((dinosaur) => dinosaur.id === dinosaurId);
|
||||||
|
|
||||||
|
if (!dinosaur) {
|
||||||
|
return response.status(404).json({
|
||||||
|
message: "Dinosaur not found",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
response.json(dinosaur);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post("/dinosaurs", (request, response) => {
|
||||||
|
const dinosaur = request.body;
|
||||||
|
|
||||||
|
if (!dinosaur.name || !dinosaur.period) {
|
||||||
|
return response.status(400).json({
|
||||||
|
message: "The name and period fields are required",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const existingDinosaurIds = DINOSAURS.map((existingDinosaur) => existingDinosaur.id);
|
||||||
|
const newDinosaurId = Math.max(0, ...existingDinosaurIds) + 1;
|
||||||
|
|
||||||
|
const newDinosaur = {
|
||||||
|
...dinosaur,
|
||||||
|
id: newDinosaurId,
|
||||||
|
};
|
||||||
|
|
||||||
|
DINOSAURS.push(newDinosaur);
|
||||||
|
|
||||||
|
response.status(201).json(newDinosaur);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.put("/dinosaurs/:id", (request, response) => {
|
||||||
|
const dinosaurId = Number(request.params.id);
|
||||||
|
const dinosaurBody = request.body;
|
||||||
|
|
||||||
|
if (!dinosaurBody.name || !dinosaurBody.period) {
|
||||||
|
return response.status(400).json({
|
||||||
|
message: "The name and period fields are required",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const dinosaurIndex = DINOSAURS.findIndex((dinosaur) => dinosaur.id === dinosaurId);
|
||||||
|
|
||||||
|
if (dinosaurIndex === -1) {
|
||||||
|
return response.status(404).json({
|
||||||
|
message: "Dinosaur not found",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
DINOSAURS[dinosaurIndex] = {
|
||||||
|
...dinosaurBody,
|
||||||
|
id: dinosaurId,
|
||||||
|
};
|
||||||
|
|
||||||
|
response.status(204).send();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.delete("/dinosaurs/:id", (request, response) => {
|
||||||
|
const dinosaurId = Number(request.params.id);
|
||||||
|
|
||||||
|
const dinosaurIndex = DINOSAURS.findIndex((dinosaur) => dinosaur.id === dinosaurId);
|
||||||
|
|
||||||
|
if (dinosaurIndex === -1) {
|
||||||
|
return response.status(404).json({
|
||||||
|
message: "Dinosaur not found",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
DINOSAURS.splice(dinosaurIndex, 1);
|
||||||
|
response.status(204).send();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`Server running on http://localhost:${port}`);
|
||||||
|
});
|
||||||
1639
lecture_4/dinosaurs-without-db/package-lock.json
generated
Normal file
1639
lecture_4/dinosaurs-without-db/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
21
lecture_4/dinosaurs-without-db/package.json
Normal file
21
lecture_4/dinosaurs-without-db/package.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "dinosaurs-without-db",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"format": "prettier --write .",
|
||||||
|
"check": "npm run lint && prettier --check ."
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^5.1.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/js": "^10.0.1",
|
||||||
|
"@eslint/json": "^1.2.0",
|
||||||
|
"eslint": "^10.0.0",
|
||||||
|
"globals": "^17.4.0",
|
||||||
|
"prettier": "^3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
5
lecture_4/employees-cli/.env.example
Normal file
5
lecture_4/employees-cli/.env.example
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
PGHOST="localhost"
|
||||||
|
PGPORT="5432"
|
||||||
|
PGDATABASE="rg_academy_dev"
|
||||||
|
PGUSER="rg_academy"
|
||||||
|
PGPASSWORD="rg_academy"
|
||||||
6
lecture_4/employees-cli/.prettierrc.json
Normal file
6
lecture_4/employees-cli/.prettierrc.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"useTabs": true,
|
||||||
|
"printWidth": 120,
|
||||||
|
"tabWidth": 4
|
||||||
|
}
|
||||||
7
lecture_4/employees-cli/db-client.js
Normal file
7
lecture_4/employees-cli/db-client.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import "dotenv/config";
|
||||||
|
import { Client } from "pg";
|
||||||
|
|
||||||
|
// The pg client reads PGHOST, PGPORT, PGDATABASE, PGUSER, and PGPASSWORD from the environment.
|
||||||
|
const client = new Client();
|
||||||
|
|
||||||
|
export default client;
|
||||||
25
lecture_4/employees-cli/departments-create.js
Normal file
25
lecture_4/employees-cli/departments-create.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import client from "./db-client.js";
|
||||||
|
import prompt from "prompt-sync";
|
||||||
|
|
||||||
|
const promptSync = prompt();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await client.connect();
|
||||||
|
|
||||||
|
const departmentName = promptSync("Enter the name of the department: ").trim();
|
||||||
|
|
||||||
|
if (!departmentName) {
|
||||||
|
throw new Error("Department name cannot be empty.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parameterized queries keep user input separate from SQL.
|
||||||
|
const result = await client.query("INSERT INTO department (name) VALUES ($1) RETURNING id, name", [departmentName]);
|
||||||
|
const newDepartment = result.rows[0];
|
||||||
|
|
||||||
|
console.log(`New department created with ID ${newDepartment.id}: ${newDepartment.name}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error.message);
|
||||||
|
process.exitCode = 1;
|
||||||
|
} finally {
|
||||||
|
await client.end();
|
||||||
|
}
|
||||||
19
lecture_4/employees-cli/departments-list.js
Normal file
19
lecture_4/employees-cli/departments-list.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import client from "./db-client.js";
|
||||||
|
|
||||||
|
try {
|
||||||
|
await client.connect();
|
||||||
|
const result = await client.query("SELECT id, name FROM department ORDER BY name");
|
||||||
|
|
||||||
|
if (result.rows.length === 0) {
|
||||||
|
console.log("No departments found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
result.rows.forEach((departmentRow) => {
|
||||||
|
console.log(`${departmentRow.id}: ${departmentRow.name}`);
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error.message);
|
||||||
|
process.exitCode = 1;
|
||||||
|
} finally {
|
||||||
|
await client.end();
|
||||||
|
}
|
||||||
40
lecture_4/employees-cli/departments-update.js
Normal file
40
lecture_4/employees-cli/departments-update.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import client from "./db-client.js";
|
||||||
|
import prompt from "prompt-sync";
|
||||||
|
|
||||||
|
const promptSync = prompt();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await client.connect();
|
||||||
|
|
||||||
|
const id = Number(promptSync("Enter the ID of the department you want to update: "));
|
||||||
|
const newName = promptSync("Enter the new name of the department: ").trim();
|
||||||
|
|
||||||
|
if (!Number.isInteger(id) || id <= 0) {
|
||||||
|
throw new Error("Department ID must be a positive integer.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newName) {
|
||||||
|
throw new Error("Department name cannot be empty.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// RETURNING avoids a separate query for checking whether the department exists.
|
||||||
|
const result = await client.query(
|
||||||
|
`UPDATE department
|
||||||
|
SET name = $1
|
||||||
|
WHERE id = $2
|
||||||
|
RETURNING id, name`,
|
||||||
|
[newName, id],
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result.rows.length === 0) {
|
||||||
|
throw new Error(`Department with ID ${id} not found.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Updated department:");
|
||||||
|
console.table(result.rows[0]);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error.message);
|
||||||
|
process.exitCode = 1;
|
||||||
|
} finally {
|
||||||
|
await client.end();
|
||||||
|
}
|
||||||
24
lecture_4/employees-cli/eslint.config.js
Normal file
24
lecture_4/employees-cli/eslint.config.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import js from "@eslint/js";
|
||||||
|
import globals from "globals";
|
||||||
|
import json from "@eslint/json";
|
||||||
|
import { defineConfig } from "eslint/config";
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
{
|
||||||
|
ignores: ["node_modules/**", "package-lock.json"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: ["**/*.{js,mjs,cjs}"],
|
||||||
|
plugins: { js },
|
||||||
|
extends: ["js/recommended"],
|
||||||
|
languageOptions: { globals: globals.node, ecmaVersion: 2025 },
|
||||||
|
rules: {
|
||||||
|
indent: ["error", "tab"],
|
||||||
|
"linebreak-style": ["error", "unix"],
|
||||||
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
|
||||||
|
quotes: ["error", "double"],
|
||||||
|
semi: ["error", "always"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ files: ["**/*.json"], plugins: { json }, language: "json/json", extends: ["json/recommended"] },
|
||||||
|
]);
|
||||||
1072
lecture_4/employees-cli/package-lock.json
generated
Normal file
1072
lecture_4/employees-cli/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
25
lecture_4/employees-cli/package.json
Normal file
25
lecture_4/employees-cli/package.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "employees-cli",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"departments:create": "node departments-create.js",
|
||||||
|
"departments:list": "node departments-list.js",
|
||||||
|
"departments:update": "node departments-update.js",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"format": "prettier --write .",
|
||||||
|
"check": "npm run lint && prettier --check ."
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^17.4.2",
|
||||||
|
"pg": "^8.11.3",
|
||||||
|
"prompt-sync": "^4.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/js": "^10.0.1",
|
||||||
|
"@eslint/json": "^1.2.0",
|
||||||
|
"eslint": "^10.0.0",
|
||||||
|
"globals": "^17.4.0",
|
||||||
|
"prettier": "^3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
28
lecture_4/employees-cli/schema.sql
Normal file
28
lecture_4/employees-cli/schema.sql
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
-- Department table
|
||||||
|
CREATE TABLE department (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(256) NOT NULL UNIQUE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Employee table
|
||||||
|
CREATE TABLE employee (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
first_name VARCHAR(256) NOT NULL,
|
||||||
|
last_name VARCHAR(256) NOT NULL,
|
||||||
|
age INTEGER NOT NULL,
|
||||||
|
department_id INTEGER NOT NULL,
|
||||||
|
FOREIGN KEY (department_id) REFERENCES department(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Insert sample data into department table
|
||||||
|
INSERT INTO department (name) VALUES ('Vývoj');
|
||||||
|
INSERT INTO department (name) VALUES ('Obchod');
|
||||||
|
INSERT INTO department (name) VALUES ('Marketing');
|
||||||
|
|
||||||
|
-- Insert sample data into employee table
|
||||||
|
INSERT INTO employee (first_name, last_name, age, department_id)
|
||||||
|
VALUES ('Patrik', 'Moravec', 56, (SELECT id FROM department WHERE name = 'Obchod'));
|
||||||
|
INSERT INTO employee (first_name, last_name, age, department_id)
|
||||||
|
VALUES ('David', 'Sedláček', 29, (SELECT id FROM department WHERE name = 'Obchod'));
|
||||||
|
INSERT INTO employee (first_name, last_name, age, department_id)
|
||||||
|
VALUES ('Johana', 'Beranová', 52, (SELECT id FROM department WHERE name = 'Vývoj'));
|
||||||
5
lecture_5/.prettierrc.json
Normal file
5
lecture_5/.prettierrc.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"useTabs": true,
|
||||||
|
"printWidth": 120
|
||||||
|
}
|
||||||
23
lecture_5/eslint.config.js
Normal file
23
lecture_5/eslint.config.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import js from "@eslint/js";
|
||||||
|
import globals from "globals";
|
||||||
|
import json from "@eslint/json";
|
||||||
|
import { defineConfig } from "eslint/config";
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
{
|
||||||
|
ignores: ["node_modules/**", "package-lock.json"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: ["**/*.{js,mjs,cjs}"],
|
||||||
|
plugins: { js },
|
||||||
|
extends: ["js/recommended"],
|
||||||
|
languageOptions: { globals: globals.node, ecmaVersion: 2025 },
|
||||||
|
rules: {
|
||||||
|
indent: ["error", "tab"],
|
||||||
|
"linebreak-style": ["error", "unix"],
|
||||||
|
quotes: ["error", "double"],
|
||||||
|
semi: ["error", "always"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ files: ["**/*.json"], plugins: { json }, language: "json/json", extends: ["json/recommended"] },
|
||||||
|
]);
|
||||||
1796
lecture_5/package-lock.json
generated
Normal file
1796
lecture_5/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
lecture_5/package.json
Normal file
20
lecture_5/package.json
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "dinosaurs",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^17.4.2",
|
||||||
|
"express": "^5.1.0",
|
||||||
|
"pg": "^8.11.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/js": "^10.0.1",
|
||||||
|
"@eslint/json": "^1.2.0",
|
||||||
|
"eslint": "^10.0.0",
|
||||||
|
"globals": "^17.4.0",
|
||||||
|
"prettier": "^3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
45
lecture_5/schema.sql
Normal file
45
lecture_5/schema.sql
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
-- Dinosaur table
|
||||||
|
CREATE TABLE dinosaur (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(256) NOT NULL,
|
||||||
|
description VARCHAR(4096) NOT NULL,
|
||||||
|
period VARCHAR(32) NOT NULL,
|
||||||
|
wikipedia_address VARCHAR(4096) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Insert sample data into dinosaur table
|
||||||
|
INSERT INTO dinosaur (name, description, period, wikipedia_address)
|
||||||
|
VALUES (
|
||||||
|
'Tyrannosaurus',
|
||||||
|
'Tyrannosaurus („tyranský ještěr" – odvozeno ze starořeckého τύραννος – tyrannos = vládce, resp. krutovládce; v případě druhu T. rex pak latinského rex = král) byl jeden z největších masožravých dinosaurů (teropodů) a zároveň jedním z největších suchozemských predátorů všech dob.',
|
||||||
|
'křída',
|
||||||
|
'https://cs.wikipedia.org/wiki/Tyrannosaurus'
|
||||||
|
);
|
||||||
|
INSERT INTO dinosaur (name, description, period, wikipedia_address)
|
||||||
|
VALUES (
|
||||||
|
'Stegosaurus',
|
||||||
|
'Stegosaurus („zastřešený ještěr") byl rod ptakopánvého dinosaura, který žil v období pozdní jury (asi před 150 miliony let) na území Severní Ameriky. Jeho pojmenování znamená „střechovitý či zastřešený ještěr", toto označení dostal podle plochých desek, menší měl na krku a větší na hřbetě a přední části ocasu.',
|
||||||
|
'jura',
|
||||||
|
'https://cs.wikipedia.org/wiki/Stegosaurus'
|
||||||
|
);
|
||||||
|
INSERT INTO dinosaur (name, description, period, wikipedia_address)
|
||||||
|
VALUES (
|
||||||
|
'Iguanodon',
|
||||||
|
'Iguanodon (z latiny: „leguání zub", český název je také iguanodon) je rod ornitopodního dinosaura, který se vývojově nacházel někde mezi prvními hbitými dvounohými hypsilofodonty a kachnozobými dinosaury, jimiž věk ornitopodů vrcholil.',
|
||||||
|
'křída',
|
||||||
|
'https://cs.wikipedia.org/wiki/Iguanodon'
|
||||||
|
);
|
||||||
|
INSERT INTO dinosaur (name, description, period, wikipedia_address)
|
||||||
|
VALUES (
|
||||||
|
'Velociraptor',
|
||||||
|
'Velociraptor byl rod poměrně malého teropodního dinosaura, patřícího mezi dravé dromeosauridy. Byl zástupcem skupiny velociraptorinů, menších „srpodrápých" teropodů, obývajících severní kontinenty v období pozdní křídy.',
|
||||||
|
'křída',
|
||||||
|
'https://cs.wikipedia.org/wiki/Velociraptor'
|
||||||
|
);
|
||||||
|
INSERT INTO dinosaur (name, description, period, wikipedia_address)
|
||||||
|
VALUES (
|
||||||
|
'Brontosaurus',
|
||||||
|
'Brontosaurus (z řec. βροντή, brontē = hrom + σαυρος, sauros = ještěr: „hřmotný ještěr" či „hromový ještěr") byl rod velkého sauropodního dinosaura z čeledi Diplodocidae. Žil v období svrchní jury, asi před 155 až 152 miliony let na území západu Severní Ameriky.',
|
||||||
|
'jura',
|
||||||
|
'https://cs.wikipedia.org/wiki/Brontosaurus_(dinosaurus)'
|
||||||
|
);
|
||||||
Loading…
Reference in New Issue
Block a user