tyogautomo / questo-stackoverflow

[WEB] mock up Stackoverflow features including Post a qustion, post an answer, upvoting and downvoting question and answer, and watch feature that track a specific question genre. Developed using Vuejs, Express, and Mongodb

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Questo (simple web mocking up Stackoverflow)

API Documentation

All APIs using base URL:

http://localhost:3000

Deployed Web URL: http://questo.yogautomo.com

Index of Reference:

Screenshots

  1. Homepage Homepage
  2. Question Detail Question Detail

Users API

HTTP Endpoint Headers Body Description Reference
POST /users/signup none
username: string (required)
email: string (required)
password: string (required)
Register new user SignUp
POST /users/signin none
email: string (required)
password: string (required)
Login user SignIn
GET /users {JWT Token} none get authenticated user Get Authenticated User
PATCH /users/watch-tag {JWT Token} none set authenticated user's watched tags Set Watched Tags

Questions API

HTTP Endpoint Headers Body Description Reference
GET /questions none none get all questions Get Questions
GET /questions/:questionId none none get one question Get a Question
POST /questions {JWT Token}
title: string (required)
content: string (required)
tags: array (optional)
create question Create Question
PUT /questions/:questionId {JWT Token}
title: string (optional)
content: string (optional)
tags: array (optional)
update one question Update a Question
DELETE /questions/:questionId {JWT Token} none delete one question Delete a Question
POST /questions/upvote/:questionId {JWT Token} none upvote question Upvote a Question
POST /questions/downvote/:questionId {JWT Token} none downvote question Downvote a Question

Answers API

HTTP Endpoint Headers Body Description Reference
GET /answers/:questionId none none get related question's answers Get Question's Answers
POST /answers/:questionId {JWT Token}
content: string (required)
create answer Create Answer
DELETE /answers/:questionId/:answerId {JWT Token}
content: string (required)
get one answer Create Answer
GET /answers/find/:answerId {JWT Token} none get answers Get Answers
PUT /answers/:answerId {JWT Token}
content: string (required)
update answer Get Answers
POST /answers/upvote/:answerId {JWT Token} none upvote answer Upvote an Answer
POST /answers/downvote/:answerId {JWT Token} none downvote answer Downvote an Answer

Request & Response Details

Users

  • SignUp

    method: POST
    endpoint: /users/signup

    Request :

    • body:
      username: String, required
      email: String, required
      password: String, required

    Response :

    • 201
      {
          token: JWT Token,
          user: Object
      }
    • 400
      {
        "code": 400,
        "message": [
            "notNull Violation: Please input your username",
            "\nnotNull Violation: Please input your email"
        ]
      }
  • SignIn

    method: POST
    endpoint: /users/signin

    Request :

    • body:
      email: String, required
      password: String, required

    Response :

    • 200
      {
          token: JWT Token,
          user: Object
      }
    • 404
      {
        "code": 404,
        "message": "Wrong email / password"
      }
  • Get Authenticated User

    method: GET
    endpoint: /users

    Request :

    • body:
      none

    Response :

    • 200
      {
          username: String,
          email: String,
          password: String(hashed),
          upvotedQuestion: Array,
          downvotedQuestion: Array,
          upvotedAnswer: Array,
          downvotedAnswer: Array,
          watchedTags: Array
      }
    • 404
      {
        "code": 404,
        "message": "Not found"
      }
  • Set Watched Tags

    method: PATCH
    endpoint: /users/watch-tag

    Request :

    • body:
      {
          tags: Array
      }

    Response :

    • 200
      {
          username: String,
          email: String,
          password: String(hashed),
          upvotedQuestion: Array,
          downvotedQuestion: Array,
          upvotedAnswer: Array,
          downvotedAnswer: Array,
          watchedTags: Array // updated watched tags
      }

Questions

  • Get All Questions

    method: GET
    endpoint: /questions

    Request :

    • body:
      none

    Response :

    • 200
      [
          {
              title: String,
              content: String,
              tags: Array,
              answers: Array,
              userId: ObjectId,
              upVotes: Array,
              downVotes: Array,
              createdAt: Date,
              updatedAt: Date
          },
          ....
      ]
  • Get One Question

    method: GET
    endpoint: /questions/:questionId

    Request :

    • params:
      {
          questionId: String
      }

    Response :

    • 200
      {
          title: String,
          content: String,
          tags: Array,
          answers: Array,
          userId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      {
          code: 404,
          message: 'Not found'
      }
  • Create Question

    method: GET
    endpoint: /questions/:questionId

    Request :

    • body:
      {
          title: String <required>,
          content: String <required>,
          tags: Array <optional>
      }
    • params:
      {
          questionId: String
      }
    • headers"
      {
          token: <JWT Token>
      }

    Response :

    • 201
      {
          title: String,
          content: String,
          tags: Array,
          answers: Array,
          userId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 400
      example:
      {
          code: 400,
          message: 'Title required'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Update Question

    method: GET
    endpoint: /questions/:questionId

    Request :

    • body:
      {
          title: String <optional>,
          content: String <optional>,
          tags: Array <optional>
      }
    • params:
      {
          questionId: String
      }
    • headers"
      {
          token: <JWT Token>
      }

    Response :

    • 201
      "updated question"
      {
          title: String,
          content: String,
          tags: Array,
          answers: Array,
          userId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 400
      example:
      {
          code: 400,
          message: 'Title required'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Delete Question

    method: DELETE
    endpoint: /questions/:questionId

    Request :

    • params:
      {
          questionId: String
      }
    • headers"
      {
          token: <JWT Token>
      }

    Response :

    • 201
      "deleted question"
      {
          title: String,
          content: String,
          tags: Array,
          answers: Array,
          userId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      example:
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Upvote Question

    method: POST
    endpoint: /questions/upvote/:questionId

    Request :

    • params:
      {
          questionId: String
      }
    • headers"
      {
          token: <JWT Token>
      }

    Response :

    • 201
      "upvoted question"
      {
          title: String,
          content: String,
          tags: Array,
          answers: Array,
          userId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      example:
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Upvote Question

    method: POST
    endpoint: /questions/downvote/:questionId

    Request :

    • params:
      {
          questionId: String
      }
    • headers"
      {
          token: <JWT Token>
      }

    Response :

    • 201
      "downvoted question"
      {
          title: String,
          content: String,
          tags: Array,
          answers: Array,
          userId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      example:
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }

Answers

  • Get Related Question's Answers

    method: GET
    endpoint: /answers/:questionId

    Request :

    • params:
      {
          questionId: String
      }

    Response :

    • 200
      [
          {
              content: String,
              userId: ObjectId,
              questionId: ObjectId,
              upVotes: Array,
              downVotes: Array,
              createdAt: Date,
              updatedAt: Date
          },
          ...
      ]
  • Create Answers

    method: POST
    endpoint: /answers/:questionId

    Request :

    • params:
      {
          questionId: String
      }
    • headers:
      {
          token: <JWT Token>
      }

    Response :

    • 201
      {
          content: String,
          userId: ObjectId,
          questionId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 400
      {
          code: 400,
          message: 'Content required'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Delete Answers

    method: DELETE
    endpoint: /answers/:questionId/:answerId

    Request :

    • params:
      {
          questionId: String,
          answerId: String
      }
    • headers:
      {
          token: <JWT Token>
      }

    Response :

    • 200
      "deleted answer"
      {
          content: String,
          userId: ObjectId,
          questionId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Get One Answers

    method: GET
    endpoint: /answers/:answerId

    Request :

    • params:
      {
          answerId: String
      }
    • headers:
      {
          token: <JWT Token>
      }

    Response :

    • 200
      {
          content: String,
          userId: ObjectId,
          questionId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Update Answers

    method: DELETE
    endpoint: /answers/:answerId

    Request :

    • params:
      {
          answerId: String
      }
    • headers:
      {
          token: <JWT Token>
      }
    • body:
      {
          content: String <required>
      }

    Response :

    • 200
      "updated answer"
      {
          content: String,
          userId: ObjectId,
          questionId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Upvote Answers

    method: POST
    endpoint: /answers/upvote/:answerId

    Request :

    • params:
      {
          answerId: String
      }
    • headers:
      {
          token: <JWT Token>
      }

    Response :

    • 200
      "upvoted answer"
      {
          content: String,
          userId: ObjectId,
          questionId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }
  • Downvote Answers

    method: POST
    endpoint: /answers/downvote/:answerId

    Request :

    • params:
      {
          answerId: String
      }
    • headers:
      {
          token: <JWT Token>
      }

    Response :

    • 200
      "downvoted answer"
      {
          content: String,
          userId: ObjectId,
          questionId: ObjectId,
          upVotes: Array,
          downVotes: Array,
          createdAt: Date,
          updatedAt: Date
      }
    • 404
      {
          code: 404,
          message: 'Not found'
      }
    • 401
      {
          code: 401,
          message: 'Unauthorized process'
      }

About

[WEB] mock up Stackoverflow features including Post a qustion, post an answer, upvoting and downvoting question and answer, and watch feature that track a specific question genre. Developed using Vuejs, Express, and Mongodb


Languages

Language:Vue 50.9%Language:JavaScript 48.3%Language:HTML 0.8%