2021-12-10 07:58:00 -08:00
---
id: 587d824a367417b2b2512c44
2021-12-13 22:11:12 +05:30
title: Перевірка ціни на ринку акцій
2021-12-10 07:58:00 -08:00
challengeType: 4
forumTopicId: 301572
dashedName: stock-price-checker
---
# --description--
2021-12-13 22:11:12 +05:30
Напишіть повний пакет програми JavaScript, що функціонально подібний до цього: < https: / / stock-price-checker . freecodecamp . rocks / > .
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
Оскільки всі надійні API цін на акції вимагають API-ключа, ми створили обхідний шлях. Користуйтесь < https: / / stock-price-checker-proxy . freecodecamp . rocks / > , аби отримувати актуальну інформацію про ціни на акції без необхідності підписуватись на власний ключ.
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
При роботі над цим проєктом Ви будете писати код, використовуючи один із наступних методів:
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
- Дублюйте [цей репозиторій GitHub ](https://github.com/freeCodeCamp/boilerplate-project-stockchecker/ ) та завершіть свій проєкт локально.
- Використовуйте [наш стартовий проєкт Replit ](https://replit.com/github/freeCodeCamp/boilerplate-project-stockchecker ) для завершення Вашого проєкту.
- Використовуйте конструктор сайту на власний розсуд, щоб завершити проєкт. Впевніться, що Ви включили у с і файли з нашого репозиторію GitHub.
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
Коли Ви завершите роботу, переконайтесь, що робоча демоверсія Вашого проєкту розміщена у вільному доступі. Потім введіть URL-адресу проєкту у поле `Solution Link` . З а бажанням також введіть посилання на вихідний код проєкту у полі `GitHub Link` .
2021-12-10 07:58:00 -08:00
# --instructions--
2021-12-13 22:11:12 +05:30
1. Встановіть `NODE_ENV` до `test` без лапок та встановіть `DB` на ваш MongoDB
2. Завершіть проект в `routes/api.js` а б о через створення обробника/контролера
3. Додайте будь-які заходи безпеки до `server.js`
4. Створіть у с і функціональні тести в `tests/2_functional-tests.js`
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
**Зверніть увагу** на питання конфіденційності: вам доведеться зберегти IP-адресу. Важливо дотримуватися законів про конфіденційність даних, як от загального регламенту про захист даних. Один із варіантів — отримати дозвіл на збереження даних користувача, однак все ж простіше зробити їх анонімними. Н е забудьте зробити ваші IP-адреси анонімними, перш ніж зберігати їх до бази даних у цьому завданні. Для цього ви можете скористатися хеш-функцією, методом truncate чи просто змінити частину IP-адреси на 0.
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
Напишіть наступні тести в `tests/2_functional-tests.js` :
2021-12-10 07:58:00 -08:00
2021-12-13 22:11:12 +05:30
- Перегляд однієї акції: запит GET до `/api/stock-prices/`
- Якщо Ви переглянули одну акцію й вона Вам сподобалась: запит GET в `/api/stock-prices/`
- Якщо Ви переглянули ту ж саму акцію й обрали її знову: запит GET в `/api/stock-prices/`
- Якщо Ви переглянули дві акції: запит GET в `/api/stock-prices/`
- Якщо Ви переглянули дві акції та вони Вам сподобались: запит GET в `/api/stock-prices/`
2021-12-10 07:58:00 -08:00
# --hints--
2021-12-13 22:11:12 +05:30
Ви можете додати свій проєкт, а не URL-посилання прикладу.
2021-12-10 07:58:00 -08:00
```js
(getUserInput) => {
assert(
!/.*\/stock-price-checker\.freecodecamp\.rocks/.test(getUserInput('url'))
);
};
```
2021-12-13 22:11:12 +05:30
Ви маєте налаштувати політику безпеки вмісту так, щоб дозволити завантаження скриптів та CSS лише з вашого сервера.
2021-12-10 07:58:00 -08:00
```js
async (getUserInput) => {
const data = await fetch(getUserInput('url') + '/_api/app-info');
const parsed = await data.json();
assert.isTrue(
parsed.headers['content-security-policy'].includes("script-src 'self'")
);
assert.isTrue(
parsed.headers['content-security-policy'].includes("style-src 'self'")
);
};
```
2021-12-13 22:11:12 +05:30
Ви можете надіслати запит `GET` до `/api/stock-prices` , передаючи символ акції NASDAQ в параметр запиту `stock` . Отриманий о б 'єкт міститиме властивість із назвою `stockData` .
2021-12-10 07:58:00 -08:00
```js
async (getUserInput) => {
const data = await fetch(
getUserInput('url') + '/api/stock-prices?stock=GOOG'
);
const parsed = await data.json();
assert.property(parsed, 'stockData');
};
```
2021-12-13 22:11:12 +05:30
Властивість `stockData` включає символ `stock` у вигляді строки, `price` та `likes` у вигляді чисел.
2021-12-10 07:58:00 -08:00
```js
async (getUserInput) => {
const data = await fetch(
getUserInput('url') + '/api/stock-prices?stock=GOOG'
);
const parsed = await data.json();
const ticker = parsed.stockData;
assert.typeOf(ticker.price, 'number');
assert.typeOf(ticker.likes, 'number');
assert.typeOf(ticker.stock, 'string');
};
```
2021-12-13 22:11:12 +05:30
Ви також можете передати поле `like` як `true` (логічний тип), аби ваші вподобання було додано до акції(й). Приймається лише одне вподобання на IP.
2021-12-10 07:58:00 -08:00
```js
```
2021-12-13 22:11:12 +05:30
Якщо Ви передасте 2 акції, то отриманим значенням буде масив із інформацією про обидві акції. Замість `likes` буде показано `rel_likes` (різниця між уподобаннями на о б о х акціях) для о б о х о б 'єктів `stockData` .
2021-12-10 07:58:00 -08:00
```js
async (getUserInput) => {
const data = await fetch(
getUserInput('url') + '/api/stock-prices?stock=GOOG& stock=MSFT'
);
const parsed = await data.json();
const ticker = parsed.stockData;
assert.typeOf(ticker, 'array');
assert.property(ticker[0], 'rel_likes');
assert.property(ticker[1], 'rel_likes');
};
```
2021-12-13 22:11:12 +05:30
У с і 5 функціональних тестів завершено та успішно пройдено.
2021-12-10 07:58:00 -08:00
```js
async (getUserInput) => {
const tests = await fetch(getUserInput('url') + '/_api/get-tests');
const parsed = await tests.json();
assert.isTrue(parsed.length >= 5);
parsed.forEach((test) => {
assert.equal(test.state, 'passed');
});
};
```
# --solutions--
```js
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/
```