Git Product home page Git Product logo

angular_test's Introduction

CodeIT Test task

Создать приложение (SPA) используя Angular. Приветсвуется ииспользование Bootstrap, SCSS и сборщик gulp.

Приложение из себя представляет Блог. На главной странице блога располагаются записи. Для неавторизированного пользователя не должно быть никаких возможностей кроме просмотра списка записей и каждой отдельной записи. Пользователь может авторизироваться с уже существующими логином и паролем или зарегестрироваться. Авторизированный пользователь может добавлять новые записи, удалять существующие. Добавление поста должно происходит из всплывающего окна появляющегося после нажатия на кнопку "Add article". Для неавторизированного пользователя окно появляться не должно, кнопка должна отсутствовать. Авторизированный пользователь может удалять записи. Для этого в списке записей для каждой записи и на странице записи должна быть кнопка "Remove". В случае удаления записи со страницы записи пользователь должен быть перемещен на главную страницу (к списку записей).

В записи имеются поля: Заголовок, содержимое, дата публикации. На странице должна быть возможность поиска то заголовку записи, содержимому записи, а также возможность изменения направления отображения записей (новые сверху/ новые снизу). Все средствами Angular без обращения к серверу.

На сайте также должна присутствовать страница "Auth and registration". Для неавторизованного пользователя на эту страницу должна быть ссылка "Auth" в шапке сайта. Для авторизованного на этом месте должна отображаться почта пользователя и кнопка "Logout". Страница авторизации должна перенаправлять авторизрованного пользователя на главную. На странице должно быть две две панели. Слева -- авторизация, справа -- регистрация. А форме авторизации должно быть два поля ("Email", "Password") и кнопка "Sign in". По нажатию страница должна выполнить запрос заблокировав форму для редактирования и отправки нового запроса до получения ответа. Если ответ подтверждает авторизацию, то в заголовке страницы должна исчезнуть ссылка "Auth" и быть заменена на почту и кнопку "Logout". Пользователя должно перенаправить на главную страницу. Без перезагрузки. Если ответ отрицает авторизацию, под формой должно появится сообщение об ошибке (логин и пароль неверны, форма невалидна). Если пользователь перезагрузить страницу ее состояние не должно измениться и пользватель должен оставаться авторизованым. На стороне регистрации пользователя должно быть 3 поля ("Email", "Password", "Password repeat") и кнопка "Sign up". По нажатию страница должна выполнить запрос заблокировав форму для редактирования и отправки нового запроса до получения ответа. В случае успеха повторить сценарий формы авторизации. В случае ошибки под формой должно появится сообщение об ошибке (логин или email уже использованы, форма невалидна).

Формы должны иметь предварительную валидацию. Все поля обязательны для заполнения.

Необходимые компоненты

  • NodeJS 4+
  • MongoDB

Слушает 0.0.0.0:3000.

Код Angular разместить в /public.

Спецификации по функционалу

Форма авторизации

Название Тип Валидация
Email email required
Password password required

Ниже кнопка Sign in. По нажатию выполняет асинхронный запрос. Поля становятся readonly, кнопка disabled.

Форма регистрации

Название Тип Валидация
Email email required
Password password pattern=".{8,40}" required
Repeat password password required

Ниже кнопка Sign up. При валидации проверить соответствие полей для паролей. Вывести ошибку для второго поля при несоответствии. (Написать директиву для кастомной валидации).

Будет плюсом: Сделать асинхронную валидацию Email.

Добавление записи в Блог

Модальное окно всплывает после нажатия на кнопку "Add article". Окно представляет из себя директиву. В окне содержится форма.

Название Тип Валидация
Title text pattern='.{3,255}' required
Text textarea required

Ниже кнопка "Submit". По нажатию выполняет запрос блокируя форму (поля readonly, кнопка disabled).

Удаление записей из блога

Конпка "Remove" справа от заголовка записи. По нажатию появляется confirm с вопросом "Are you sure you want to remove the article?". Если "Yes" -- выполнить запрос. Во время выполнения запроса сделать article полупрозрачным opacity: .75. В случае успеха убрать запись из списка или перейти к списку (со страницы записи). В случае ошибки вывести предупреждение. В консоль вывести сообщение об ошибке.

Реализация

Для выполнения задачи предоставляется REST API как часть разрабатываемого приложения. Исходный код сервера и клиента содержится в одном месте. Запуск сервера выполняется командой node ./bin/www в командной строке BASH. Front-end часть сервера находится в папке ./public на этом сервере. Все данные из этой папки доступны по адресу https://codeit-seitbekir.c9users.io/ после запуска сервера. Доступ к методам для авторизированных пользователей требует token. Об этом ниже.

Angular routes

  • / - главная, блог.
  • /:postId - запись в блоге по postId.
  • /auth - страница авторизации и регистрации.

При перезагрузке (закрытии, открытии) страницы статус пользователя (авторизирован / не авторизирован) должен сохраняться. При получении статуса 403 от любого метода немедленно разавторизировать пользователя. token хранить в localStorage или cookies.

API

Запрос должен быть в виде JSON. иметь заголовок application/json.

2хх -- коды успеха. 4хх -- коды ошибки.

(в ng-http при 2xx попадает в then, при 4xx -- в catch).

Token передавать в заголовке, если требуется.

Пример запроса

$http
    .post("http://_servername_/api/auth/signin", { // Выполнить REST запрос авторизации
        email: "email",
        password: "secretPassword1"
    })
    .then(
        function(res) { // В случае успеха получить токен
            var token = res.data.token;
        },
        function(err) {
            console.log("You cannot log in.");
        }
    );

Авторизация

POST: /api/auth/signin - вход

request
  • Method: POST
  • Token: Not required

Body:

Field Required Description
email * email пользователя, Email.
password * пароль пользователя, Password.
response
Status Description
202 Accepted. Пользователь успешно авторизирован.
403 Forbidden. Пара логин/пароль неверна.
416 Requested Range Not Satisfiable. Данные невалидны.
status 202
Field Description
token Ключ авторизации.

POST: /api/auth/signup - регистрация

После регистрации следует авторизировать пользователя.

request
  • Method: POST
  • Token: Not required

Body:

Field Required Description
email * email пользователя, Email.
password * пароль пользователя, Password.
response
Status Description
201 Created. Пользователь успешно создан.
409 Conflict. Email уже использован.
416 Requested Range Not Satisfiable. Данные невалидны.

GET: /api/auth/check/:email - проверка Email на использование

request
  • Method: GET
  • Token: Not required

Params:

Field Required Description
email * email пользователя, Email.
response
Status Description
200 Ok. Email свободен.
406 Not Acceptable. Email занят.
416 Requested Range Not Satisfiable. Данные невалидны.

POST: /api/auth/logout - выход

request
  • Method: POST
  • Token: Required
response
Status Description
202 Accepted. пользователь разавторизован.
403 Forbidden. Доступ запрещен.

Блог

GET: /api/blog - неотсортированный список записей в блоге

request
  • Method: GET
  • Token: Not required
response
Status Description
200 OK. Список записей.
204 No content. Список записей пуст.
status 200

Array of postObject

PostObject:

Field Type Description
id ObjectId Идентификатор записи.
title String Заголовок записи.
text String Содержимое записи.
date Integer (UNIX timestamp) Время создания записи.

POST: /api/blog - добавить запись в блог

request
  • Method: POST
  • Token: Required

Body:

Field Required Type Description
title * String Заголовок записи.
text * String Содержимое записи.
response
Status Description
201 Created. Запись создана.
403 Forbidden. Доступ запрещен.
416 Requested Range Not Satisfiable. Данные невалидны.
status 202
Field Type Description
id ObjectId Идентификатор записи.
title String Заголовок записи.
text String Содержимое записи.
date Integer (UNIX timestamp) Время создания записи.

GET: /api/blog/:postId - запись в блоге по id

request
  • Method: GET
  • Token: Not required

Params:

Field Required Type Description
postId * ObjectId Идентификатор записи.
response
Status Description
200 Created. Запись создана.
status 200
Field Type Description
id ObjectId Идентификатор записи.
title String Заголовок записи.
text String Содержимое записи.
date Integer (UNIX timestamp) Время создания записи.

PUT: /api/blog/:postId - изменить запись в блоге

request
  • Method: PUT
  • Token: Required

Params:

Field Required Type Description
postId * ObjectId Идентификатор записи.

Body:

Field Required Type Description
title * String Заголовок записи.
text * String Содержимое записи.
response
Status Description
202 Accepted. Запись изменена.
403 Forbidden. Доступ запрещен.
416 Requested Range Not Satisfiable. Данные невалидны.
status 201
Field Type Description
id ObjectId Идентификатор записи.
title String Заголовок записи.
text String Содержимое записи.
date Integer (UNIX timestamp) Время создания записи.

DELETE: /api/blog/:postId - удалит запись из блога

request
  • Method: DELETE
  • Token: Required

Params:

Field Required Type Description
postId * ObjectId Идентификатор записи.
response
Status Description
202 Accepted. Запись удалена.

angular_test's People

Contributors

kolyose avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.