Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - GoodRequest/BackendAssignment-Fitness · GitHub
Skip to content

Latest commit

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Fitness app - assignment

Requirements

  • node.js ^16.0.0
  • postgres ^16
  • favourite IDE
  • git

How to start

  • fork or download this repository
  • install dependencies with npm i
  • create fitness_app database (application access postgresql://localhost:5432/fitness_app, make sure you use correct port and db name )
  • create db schema and populate db with npm run seed
  • run express server with npm start

How to submit assignment

You can

  • change project structure
  • change or add any npm module
  • change db model (add tables, table columns...)
  • change anything if you can say why

Scenario

The goal of this assignement is to modify given REST API written in express.js using typescript. Public API consist of 2 endpoints [get]localhost:8000/exercises (list of exercises) and [get]localhost:8000/programs programs (list of programs).

Structure of API responses

{
data: {id: 1}
message: 'You have successfully created program'}

or

{
data: [{id: 1,name: 'Program 1'}]
message: 'List of programs'}

Task 1

Create authorization layer to enable users to access private API (next Task)

  • create new db model User(name:string , surname: string, nickName:string, email: string, age: number, role:[ADMIN/USER])
  • add authorization layer
  • user can register using email, password and role (for purpose of this assignment, user can choose his role in registration)
  • user can log in with email and password
  • use proper way how to store user data
  • you can use any authorization approach or npm module (preferred is JWT strategy and passport)

Task 2

Create private API for user with role [ADMIN]

ADMIN can:

  • create, update or delete exercises
  • edit exercises in program (add or remove)
  • get all users and all its data
  • get user detail
  • update any user (name, surname, nickName, age, nickName, role)

Task 3


Create private API for user with role [USER]

USER can:

  • get all users (id, nickName)
  • get own profile data (name, surname, age, nickName)
  • track exercises he has completed (he can track same exercise multiple times, we want to save datetime of completion and duration in seconds)
  • see list of completed exercises (with datetime and duration) in profile
  • remove tracked exercise from completed exercises list

USER cannot:

  • access ADMIN API
  • get or update another user profile

Bonus task 1 - pagination, filter, search

Add pagination to exercise list using query => /exercises?page=1&limit=10 return 1 page of exercises in maximal length of 10.

Add filter by program => /exercises?programID=1 return only exercises of program with id = 1

add fultext search on exercise name => /exercises?search=cis => return only exercises which name consist of string cis


Bonus task 2 - validation

Create validation service to check request body, query and params to make sure user sends valid request. For example, in registration, user must send valid email, otherwise return status code 400. Also you can use validation on query in bonus task 1.


Bonus task 3 - localization

Create localization service to send message attribute in API responses in correct language. Default language is EN, optional is SK. User can send all requests with HTTP header language: 'sk' or language: 'en' to receive required language localization.

example of response for request with language: 'sk'

{
data: {id: 1}
message: 'Program bol úspešne vytvorený'}

Bonus task 4 - error handling

Create proper way how to handle all errors in application. Use console.error display error in terminal, user can never see stack trace or real error message. You can write error logs to file.

response status code >= 500

{
data: {}
message: 'Something went wrong'}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages