Coder Social home page Coder Social logo

fcchn-blog-backend's Introduction

Free Code Camp Hanoi Blog Project (Back-end)

Giới thiệu chung

Tiến độ & Đánh giá:

  • Dự án bắt đầu từ tuần 1 của tháng 1 năm 2018, và kết thúc vào ngày 19 tháng 3 năm 2018.
  • Front-end:
    • Phần tính năng đã hoàn thành 90%, còn một vài lỗi lặt vặt.
    • Giao diện cần được chỉnh sửa chau chuốt hơn.
    • Đánh giá tổng thể hoàn thành khoảng 60%.
  • Back-end:
    • Phần tính năng đã xong.
    • So với các mục tiêu đề ra (bao gồm cả test, documenation, bảo mật, v.v. ) thì đã hoàn thành được khoảng 80% - 90%.
  • Cả front-end và back-end đã được test trên local.
  • Toàn bộ đã được deploy lên heroku. Kiểm tra tại đây: https://fcchn-blog-frontend.herokuapp.com/

Tính năng và công nghệ

Là một platform để viết blog, nơi các thành viên có thể viết blog, đăng bài, xem bài của mình cũng như của người khác, bình luận vào bài của người khác. Sản phẩm này sẽ học theo các platform viết blog khác như Medium nhưng chỉ dừng ở mức cơ bản. Mục đích cuối cùng vẫn là nắm bắt được những công nghệ cần dùng cho 1 sản phẩm hoàn thiện (xem thêm mục "Những điều học được qua dự án này" ở bên dưới)

Technologies

Illustration

Tính năng chi tiết

  1. Đăng ký
  2. Đăng nhập
  3. View profile
  4. Chỉnh sửa profile
  5. Viết blog mới
  6. Chỉnh sửa blog cũ
  7. View danh sách blog của bản thân
  8. View blog của người khác
  9. Xóa blog
  10. Comment
  11. Like
  12. Share Facebook

Công nghệ sử dụng

  • Front-end:
    • React
    • Bootstrap
  • Back-end:
    • Node.js
    • Express.js
    • MongoDB-moongoose
  • Testing:
    • Unit test: Karma, Mochai, Chai, Sinon
    • Automation test: Selenium
  • Bảo mật

Công cụ sử dụng

  1. Visual Design: Gravit Designer
  2. Visual Studio Code

Cấu trúc

  • client
  • server
  • test
  • configuration

Những điều học được qua dự án này

  • Cách đóng góp vào dự án mã nguồn mở trên Github

    • Hiểu về Git cơ bản: clone, add, commit, push
    • Hiểu về remote và local repositories
    • Biết tạo nhánh (branch) và hiểu về mục đích của việc tạo nhánh
    • Biết cách fork, và pull để cập nhật từ repo gốc
    • Biết cách commitpush lên remote repo của bản thân
    • Biết cách tạo pull request để merge từ remote repo của bản thân vào repo gốc
    • Biết cách cập nhật pull request khi muốn thay đổi hoặc sửa lỗi trước khi merge
  • Làm việc nhóm qua mạng

    • Chọn chủ đề
    • Thống nhất về workflow
    • Ưu nhược điểm của làm việc nhóm
    • Giao tiếp online: ưu nhược điểm.
    • Các công cụ để giao tiếp online
    • Giao tiếp offline: ưu nhược điểm. Cách thức.
    • Cách giải quyết khi có mâu thuẫn
    • Công cụ để quản lý dự án theo nhóm
    • Cách phân chia công việc:
      • Cấu trúc của dự án
      • Nhiệm vụ chi tiết
  • Hiểu và thực hành các công nghệ front-end:

    • Quy trình design:
      • Viết requirement và user stories
      • Sử dụng Gravit Designer để vẽ
    • Bootstrap
    • React
    • React-Router
  • Hiểu và thực hành các công nghệ back-end:

    • Database:
      • MongoDB
      • Mongoose
    • Rest API
    • HTTP (hoặc HTTPs)
    • User Authentication
    • User Authorization
  • Hiểu và thực thành Node.js:

    • Node.js
    • Express.js
  • Hiểu và thực hành unit test cũng như automation test:

    • Naive test sử dụng Postman và Robo3T
    • Unit test sử dụng Mocha, Chai và Chai-Http
    • Automation test sử dụng Selenium
  • Biết, thống nhất, và cấu hình cho linting tool

    • Code format khi chạy trên local
    • Code format khi commit lên remote
  • Hiểu cơ bản về bảo mật cho website

    • Bảo mật chung cho website
    • Bảo mật riêng cho Node.js
  • Biết cách cấu hình cho Webpack

  • Triển khai sản phẩm: quản lý asset và Heroku

fcchn-blog-backend's People

Contributors

ngminhtrung avatar vutung3196 avatar thelonglqd avatar tungnt-580 avatar narutoo9x avatar

Stargazers

Trung avatar  avatar NgoThiThuyLinh avatar Di Daan Truong avatar Quoc Trung Do Ha avatar Cuong Viet avatar  avatar Vinh Cao avatar Tanzim Mokammel avatar John Baron avatar

Watchers

James Cloos avatar Trung-Tuyến Nguyễn avatar  avatar Trung avatar  avatar Dmitry avatar  avatar  avatar  avatar Petee avatar Nguyễn Quốc Đại avatar

fcchn-blog-backend's Issues

[Todo 2018.02.09] Danh sách công việc cần làm

Participants


  1. Nhóm 1: Long
  2. Nhóm 2: Nguyễn Thanh Tùng - Vũ Tùng
  3. Nhóm 3: Thành - Trung

TODO


1. Write Schema, Routes, and Controller for CRUD tasks:

1.1. Collection "Users" (Long). Done on 2018.02.07

  • Schema set-up
  • Create
  • Read
  • Update
  • Delete

1.2. Collection "Post" (Vũ Tùng - Nguyễn Tùng). Done on 2018.02.07

  • Schema set-up
  • Create
  • Read
  • Update
  • Delete

1.3. Collection "Comments" (Trung). Done on 2018.02.07

  • Schema set-up
  • Create
  • Read
  • Update
  • Delete

1.4. Collection "Likes" (Thành)

  • Schema set-up
  • Create
  • Read
  • Update
  • Delete

1.2 Viết test cho Users

2. Setup logger (Nguyễn Tùng). Done on 2018.02.07

  • Setup logger for project
  • Log must be piped to files, file name must include timestamp for ease of tracking
  • Log daily.
  • Study on what is best practice for logger destination (separated folder for each environment or inside projects folder)

3. Write API Docs

  • Users
  • Posts
  • Comments
  • Likes

4. Setup nodes.js environment

  • Development
  • Testing
  • Production

5. Setup naive test

  • Manual test by POSTMAN
  • Export and upload POSTMAN test collection

6. Setup automation test

  • Create test case
  • Database population
  • Setup test specification with Mocha, Chai and Chai-http

7. Deploy the product

  • Populate database with data
  • Deploy to heroku

Hướng dẫn sử dụng Robo 3T (cũ: Robomongo)

Robo3T (tên cũ: Robomongo) được dùng để xem database MongoDB trên máy.

Trang chủ:

https://robomongo.org/

Đã có nhiều hướng dẫn cài đặt và sử dụng bằng tiếng Việt. Vui lòng xem các bài đưới đây:

Xem các hình chụp sau để thực hiện nhanh việc kiểm tra database MongoDB dự án fcchanoi-blog-backend

Sau khi cài đặt, mở Robo3T, tạo connection đến database trong máy.

Bước 1:

robo 3t - 1 1_003

Bước 2:

mongodb connections_004

Bước 3: Đặt tên cho connection này. Nó sẽ trỏ đến toàn bộ MongoDB trên localhost của ta, kể cả các dự án khác. Lưu ý số cổng MongoDB. Sau đó nhấn Connect.

connection settings_005

mongodb connections_006

Bước 4: Vào xem database của fcchn-blog-backend. Chỉnh sửa nếu muốn.

robo 3t - 1 1_007
robo 3t - 1 1_008

Viết hướng dẫn để cài đặt và chạy (back-end)

Làm thế nào để đóng góp cho app này?

blog-app mở cho tất cả mọi người, và chúng tôi hoan nghênh bất kỳ đóng góp nào. Chúng tôi tin rằng dự án này sẽ hoàn thiện hơn khi nhận được sự quan tâm của các bạn.

SETUP


Danh sách modules cần để chạy fcchn-blog-backend

Những chương trình cần cài trước trong máy:

Tên chương trình Phiên bản
Node.js 8.9.3
MongoDB 3.4.5

Nếu Node.js hoặc MongoDB đã có sẵn trong máy của bạn, hãy chạy câu lệnh sau để kiểm tra phiên bản đã cài đặt:

node -v
mongo --version

Nếu phiên bản Node.js hoặc MongoDB của bạn đang thấp hơn phiên bản yêu cầu trên, bạn cần tiến hành cập nhật.

Fork the project

Bạn cần fork dự án này về repo của bạn.

Cài đặt git

  1. Cài đặt git
  2. Setup một khóa SSH cho Github.

Tiến hành fork fcchn-blog-backend

  1. Vào repo của fcchn-blog-backend tại địa chỉ: https://github.com/ngminhtrung/fcchn-blog-backend
  2. Kéo lên đầu trang, click chuột vào nút "Fork" ở bên tay phải. Xem chi tiết ở đây.
  3. Sau khi repo này được forked, trình duyệt web sẽ đưa bạn đến repo trên account Github của bạn tại địa chỉ [lưu ý thay tên account của bạn]: https://github.com/[tên-account-Github-của-bạn]/fcchn-blog-backend

Clone bản fork về máy local

  1. Mở Terminal/ Command Line/ Bash Shell trong folder nào đó trong máy bạn, chọn folder mà bạn muốn lưu trữ repo fcchn-blog-backedn nói trên, ví dụ: /learningReact
  2. Clone bản fork của fcchn-blog-backend về máy qua câu lệnh:
git clone https://github.com/[tên-account-Github-của-bạn]/fcchn-blog-backend.git

Lưu ý lần nữa: nhớ đổi "tên-account-Github-của-bạn" trong đường dẫn trên với username Github của bạn.

Cài đặt Upstream

  1. Chuyển đến thư mục chứa fcchn-blog-backend (ví dụ bằng câu lệnh cd fcchn-blog-backend)
  2. Thêm một tham chiếu từ xa đến repo chính thức của fcchn-blog-backend:
$ git remote add upstream https://github.com/ngminhtrung/fcchn-blog-backend.git

Lưu ý: từ upstream có thể thay đổi bằng bất kỳ từ nào khác theo ý bạn. Chủ yếu bạn cần nhớ từ khóa này để dùng sau này, khi cần cập nhật mã nguồn từ repo chính thức của fcchn-blog-backend.

Maintain bản fork của bạn

Bây giờ bạn đã có 1 bản fork, sẽ có vài việc cần làm để giúp cho bản fork này được cập nhật.

Rebase từ upstream

Hãy thực hiện việc sau trước khi tạo 1 branch mới để Pull Request:

  1. Đảm bảo rằng bạn đang ở nhánh develop:
git status
// On branch develope
// Your branch is up-to-date with 'origin/develop'

Nếu đang ở nhánh khác, hãy xử lý các files còn đang dang dở, commits, rồi chuyển sang nhánh develop:

git checkout develop

Thực hiện 1 pull có rebase đối với repo "upstream" (chính là repo gốc của fcchn-blog-backend). Lưu ý: nếu bạn đã từng thay từ "upstream" bằng cái tên khác ở bước bên trên, thì ở đây cũng phải đổi "upstream" thành từ mà bạn đã đặt.

git pull --rebase upstream develop

Việc này sẽ giúp lôi mọi thay đổi từ nhánh develop của repo chính thức về repo của bạn (mà không tạo thêm commit trong repo trên máy).

  1. (Tùy chọn) Force push những thay đổi trên nhánh develop trên repo trên máy đến bản fork online trên Github
git push origin develop --force

Thao tác này sẽ ghi đè nhánh develope trên bản fork của bạn (trên Github).

Tạo nhánh mới

Trước khi tiến hành công việc, bạn sẽ cần tạo 1 nhánh mới liên quan cụ thể đến issue/ tính năng mà bạn đang nhắm đến. Mọi code của bạn sẽ được đẩy vào nhánh này.

Đặt tên cho nhánh

Định dạng tên nhánh:

  • Khi fix bug: fix/xxx
  • Khi liên quan đến tính năng: feature/xxx

trong đó xxx là mô tả "cực" ngắn về thay đổi hoặc tính năng mà bạn đang thêm vào. Ví dụ, nếu bạn định fix bug liên quan đến tính năng log-in bằng email, hãy đặt tên nhánh là fix/email-login.

Thêm nhánh vào repo trên máy

Tạo một nhánh mới trên máy và chuyển đến nhánh đó bằng lệnh:

git checkout -b [tên_nhánh_mới_của_bạn]

sau đó đẩy lên Github

$ git push origin [tên_nhánh_mới_của_bạn]

Nếu cần tra thêm cách xử lý với nhánh, hãy xem tại đây.

Thiết lập cơ chế "linting"

Bạn cần có ESLint được cài vào editor của mình, ESLint sẽ giúp phát hiện bất kỳ đoạn code nào không tuân thủ với quy định về viết code của fcchn-blog-backend. Các quy định được dựa trên Airbnb JavaScript Style Guide.

Xin đừng bỏ qua bất kỳ vấn đề nào do ESLint chỉ ra, bởi quy định về viết code được sinh ra để đảm bảo chúng ta luôn có một code base sạch sẽ và sáng sủa.

Set-up fcchn-blog-backend

Một khi bạn đã fork fcchn-blog-backend về máy, trước khi chạy chương trình, bạn cần cài đặt tất cả các dependencies qua lệnh:

npm install

Sau đó bạn cần khởi động MongoDB, thêm dữ liệu cho database, sau đó khởi động chương trình:

# Bật mongo server ở một terminal riêng:
# Nếu dùng macOS:
mongod

# Nếu dùng Windows, bạn cần phải chỉ rõ đường dẫn đến file thực thi mongod
# Đường dẫn dưới đây chỉ là mẫu, hãy thay 3.4 bằng phiên bản thực tế cài trên máy bạn:
"C:\Program Files\MongoDB\Server\3.4\bin\mongod"

# Khởi động fcchn-blog-backend
# Lệnh sau sẽ thêm dữ liệu vào database trong lần cài đặt đầu tiên
# Và lệnh này chỉ cần chạy 1 lần duy nhấ
npm run only-once

# Khởi động ứng dụng
npm start

Bây giờ, hãy mở trình duyệt lên, gõ vào thanh địa chỉ http://localhost:3000. Nếu ứng dụng chạy, thì nghĩa là mọi thứ đã ngon lành. Còn không, bạn có thể tạo issue trong repo chính thức của fcchn-blog-backend để hỏi.

Test ứng dụng

Khi bạn đã sẵn sàng để chia sẻ code mới thêm vào, bạn cần test lại ứng dụng với:

npm test

và đảm bảo mọi tests phải được pass.

Bản quyền

Một khi đã đóng góp vào blog-app, bạn đồng ý rằng code của bạn sẽ có bản quyền theo nhóm MIT.

feat(data-model): Like và Unlike

Hiện mình đang nghĩ like và unline sẽ để là true hoặc false.

@tungnt-580 : Với like, Nếu để giống như clap của Medium thì phải là number. Nếu phức tạp hơn giống Facebook thì lại là array.

Long: Nếu thêm unline vào thì lại khác. Nếu có unlike, thì like: [{user: ‘A’, user: ‘B’}], số lượng like lấy bằng like.length, mỗi lần click vào nút like/unlike, thì tìm username, có thì là unlike (xoá bỏ phần tử đó trong mảng), mà không có thì là like (thêm user đó vào mảng) 😄

Viết API docs

https://techmaster.vn/posts/34494/danh-gia-cac-api-editor-pho-bien-nhat

Bổ sung module JSDoc để tạo API documents cho project.

  1. Tên module: JSDoc.
  2. Template: Docdash
  3. Edit package.json: thêm dòng "jsdoc": "./node_modules/jsdoc/jsdoc.js -c jsdoc.json" vào scripts.
  4. Thêm file cấu hình cho jsdoc jsdoc.json tại folder root.
  5. To-do: File JavaScript của người nào thì cần sửa lại phần comment theo đúng rules của JSDoc và có các phần tối thiểu bao gồm: ... [cần thảo luận thêm]

Website & Node.js Security Checklist

Dear all,

Về bảo mật cho website, mình hiểu có 2 thứ lớn cần lưu tâm:

  1. Bảo mật cho một website nói chung.
  2. Bảo mật cho Node.js nói riêng

Mục 2 có thể bị trùng với mục 1, nhưng sẽ có những thứ khác cần phải quan tâm riêng cho công nghệ Node.js.

Mình đề xuất hướng tiếp cận cho mục này như sau:

  1. Bắt buộc phải làm. Không được bỏ qua vụ này.
  2. Cùng nhau liệt kê các vấn đề của các phần trên, và hiểu xem nếu ứng vào app của ta thì sẽ như thế nào.
  3. Đề ra cách xử lý với mỗi loại nguy cơ.
  4. Tiến hành bịt 1 - 2 lỗ hổng (nếu có) điển hình nếu thời gian cho phép (ví dụ cài thêm module nào đó của Express).
  5. Ghi chép tạo report riêng cho mục này.

Setup logger

  • Setup logger for project
  • Log must be piped to files, file name must include timestamp for ease of tracking
  • Log daily.
  • Study on what is best practice for logger destination (separated folder for each environment or inside projects folder)

[3rd party library] Lodash

Long: Làm việc với object và mảng, thì mọi người dùng thư viện này phổ biến này. dự án nào về JS cũng sẽ có

https://lodash.com/

PS: Note riêng thành 1 issue để sau này dễ tập hợp lại xem thư viện này dùng chỗ nào, cho việc gì. Nếu không có nó thì sao.

3.1.1. Collection "Comments" - Setup Schema cho model

Tham chiếu đến tài liệu chính ở đây.

{
        {
            "content": "Bài này viết tốt quá",
             "authorID": ObjectId("1qrq3522aa6a3233a92141411"),
             "postID":  11,
              createdAt: { type: Date, default: Date.now }

        },
        {
            "content": "Cần bổ sung thêm về ...",
            "authorID": ObjectId("412b1153a2aa6a3233a9132e7"),
            "postID": 141,
              createdAt: { type: Date, default: Date.now }
        }
},

[Todo 2018.01.17] Cập nhật công việc cần làm

Tham dự:

  1. Nguyễn Thế Phụng Long
  2. Vũ Tùng
  3. Nguyễn Thế Tùng
  4. Nguyễn Minh Trung
  5. Khắc Thành

Nội dung thảo luận

  • Tính năng "like" cho post -> Làm giống Medium, tối đa 50 like/ user.
  • Tính năng "like" cho comment -> 0/1.
  • Tách thành 5 bảng: Users, Posts, Comments, và Likes
  • Làm lại bảng mô tả: Resouce, Actions, Routes, HTTP Methods/ Verbs, Description, và Parameters.

Danh sách các công việc cần làm:

  1. Viết lại sample JSON của data model --> Deadline: 21.01.2018 Trung (@ngminhtrung)
  2. Tạo project folder, gitignore, package.json --> Deadline: 23.01.2018 Long (@thelonglqd)
  3. Chuyển bảng trên từ Google Spreadsheet sang markdown --> Deadline: 21.01.2018 Trung (@ngminhtrung)

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.