This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 22, 2025. It is now read-only.

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Backend Coding Challenge

Introduction

You are to create a Backend API for a simple blog system.

You are encouraged to display any knowledge of clean architecture and design pattern in the development of your application.

Score

CriteriaScore
Clean code / Development60%
Unit / Integration test30%
Docker10%

Requirement

  1. We value a clean, simple working solution.
  2. The application can be run in Docker(10%), candidate can provide docker-compose.yml and start.sh bash script at the root of the project, which should setup all relevant services/applications.
  3. The solution to be written in Go Lang
  4. Candidates must submit the project as a git repository(we encourage you to commit often with only related changes). Repository must avoid containing the words sphtech and challenge.
  5. Having unit/integration tests is a must(30%).
  6. As we run automated tests on your project, you must comply to the API requirement as stipulated below. You can assume Docker is already installed in the test machine.
  7. Please provide README instruction to setup and run your application on macos.

Problem Statement

  1. Must be a RESTful HTTP API listening to port 8080 (or you can use another port instead and describe in the README)

  2. The API must implement 3 endpoints with path, method, request and response body as specified

    • One endpoint to create an article (see sample)

      • To create an article, the API client must provide a title, content and a author (see sample)
      • The API responds an object containing the status and article id
    • One endpoint to get an article by id (see sample)

      • An error response should be returned if a client tries to get an article which doesn't exist.
    • One endpoint to list all articles (see sample)

  3. The request input should be validated before processing. The server should return proper error response in case validation fails.

  4. A Database must be used (SQL or NoSQL). The DB installation & initialisation must be done in start.sh.

  5. All responses must be in json format no matter in success or failure situations.

Api Interface

You are expected to follow the API specification as follows. Your implementation should not have any deviations on the method, URI path, request and response body. Such alterations may cause our automated tests to fail.

Task 1 - Create an article

  • Method: POST
  • Path: /articles
  • Request Body:
{
"title": "Hello World",
"content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"author": "John",
}
  • Response Header: HTTP 201
  • Response Body:
{
"status": 201,
"message": "Success",
"data": {
"id": <article_id>
}
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 2 - Get article by id

  • Method: GET
  • Path: /articles/<article_id>
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

Task 3 - Get all article

  • Method: GET
  • Path: /articles
  • Response Header: HTTP 200
  • Response Body:
{
"status": 200,
"message": "Success",
"data": [
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
},
{
"id": <article_id>,
"title":<article_title>,
"content":<article_content>,
"author":<article_author>,
}
]
}

or

  • Response Header: HTTP <HTTP_CODE>
  • Response Body:
{
"status": <HTTP_CODE>,
"message": <ERROR_DESCRIPTION>,
"data": null
}

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors