Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
536d9d7
JRMP2-6 Preparation for working with typescript
Apr 25, 2021
90dea36
JRMP2-9_approximate_layout
Apr 26, 2021
7267d99
JRMP2-3 fix
Apr 26, 2021
d126f99
JRMP2-9 fix
Apr 26, 2021
cf13ba2
JRMP2-3 fix
Apr 26, 2021
e8a31af
JRMP2-9 move tsconfig into folder frontend
Apr 26, 2021
5643d4e
Merge branch 'JRMP2-9_representation' into JRMP2-3_layout
Apr 26, 2021
eb08737
JRMP2-3 Add excluding folders into tsconfig
Apr 26, 2021
b7d37b1
JRMP2-3 setting configuration and dependencies, small fix
Apr 26, 2021
3c9d914
JRMP2-3 tuning gitignore and number of item on page
Apr 27, 2021
2f21ae8
Filled db.json with items.
dmytro-khyzhniak Apr 27, 2021
4aa5749
Added endpoint with pagination supported
dmytro-khyzhniak Apr 27, 2021
b04a805
Added CORS support.
dmytro-khyzhniak Apr 27, 2021
13bc762
JRMP2-2_Final_preparations_before_the_review
dmytro-khyzhniak Apr 28, 2021
1972190
Co-authored-by: Dmytro Khyzhniak <exORYON@users.noreply.github.com>
Apr 28, 2021
b31f5fe
Merge branch 'JRMP2-3_layout' into JRMP2-2_Add_product_list_BE
Apr 28, 2021
8b7c72c
JRMP2-2 small fix and package-lock conflict resolved
Apr 28, 2021
bff857d
Changed the location of the interfaces. Created a pagination sketch, …
Apr 28, 2021
5b30e96
JRMP2-2. Added receiving and drawing items from BE on the main page. …
dmytro-khyzhniak Apr 29, 2021
1fba334
JRMP2-2 Changed scripts in package.json
dmytro-khyzhniak Apr 29, 2021
556f31a
JRMP2-2 Syncing with Svetlana
dmytro-khyzhniak Apr 29, 2021
7c211a1
JRMP2-2 Added spinner and styles for pagination
dmytro-khyzhniak Apr 29, 2021
1cb0a02
JRMP2-2 Beta-pagination was added
dmytro-khyzhniak Apr 29, 2021
137a87b
JRMP2-2 Pagination was finished. Final preparations before the review.
dmytro-khyzhniak Apr 29, 2021
c917003
JRMP2-2 Changed current page
Apr 29, 2021
fb152e7
JRMP2-2 Fixed tsc errors and indents in css file. Improved scripts in…
dmytro-khyzhniak Apr 30, 2021
1e38cb1
JRMP2-2 Create searching number of pages on BE
May 4, 2021
37e9569
JRMP2-2 Adjusting way to find maximum number
May 4, 2021
06336a7
JRMP2-2 Fixing first half of PR comments.
dmytro-khyzhniak May 4, 2021
fb15d04
Merge remote-tracking branch 'origin/JRMP2-20_improvement' into JRMP2…
dmytro-khyzhniak May 4, 2021
2a0de1b
JRMP2-1 Added prototype of the future modal window with buttons "Add"…
dmytro-khyzhniak May 6, 2021
b427483
JRMP2-1 Improved view of the modal window. Now it can be closed by pr…
dmytro-khyzhniak May 7, 2021
fdeb002
JRMP2-1 The view of the modal window was completed. TODO: Improve loa…
dmytro-khyzhniak May 7, 2021
4171903
JRMP2-1 Fixed issue with images loading. Improved styles.
dmytro-khyzhniak May 7, 2021
bb3c1c5
JRMP2-20 Create module view and separate code from script.ts
May 9, 2021
520cc86
Merge branch 'JRMP2-20_improvement' into JRMP2-1_Show_product_card. F…
dmytro-khyzhniak May 9, 2021
fdecb37
JRMP2-1 Started splitting files into MVC.
dmytro-khyzhniak May 9, 2021
19efb72
JRMP2-1 Created View.ts.
dmytro-khyzhniak May 7, 2021
dcdd1ea
JRMP2-1 Installed eslint, fixed codestyle issues. Added new script co…
dmytro-khyzhniak May 9, 2021
4c59c15
JRMP2-21 Corrected PR comments. Splitted (didn't run) script.ts for v…
May 11, 2021
eef8b6f
JRMP2-21 Optimized main file from frontend
May 12, 2021
f3ef2be
JRMP2-18 Working with displaying a modal window
May 13, 2021
f16021f
JRMP2-1 Quick fix.
dmytro-khyzhniak May 13, 2021
5ee2833
JRMP2-1 Check and fix file module (relocated some function)
May 13, 2021
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
3 changes: 3 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules
prod
coverage
18 changes: 18 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"env": {
"browser": true
},
"extends": [
"@mate-academy/eslint-config"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
}
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ build/Release
# Dependency directories
node_modules/
jspm_packages/
frontend/prod/*.js

# TypeScript v1 declaration files
typings/
Expand Down
12 changes: 8 additions & 4 deletions backend/dev/app.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import express from "express";
import cors from 'cors';
import express from 'express';
import { router } from './router.js';

const app = express();
let port:number = process.env.PORT === undefined ? 4200 : +process.env.PORT;

const defaultPort:number = parseInt(process.env.PORT || '');
const port:number = defaultPort || 5500;
Comment on lines +7 to +8

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const port:number = process.env.PORT || 5500;


app.use(cors());
app.use('/', router);

app.listen(port, () => {
console.log(`App is working at http://localhost:${port}.`)
});
console.log(`App is working at http://localhost:${port}`);
});
77 changes: 75 additions & 2 deletions backend/dev/controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,79 @@
import { Model } from './model.js';

const model = new Model();

console.log('Controller is working.');
export interface ResponseObj {
statusCode: number,
result: object[]
}

export class Controller {
maxPage: number;
itemsPerPage: number;

constructor() {
this.itemsPerPage = 5;
this.maxPage = 0;
this.setMaxPage();
};
Comment on lines +11 to +18

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's not controller responsibility


async getAllItems(): Promise<ResponseObj> {
const response: ResponseObj = {
statusCode: 200,
result: [],
};

response.result = await model.getList();

if (!Array.isArray(response.result)) {
response.statusCode = 500;
}

if (response.result.length === 0) {
response.statusCode = 204;
}

return response;
}

async getItems(req: string):Promise<ResponseObj> {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(req: string) - it's not full request

const response: ResponseObj = {
statusCode: 200,
result: [],
};

let list: object[] = (await this.getAllItems()).result;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

object - bad type for interface. need right type

const page: number = parseInt(req);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as a option -> + req


if (this.pageIsNotValid(page)) {
response.statusCode = 400;

return response;
}

list = list.splice(((page - 1) * this.itemsPerPage), this.itemsPerPage);
response.result = list.filter(item => item !== undefined);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as a option -> (item => !!item );


return response;
}

async setMaxPage(): Promise<void> {
const list: object[] = (await this.getAllItems()).result;

this.maxPage = Math.ceil(list.length / this.itemsPerPage);
}

checkIfPageExists(req: string): boolean {
const page:number = parseInt(req);

if (this.pageIsNotValid(page)) {
return false;
} else {
return true;
}
Comment on lines +69 to +73

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as an option
return !this.pageIsNotValid(page);

}

export class Controller {}
pageIsNotValid(page: number): boolean {
return isNaN(page) || page < 1 || page > this.maxPage;
}
}
20 changes: 8 additions & 12 deletions backend/dev/model.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
import { promises as fsp } from 'fs';

console.log('Model is working.');
interface DatabaseModel {
getList(): Promise<object[]>;
}

export class Model {
constructor() {
this.testDatabase();
}

async testDatabase() {
export class Model implements DatabaseModel {
async getList() {
try {
const database = await fsp.readFile('./backend/prod/db.json');

console.log(JSON.parse(database.toString()));
console.log('Database is working.');
return JSON.parse(database.toString()).list;
} catch (error) {
console.log(error);
console.log('!!! Database is NOT working. !!!');
console.error(`Not able to receive data from database. ${error}`);
}
}
}
}
25 changes: 18 additions & 7 deletions backend/dev/router.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
import Router from 'express';
import { Controller } from './controller.js';
import { Controller, ResponseObj } from './controller.js';

const router = Router();
const controller = new Controller();

console.log('Router is working.');
router.get('/api/sneakers', async(req, res) => {
const response: ResponseObj = await controller.getAllItems();

router.get('/', (req: any, res: any) => {
res.send('Server is working.');
}
);
res.status(response.statusCode).send(response.result);
});

export { router };
router.get('/api/sneakers/:page', async(req, res) => {
const response: ResponseObj = await controller.getItems(req.params.page);

res.status(response.statusCode).send(response.result);
});

router.get('/api/sneakers/check/:_page', async(req, res) => {
const exists: boolean = controller.checkIfPageExists(req.params._page);

res.status(200).send({ 'exists': exists });
});

export { router };
138 changes: 128 additions & 10 deletions backend/prod/db.json
Original file line number Diff line number Diff line change
@@ -1,24 +1,142 @@
{
"list": [
{
"id": 0,
"name": "Item 0"
"name": "SLICER Light Coral",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1950,
"url": "https://github.com/exORYON/db/blob/main/119905085_323766932189419_4890343778692013862_n.jpg?raw=true"
},
{
"id": 1,
"name": "Item 1"
"name": "SLICER Titanium White",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1780,
"url": "https://github.com/exORYON/db/blob/main/120139455_115813640270969_2930161371286048021_n.jpg?raw=true"
},
{
"id": 2,
"name": "Item 2"
"name": "SLICER Black and White",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1990,
"url": "https://github.com/exORYON/db/blob/main/121235325_126877025548567_2222252721004759005_n.jpg?raw=true"
},
{
"id": 3,
"name": "Item 3"
"name": "SLICER Night",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1680,
"url": "https://github.com/exORYON/db/blob/main/123341033_274418847267096_9129209827290048632_n.jpg?raw=true"
},
{
"id": 4,
"name": "Item 4"
"name": "SLICER Bloody",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1999,
"url": "https://github.com/exORYON/db/blob/main/123403794_481755306065916_2801586288664686810_n.jpg?raw=true"
},
{
"name": "SLICER Marine",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1500,
"url": "https://github.com/exORYON/db/blob/main/139852253_224291332519618_4265951042297070639_n.jpg?raw=true"
},
{
"name": "SLICER Sneaky",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1499,
"url": "https://github.com/exORYON/db/blob/main/140370870_692321638119443_8194939502407238248_n.jpg?raw=true"
},
{
"name": "SLICER Orbit-8",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1888,
"url": "https://github.com/exORYON/db/blob/main/141559958_867221300722438_7622904942041361159_n.jpg?raw=true"
},
{
"name": "SLICER Drago",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1660,
"url": "https://github.com/exORYON/db/blob/main/131005842_382355842870688_2770087515132979497_n.jpg?raw=true"
},
{
"name": "SLICER White wolf",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 2199,
"url": "https://github.com/exORYON/db/blob/main/151387926_824830294738184_1265848908326283482_n.jpg?raw=true"
},
{
"name": "SLICER Platinum",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 2000,
"url": "https://github.com/exORYON/db/blob/main/155499128_5197245506983789_8014452392662128956_n.jpg?raw=true"
},
{
"name": "SLICER Gray Cloud",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1600,
"url": "https://github.com/exORYON/db/blob/main/121191948_383679462630941_3968448522456868699_n.jpg?raw=true"
},
{
"name": "SLICER Vampire Gray",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1999,
"url": "https://github.com/exORYON/db/blob/main/160964331_286760039465375_4247176901054224023_n.jpg?raw=true"
},
{
"name": "SLICER Black-X",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1800,
"url": "https://github.com/exORYON/db/blob/main/166251811_5159735014097212_7214717108794192230_n.jpg?raw=true"
},
{
"name": "SLICER Slime",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1820,
"url": "https://github.com/exORYON/db/blob/main/169871320_458483692048571_6586004615848378570_n.jpg?raw=true"
},
{
"name": "SLICER Trippie",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1780,
"url": "https://github.com/exORYON/db/blob/main/169885763_3971524352964830_3485694905555748694_n.jpg?raw=true"
},
{
"name": "SLICER White arrow",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1990,
"url": "https://github.com/exORYON/db/blob/main/170245210_139617121498587_9041741663206995882_n.jpg?raw=true"
},
{
"name": "SLICER Wind",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 2220,
"url": "https://github.com/exORYON/db/blob/main/173098415_205665784369641_7395172627539371692_n.jpg?raw=true"
},
{
"name": "SLICER Tangerine",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1770,
"url": "https://github.com/exORYON/db/blob/main/173212893_916892635540507_9071070730753087811_n.jpg?raw=true"
},
{
"name": "SLICER Latte",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1999,
"url": "https://github.com/exORYON/db/blob/main/174067225_482599662867390_6427289361886396239_n.jpg?raw=true"
},
{
"name": "SLICER Pink sugar",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1700,
"url": "https://github.com/exORYON/db/blob/main/175621456_1596487333880029_5209184562046024916_n.jpg?raw=true"
},
{
"name": "SLICER Fire",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1860,
"url": "https://github.com/exORYON/db/blob/main/176262130_964991224237833_7678617603530331333_n.jpg?raw=true"
},
{
"name": "SLICER Grey Sand",
"descr": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lobortis dictum neque, at tincidunt eros convallis quis. Donec ultricies sapien in lobortis pretium. Sed suscipit ipsum dolor, at pellentesque metus auctor quis. Suspendisse rhoncus ultricies mi, nec pharetra turpis tincidunt et.",
"price": 1499,
"url": "https://github.com/exORYON/db/blob/main/176733894_832952043987991_1063118205796755369_n.jpg?raw=true"
}
]
}
Empty file removed frontend/.gitkeep
Empty file.
Loading