#Nest.js Authorization
Explore tagged Tumblr posts
Text
Easy Guide: Adding Authentication & Authorization in Nest.js Are you building a web app with Nest.js? Understanding authentication and authorization is key! In this quick guide, we'll show you how to implement these vital features in your Nest.js projects. With Nest.js, you can build secure and scalable applications with ease. If you're new to Nest.js, check out our tutorial on setting up your first project. Let's secure your Nest.js projects together!
#Nest.js Authorization#Nest.js Authentication#Secure Nest.js Projects#Node.js Authentication#NestJS Tutorial
1 note
·
View note
Text
How to Learn NodeJS as a Django Developer?
If you're a Django developer looking to expand your skill set and delve into the world of Node.js, you're in for an exciting journey. Node.js is a powerful runtime environment that allows you to build scalable, high-performance applications using JavaScript on both the client and server sides. Learning Node.js alongside your Django expertise can open up a wide range of possibilities and career opportunities. Here's how you can get started:
1. Understand the Basics of JavaScript: Since both Node.js and client-side JavaScript use the same language, start by mastering JavaScript fundamentals. Get comfortable with variables, data types, loops, and functions. This strong foundation will make transitioning to Node.js smoother.
2. Explore Node.js Fundamentals: Familiarize yourself with Node.js core modules, its event-driven architecture, and the npm (Node Package Manager). Learn how to create a simple server, handle HTTP requests, and work with asynchronous operations, which are essential in Node.js development.
3. Build RESTful APIs: Django developers often work with RESTful APIs. Node.js excels in creating APIs as well. Learn how to create APIs using frameworks like Express.js, which simplifies the process of building robust and scalable APIs.
4. Database Integration: Just like Django's ORM, Node.js has libraries and frameworks (such as Mongoose for MongoDB) for working with databases. Learn how to connect, query, and manage databases in Node.js.
5. Authentication and Authorization: Study authentication and authorization techniques in Node.js. This knowledge will be valuable when building secure applications.
6. Real-time Applications: Node.js is renowned for its real-time capabilities. Explore technologies like WebSockets and Socket.io to build real-time features in your applications.
7. Testing and Debugging: Node.js has a robust ecosystem for testing and debugging. Learn how to write unit tests, perform integration testing, and debug effectively.
8. Scalability and Deployment: Node.js is well-suited for building scalable applications. Understand concepts like clustering and load balancing. Learn how to deploy Node.js applications to platforms like Heroku or AWS.
9. Explore Frameworks: Just as Django is built on Python, Node.js has various frameworks. Consider diving into frameworks like Express.js, Nest.js, or Meteor.js to streamline your development process.
10. Projects and Practice: The best way to learn Node.js is through hands-on projects. Start with small projects and gradually work your way up to more complex applications. Building a portfolio of Node.js projects will demonstrate your skills to potential employers or clients.
By combining your Django expertise with Node.js, you'll become a versatile full-stack developer, capable of creating a wide range of web applications and services. Embrace the learning process, stay curious, and enjoy the journey of mastering Node.js as a Django developer.
0 notes
Photo
hydralisk98′s web projects tracker:
Core principles=
Fail faster
‘Learn, Tweak, Make’ loop
This is meant to be a quick reference for tracking progress made over my various projects, organized by their “ultimate target” goal:
(START)
(Website)=
Install Firefox
Install Chrome
Install Microsoft newest browser
Install Lynx
Learn about contemporary web browsers
Install a very basic text editor
Install Notepad++
Install Nano
Install Powershell
Install Bash
Install Git
Learn HTML
Elements and attributes
Commenting (single line comment, multi-line comment)
Head (title, meta, charset, language, link, style, description, keywords, author, viewport, script, base, url-encode, )
Hyperlinks (local, external, link titles, relative filepaths, absolute filepaths)
Headings (h1-h6, horizontal rules)
Paragraphs (pre, line breaks)
Text formatting (bold, italic, deleted, inserted, subscript, superscript, marked)
Quotations (quote, blockquote, abbreviations, address, cite, bidirectional override)
Entities & symbols (&entity_name, &entity_number,  , useful HTML character entities, diacritical marks, mathematical symbols, greek letters, currency symbols, )
Id (bookmarks)
Classes (select elements, multiple classes, different tags can share same class, )
Blocks & Inlines (div, span)
Computercode (kbd, samp, code, var)
Lists (ordered, unordered, description lists, control list counting, nesting)
Tables (colspan, rowspan, caption, colgroup, thead, tbody, tfoot, th)
Images (src, alt, width, height, animated, link, map, area, usenmap, , picture, picture for format support)
old fashioned audio
old fashioned video
Iframes (URL src, name, target)
Forms (input types, action, method, GET, POST, name, fieldset, accept-charset, autocomplete, enctype, novalidate, target, form elements, input attributes)
URL encode (scheme, prefix, domain, port, path, filename, ascii-encodings)
Learn about oldest web browsers onwards
Learn early HTML versions (doctypes & permitted elements for each version)
Make a 90s-like web page compatible with as much early web formats as possible, earliest web browsers’ compatibility is best here
Learn how to teach HTML5 features to most if not all older browsers
Install Adobe XD
Register a account at Figma
Learn Adobe XD basics
Learn Figma basics
Install Microsoft’s VS Code
Install my Microsoft’s VS Code favorite extensions
Learn HTML5
Semantic elements
Layouts
Graphics (SVG, canvas)
Track
Audio
Video
Embed
APIs (geolocation, drag and drop, local storage, application cache, web workers, server-sent events, )
HTMLShiv for teaching older browsers HTML5
HTML5 style guide and coding conventions (doctype, clean tidy well-formed code, lower case element names, close all html elements, close empty html elements, quote attribute values, image attributes, space and equal signs, avoid long code lines, blank lines, indentation, keep html, keep head, keep body, meta data, viewport, comments, stylesheets, loading JS into html, accessing HTML elements with JS, use lowercase file names, file extensions, index/default)
Learn CSS
Selections
Colors
Fonts
Positioning
Box model
Grid
Flexbox
Custom properties
Transitions
Animate
Make a simple modern static site
Learn responsive design
Viewport
Media queries
Fluid widths
rem units over px
Mobile first
Learn SASS
Variables
Nesting
Conditionals
Functions
Learn about CSS frameworks
Learn Bootstrap
Learn Tailwind CSS
Learn JS
Fundamentals
Document Object Model / DOM
JavaScript Object Notation / JSON
Fetch API
Modern JS (ES6+)
Learn Git
Learn Browser Dev Tools
Learn your VS Code extensions
Learn Emmet
Learn NPM
Learn Yarn
Learn Axios
Learn Webpack
Learn Parcel
Learn basic deployment
Domain registration (Namecheap)
Managed hosting (InMotion, Hostgator, Bluehost)
Static hosting (Nertlify, Github Pages)
SSL certificate
FTP
SFTP
SSH
CLI
Make a fancy front end website about
Make a few Tumblr themes
===You are now a basic front end developer!
Learn about XML dialects
Learn XML
Learn about JS frameworks
Learn jQuery
Learn React
Contex API with Hooks
NEXT
Learn Vue.js
Vuex
NUXT
Learn Svelte
NUXT (Vue)
Learn Gatsby
Learn Gridsome
Learn Typescript
Make a epic front end website about
===You are now a front-end wizard!
Learn Node.js
Express
Nest.js
Koa
Learn Python
Django
Flask
Learn GoLang
Revel
Learn PHP
Laravel
Slim
Symfony
Learn Ruby
Ruby on Rails
Sinatra
Learn SQL
PostgreSQL
MySQL
Learn ORM
Learn ODM
Learn NoSQL
MongoDB
RethinkDB
CouchDB
Learn a cloud database
Firebase, Azure Cloud DB, AWS
Learn a lightweight & cache variant
Redis
SQLlite
NeDB
Learn GraphQL
Learn about CMSes
Learn Wordpress
Learn Drupal
Learn Keystone
Learn Enduro
Learn Contentful
Learn Sanity
Learn Jekyll
Learn about DevOps
Learn NGINX
Learn Apache
Learn Linode
Learn Heroku
Learn Azure
Learn Docker
Learn testing
Learn load balancing
===You are now a good full stack developer
Learn about mobile development
Learn Dart
Learn Flutter
Learn React Native
Learn Nativescript
Learn Ionic
Learn progressive web apps
Learn Electron
Learn JAMstack
Learn serverless architecture
Learn API-first design
Learn data science
Learn machine learning
Learn deep learning
Learn speech recognition
Learn web assembly
===You are now a epic full stack developer
Make a web browser
Make a web server
===You are now a legendary full stack developer
[...]
(Computer system)=
Learn to execute and test your code in a command line interface
Learn to use breakpoints and debuggers
Learn Bash
Learn fish
Learn Zsh
Learn Vim
Learn nano
Learn Notepad++
Learn VS Code
Learn Brackets
Learn Atom
Learn Geany
Learn Neovim
Learn Python
Learn Java?
Learn R
Learn Swift?
Learn Go-lang?
Learn Common Lisp
Learn Clojure (& ClojureScript)
Learn Scheme
Learn C++
Learn C
Learn B
Learn Mesa
Learn Brainfuck
Learn Assembly
Learn Machine Code
Learn how to manage I/O
Make a keypad
Make a keyboard
Make a mouse
Make a light pen
Make a small LCD display
Make a small LED display
Make a teleprinter terminal
Make a medium raster CRT display
Make a small vector CRT display
Make larger LED displays
Make a few CRT displays
Learn how to manage computer memory
Make datasettes
Make a datasette deck
Make floppy disks
Make a floppy drive
Learn how to control data
Learn binary base
Learn hexadecimal base
Learn octal base
Learn registers
Learn timing information
Learn assembly common mnemonics
Learn arithmetic operations
Learn logic operations (AND, OR, XOR, NOT, NAND, NOR, NXOR, IMPLY)
Learn masking
Learn assembly language basics
Learn stack construct’s operations
Learn calling conventions
Learn to use Application Binary Interface or ABI
Learn to make your own ABIs
Learn to use memory maps
Learn to make memory maps
Make a clock
Make a front panel
Make a calculator
Learn about existing instruction sets (Intel, ARM, RISC-V, PIC, AVR, SPARC, MIPS, Intersil 6120, Z80...)
Design a instruction set
Compose a assembler
Compose a disassembler
Compose a emulator
Write a B-derivative programming language (somewhat similar to C)
Write a IPL-derivative programming language (somewhat similar to Lisp and Scheme)
Write a general markup language (like GML, SGML, HTML, XML...)
Write a Turing tarpit (like Brainfuck)
Write a scripting language (like Bash)
Write a database system (like VisiCalc or SQL)
Write a CLI shell (basic operating system like Unix or CP/M)
Write a single-user GUI operating system (like Xerox Star’s Pilot)
Write a multi-user GUI operating system (like Linux)
Write various software utilities for my various OSes
Write various games for my various OSes
Write various niche applications for my various OSes
Implement a awesome model in very large scale integration, like the Commodore CBM-II
Implement a epic model in integrated circuits, like the DEC PDP-15
Implement a modest model in transistor-transistor logic, similar to the DEC PDP-12
Implement a simple model in diode-transistor logic, like the original DEC PDP-8
Implement a simpler model in later vacuum tubes, like the IBM 700 series
Implement simplest model in early vacuum tubes, like the EDSAC
[...]
(Conlang)=
Choose sounds
Choose phonotactics
[...]
(Animation ‘movie’)=
[...]
(Exploration top-down ’racing game’)=
[...]
(Video dictionary)=
[...]
(Grand strategy game)=
[...]
(Telex system)=
[...]
(Pen&paper tabletop game)=
[...]
(Search engine)=
[...]
(Microlearning system)=
[...]
(Alternate planet)=
[...]
(END)
4 notes
·
View notes
Text
TypeScript
What is a Typescript development company?
We are early users of Microsoft TypeScript (TS), which we utilize in conjunction with a variety of JS-based frameworks to create faultless coding environments. This leads to quicker and higher-quality website and application delivery. WebFocus, as a top web development business, has skilled TypeScript developers on staff that investigates, innovate, and grasp the newest technologies for developing and delivering large-scale applications.
Why Should You Choose TypeScript Development company?
If you select TypeScript Development company, it enhances the developer experience by extending JavaScript. It allows developers to provide type safety in their projects. TypeScript also includes features such as interfaces, type aliases, abstract classes, function overloading, tuples, generics, and so on.
JavaScript has been improved.
Amazing Versatility
Groundbreaking innovation
Wide Range
What are the various Typescript development services?
WebFocus TypeScript professionals have vast expertise creating websites and applications with typescript’s rich capabilities. To offer bespoke TypeScript Applications to our clients, our developers study, create, and understand the newest TypeScript development services technology.
Solution for Enterprise Applications
Development of Web Applications
Application Development in TypeScript
Services for Consultation
Quality Control and Testing
24*7 Maintenance and Support
Updating and Migrating
What are the different frameworks used in Typescript development?
TypeScript has grown in popularity over the years, and several famous frameworks have begun to support it or have switched entirely to it. We will provide insights into the various frameworks created with TypeScript.
Framework Nest.js
Nest.js is a TypeScript framework inspired by Angular and the most popular in 2022. It was created using the Angular module framework. NestJS is a cutting-edge Node.js framework for creating scalable Node.js web applications using current Javascript and Typescript. It was established in 2018, and it has seen rapid acceptance and overtaken Node.js frameworks with the exception of Koa and Express, which remain quite popular in the Node.js and JavaScript ecosystems.
Framework Feathers.JS
Feathers is a lightweight web framework that may be used to create real-time apps and REST APIs in JavaScript or TypeScript web development companies. It is the second most popular Typescript framework, according to our statistics. Feathers.js has over 14k Github Stars and over 3.6k Github Usage at the time of writing. Furthermore, it has a greatest 3-month download record of 52k between April 17, 2022, and July 10, 2022, and most crucially, the codebase is composed of around 93.9% Typescript according to GitHub data.
Framework for LoopbackJS
Loopback 4 is a Typescript framework for creating microservices and APIs that is extremely scalable and adaptable. Loopback just updated to Typescript in version 4 of the framework, which is the topic of this article.
As of the time of writing, Loopback had over 4.2k Github Stars and about 7,000+ Github Usage.
Furthermore, it has the greatest 3-month download record of 58.9k between April 17, 2022, and July 10, 2022, and most crucially, the codebase is composed of around 74.5% Typescript according to GitHub data.
How much do Typescript Development Services cost?
There’s no denying that TypeScript development outsourcing reputation is skyrocketing while keeping exceptionally high levels of developer engagement. Unfortunately, being an upgrade over JavaScript and an expansion of its syntax has a cost – it necessitates creating more code, which takes more work and costs more money. Expenditures are difficult to generalize because labor prices vary so greatly among nations, but we make certain that costs normally fit within the authorized budgets. Inform the details so that you can receive a reaction within 24 hours.
To read full content of the website visit : best typescript outsourcing company
0 notes
Text
Teacode technologies
TEACODE TECHNOLOGIES FULL
TEACODE TECHNOLOGIES REGISTRATION
TEACODE TECHNOLOGIES SOFTWARE
TEACODE TECHNOLOGIES CODE
Its Registered Address and Contact Email are 'A/221 MONALISA RESIDENCY VILLAGE VADODARA VODODARA Vadodara GJ 390011 IN' and respectively.
TEACODE TECHNOLOGIES REGISTRATION
They are: Hiren Buhecha and Alpeshkumar Kanaiyalal Prajapati.Īs per the records of Ministry of Corporate Affairs (MCA), Teacode Technologies Private Limited's last Annual General Meeting (AGM) was held on Oct 30, 2019, and the date of lastest Balance Sheet is Mar 31, 2019.Ĭorporate Identification Number (CIN) of Teacode Technologies Private Limited is U72200GJ2018PTC101974 and its Registration Number is 101974. There are 2 Directors associated with Teacode Technologies Private Limited. It is a Non-govt company with an Authorized Capital of ₹ 50,000 (Fifty Thousand Indian Rupees) and Paid Up Capital of ₹ 50,000 (Fifty Thousand Indian Rupees). It is registered with Registrar of Companies, Ahmedabad on Apr 23, 2018.Ĭurrent Status of Teacode Technologies Private Limited is Active.
TEACODE TECHNOLOGIES CODE
Bartek : As a developer I like to learn every day in my work, in TeaCode I can do it thanks to interesting projects and challenges, but also great code review policy, strong team cooperation and many knowledge sharing events and initiatives.TEACODE TECHNOLOGIES PRIVATE LIMITED is a Private Company limited by Shares.
Thanks to that we create an app not just a separate section. Every person on the project knows what the frontend and backend looks like and how it works.
TEACODE TECHNOLOGIES FULL
Matt : Our great value is that we work on our projects in a full stack way. What did you find most impressive about them They helped me choose the right technology stack and kept very up-to-date with project management tools.
Tech stack : React, React Native, Gatsby, MaterialUI, React Query, React Native Geolocation, AWS (Lambda Functions, DynamoDB, AppSync).
Project 2 : A British app encouraging children to have fun on a fresh air.
Tech stack : React Native, AWS (Amplify : Cognito, S3, Lambda, AppsSync, DynamoDB), Firebase Services, admin panel : Next.
Project 1 : A Californian startup for social media travel industry.
Methodology : Scrum - two week sprints, daily meetings, retro / planning session.
Playwright, Cypress, Jest, TypeScript, React Native Detox, Appium, Testrail, Mocha, K6.
Slack, Github / Gitlab, Asana, Clickup, Jira, Figma, Notion, Confluence, Sentry, Miro, Toggl, Google Workspace.
Node.js, AWS, Amplify, Nest.js, Express, Fastify, MongoDB, Postgresql, TypeScript, Cloudformation, Firebase, Elasticsearch, Serverless.
TypeScript, React (Functional Components, Hooks, Context API), Styled components, Next.js, Redux, Storybook, Webpack, Babel, Prettier, Eslint, GitHub Actions, GitLab, React Native.
technical interview with our developers.
recruitment task - we do our best to make it a real life case.
entry interview with Joanna - our Talent Acquisition Specialist.
What does the recruitment process look like?
last but not least we work together, we party together.
the office full of sweet and spicy snacks but also fresh fruits and vegetables.
table football - we take those gameplays very seriously.
We have monthly meetings that summarise our achievements, allow us to talk in-depth about some of the projects and set our priorities for the upcoming month
active participation in the life of TeaCode - we share our success stories as well as learn from each other's mistakes.
We are looking for experienced developers and freshers also for PHP and who have clear concept of.
workstation equipment (MacBook Pros, additional screen) Teacode Technology is hiring PHP developers with expertise in PHP, Laravel, Codeigniter etc.
technical university degree (preferably IT related faculty).
speaking and writing in English on a very good level (B2).
at least 3 years of experience on both frontend and backend side using React.js and Node.js.
we have clients from all over the world is a Information Technology And Services company and has headquarters in Vadodara, Gujarat, India.
we work on one programming language JavaScript (React.js on the frontend side and Node.js on the backend side).
TEACODE TECHNOLOGIES SOFTWARE
we are a software house based in Warsaw.That will serve as an UI framework with its own database. We are working on an internal tool for a client from the cryptocurrency industry.
0 notes
Text
Create a Multi-Tenancy Application in Nest.js Pt 4
Create a Multi-Tenancy Application in Nest.js Pt 4
Introduction Authentication and Authorization are essential parts of most applications. There are many different approaches and strategies to handle authentication. This article presents the same production that can be adapted. We will use Nest.js to build the following: The user needs to log in using /login endpoint. After login, you will get a token. Any user has roles and privileges. Users…
View On WordPress
0 notes
Text
Building a modern app using Nest.js, MongoDB and Vue.js
Introduction
Nest.js introduces a modern way of building Node.js apps by giving it a proper and modular structure out of the box. It was fully built with TypeScript but still preserves compatibility with plain JavaScript.
In this post, I will introduce and explain the fundamental steps to follow in order to combine this awesome framework with a modern frontend JavaScript framework such as Vue.js. You will build a web application to manage customers information. The application will be used to create a new customer, add several details about the customer and update each customer's records in the database.
The approach to this post will be to build a separate REST API backend with Nest.js and a frontend to consume this API using Vue.js. So basically, instead of building Nest.js application that uses a Node.js template engine for the client side, you will leverage on the awesomeness of Vue.js as a progressive JavaScript library to quickly render contents and handled every client-side related logic.
In addition, you will use MongoDB database to persist and retrieve data for the application. MongoDB is a schema-less NoSQL document database that can receive and store data in JSON document format. It is often use with Mongoose; an Object Data Modeling (ODM) library, that helps to manage relationships between data and provides schema validations. You learn more about this later in this tutorial.
Prerequisites
A reasonable knowledge of building applications with JavaScript is required and a basic knowledge of TypeScript will be an added advantage.
Ensure that you have Node and npm installed on your local system. Check this link for Node and here for instructions on how to install npm.
Read this article here on scotch.io to grasp the fundamental knowledge of the building blocks of Nest.js.
Install MongoDB on your local system. Follow the instructions here to download and installed it for your choice of operating system. This tutorial uses MacOS machine for development. To successfully install MongoDB, you can either install it by using homebrew on Mac or by downloading it from the MongoDB website.
A text editor installed, such as Visual Studio Code, Atom, or Sublime Text
Why Nest and Vue
Nest.js has a reputation of bringing design patterns and mature structure to node.js world. This makes it quite easy to use it as the right tool for building awesome web applications. For the fact that Nest.js uses express library under the hood.
Nest.js is fully featured and structured to support MVC (Model-View-Controller) design pattern.
This means, you can install one of the popular template engine used in node.js and configure it to handle the flow of the application and interaction with backend API from the front end.
While this might be sufficient for a small app, it is always better to consider a much better and contemporary approach to handling frontend related part of an application by leveraging on a tool like Vue.js. Vue can be used to set up the frontend logic of your application as you will see later in this post.
Vue.js is a progressive javaScript framework for building reusable components for user interfaces. It is simple and yet very powerful and ideal for any project. This makes it seamless to use for a Nest.js application for example.
As you proceed in this tutorial, you will learn how to use and successfully combine these two tools, that is, Nest.js and Vue.js to build highly interactive web app.
What you’ll build
As mentioned earlier in this post, you will build a customer list management application. To keep things really simple here, we will not be implementing authentication and authorization for any user. The main objective is for you to get conversant and comfortable using both Nest.js and Vue.js. At the end of the day, you would have learnt means to craft and structure this application as shown below:
We will use Nest.js to develop the backend API and then a Vue.js application to build components for creating, editing, deleting and showing the total list of customers from a mongoDB database.
Installing Nest.js and its dependencies
Now that the basic introductory contents have been properly covered, you will proceed to installing Nest.js and its required dependencies. Getting Nest.js installed can be done in two different ways:
Scaffold the base project with Nest CLI tool
Installing the starter project on GitHub by using Git
You will use the Nest CLI here in this tutorial to easily craft a new Nest.js project. This comes with a lot of benefits like scaffolding a new project seamlessly, generating different files by using the nest command amongst other things.
First, you need to install the CLI globally on your system. To do that, run the following command from the terminal:
npm install -g @nestjs/cli
The installation of this tool will give you access to the nest command to manage the project and create Nest.js application related files as you will see later in this post.
Now that you have the CLI installed, you can now proceed to create the project for this tutorial by running the following command from your local development folder:
nest new customer-list-app-backend
The preceding command will generate a customer-list-app-backend application. Next, change directory into this new project and install the only server dependency for the backend. As mentioned earlier, you will use MongoDB database to persist data for the application. To integrate it with a Nest.js project, you need to install mongoose and the mongoose package built by the Nest.js team. Use the following command for this purpose:
cd customer-list-app-backend npm install --save @nestjs/mongoose mongoose
Start the application
With the installation process properly covered, you can now start the application with:
npm run start
This will start the application on the default port of 3000. Navigate to http://localhost:3000 from your favorite browser and you should have a page similar to this:
Connecting with MongoDB database
It is assumed that by now, you have installed MongoDB on your machine as instructed at the beginning of this post. To start the database, open a new terminal so that the application keeps running and run sudo mongod . The preceding command will start the MongoDB service and simultaneously run the database in the background.
Next, to quickly setup a connection to the database from your application, you will have to import the installed MongooseModule within the root ApplicationModule. To do this, use your preferred code editor to open the project and locate ./src/app.module.ts. Update the contents with the following:
// ./src/app.module.ts import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { MongooseModule } from '@nestjs/mongoose'; @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost/customer-app', { useNewUrlParser: true }) ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
Here, Mongoose module for MongoDB uses the forRoot() method to supply the connection to the database.
Setting up and configuring a database schema, interfaces and DTO
To properly structure the kind of data that will be stored in the database for this application, you will create a database schema, a TypeScript and a data transfer object (DTO).
Database schema
Here, you will create a mongoose database schema that will determine the data that should be stored in the database. To begin, navigate to the ./src/ folder and first, create a new folder named customer and within the newly created folder, create another one and call it schemas. Now create a new file within the schemas and named customer.schema.ts . Open this newly created file and paste the following code in it:
// ./src/customer/schemas/customer.schema.ts import * as mongoose from 'mongoose'; export const CustomerSchema = new mongoose.Schema({ first_name: String, last_name: String, email: String, phone: String, address: String, description: String, created_at: { type: Date, default: Date.now } })
This will ensure that data with string value will be stored in the database.
Interfaces
Next, you will create a TypeScript interface which will be used for type-checking and to determine the type of values that will be received by the application. To set it up, create a new folder named interfaces within the ./src/customer folder. After that, create a new file within the newly created folder and name it customer.interface.ts . Paste the following code in it :
// ./src/customer/interfaces/customer.interface.ts import { Document } from 'mongoose'; export interface Customer extends Document { readonly first_name: string; readonly last_name: string; readonly email: string; readonly phone: string; readonly address: string; readonly description: string; readonly created_at: Date; }
Data transfer object (DTO)
A data transfer object will define how data will be sent on over the network. To do this, create a folder dto inside ./src/customer folder and create a new file create-customer.dto.ts and paste the code below in it:
// ./src/customer/dto/create-customer.dto.ts export class CreateCustomerDTO { readonly first_name: string; readonly last_name: string; readonly email: string; readonly phone: string; readonly address: string; readonly description: string; readonly created_at: Date; }
You are now done with the basic configurations of connecting and interacting with the database
Creating module, controller and service for the application
Generate modules
A module in Nest.js is identified by the @Module() decorator and it takes in objects such as controllers and providers. Here you will leverage on the nest command to easily generate a new module for the customer app. This will ensure that the application is properly structured and more organized. Stop the application, if it is currently running with CTRL + C and run the following command
nest generate module customer
This will create a new file named customer.module.ts within the src/customer folder and update the root module (i.e app.module.ts) of the application with the details of the newly created module.
// ./src/customer/customer.module.ts import { Module } from '@nestjs/common'; @Module({}) export class CustomerModule {}
You will come back to add more content to this module later in this post.
Generate service
Service also known as provider in Nest.js basically carry out the task of abstracting logic away from controllers. With it in place, a controller will only carry out the functionality of handling HTTP requests from the frontend and delegate the complex tasks to services. Service or provider in Nest.js is identified by adding @Injectable() decorator on top of them.
Generate a new service using the nest command by running the following command from the terminal within the project directory:
nest generate service customer
After successfully running the command above, two new files will be created. They are:
customer.service.ts: this is the main service file with @Injectable() decorator
customer.service.spec.ts: a file for unit testing. You can ignore this file for now as testing will not be covered in this tutorial.
The customer.service.ts file holds all the logic as regards database interaction for creating and updating every details of a new customer. In a nutshell, the service will receive a request from the controller, communicate this to the database and return an appropriate response afterwards.
Open the newly created customer.service.ts file and replace the existing code with the following :
// ./src/customer/customer.service.ts import { Injectable } from '@nestjs/common'; import { Model } from 'mongoose'; import { InjectModel } from '@nestjs/mongoose'; import { Customer } from './interfaces/customer.interface'; import { CreateCustomerDTO } from './dto/create-customer.dto'; @Injectable() export class CustomerService { constructor(@InjectModel('Customer') private readonly customerModel: Model<Customer>) { } // fetch all customers async getAllCustomer(): Promise<Customer[]> { const customers = await this.customerModel.find().exec(); return customers; } // Get a single customer async getCustomer(customerID): Promise<Customer> { const customer = await this.customerModel.findById(customerID).exec(); return customer; } // post a single customer async addCustomer(createCustomerDTO: CreateCustomerDTO): Promise<Customer> { const newCustomer = await this.customerModel(createCustomerDTO); return newCustomer.save(); } // Edit customer details async updateCustomer(customerID, createCustomerDTO: CreateCustomerDTO): Promise<Customer> { const updatedCustomer = await this.customerModel .findByIdAndUpdate(customerID, createCustomerDTO, { new: true }); return updatedCustomer; } // Delete a customer async deleteCustomer(customerID): Promise<any> { const deletedCustomer = await this.customerModel.findByIdAndRemove(customerID); return deletedCustomer; } }
Here, you imported the required module from @nestjs/common, mongoose and @nestjs/mongoose. In addition, you also imported the interface created earlier named Customer and a data transfer object CreateCustomerDTO.
In order to be able to seamlessly carry out several database related activities such as, creating a customer, retrieving the list of customers or just a single customer, you used the @InjectModel method to inject the Customer model into the CustomerService class.
Next, you created the following methods:
getAllCustomer() : to retrieve and return the list of customers from the database
getCustomer(): it takes customerID as a parameter and based on that, it will search and return the details of a user identified by that ID.
addCustomer(): used to add a new customer to the database
updateCustomer(): this method also takes the ID of a customer as an argument and will be used to edit and update the details of such customer in the database.
deleteCustomer(): this will be used to delete the details of a particular customer completely from the database.
Generate controller
Handling each route within the application is one of the major responsibility of controllers in Nest.js. Similar to most JavaScript server-side framework for the web, several endpoints will be created and any requests sent to such endpoint from the client side will be mapped to a specific method within the controller and an appropriate response will be returned.
Again, you will use the nest command to generate the controller for this application. To achieve that, run the following command:
nest generate controller customer
This command will also generate two new files within the src/customer, they are , customer.controller.spec.ts and customer.controller.ts files respectively. The customer.controller.ts file is the actual controller file and the second one should be ignored for now. Controllers in Nest.js are TypeScript files decorated with @Controller metadata.
Now open the controller and replace the content with the following code that contains methods to create a new customer, retrieve the details of a particular customer and fetch the list of all customers from the database:
// ./src/customer/customer.controller.ts import { Controller, Get, Res, HttpStatus, Post, Body, Put, Query, NotFoundException, Delete, Param } from '@nestjs/common'; import { CustomerService } from './customer.service'; import { CreateCustomerDTO } from './dto/create-customer.dto'; @Controller('customer') export class CustomerController { constructor(private customerService: CustomerService) { } // add a customer @Post('/create') async addCustomer(@Res() res, @Body() createCustomerDTO: CreateCustomerDTO) { const customer = await this.customerService.addCustomer(createCustomerDTO); return res.status(HttpStatus.OK).json({ message: "Customer has been created successfully", customer }) } // Retrieve customers list @Get('customers') async getAllCustomer(@Res() res) { const customers = await this.customerService.getAllCustomer(); return res.status(HttpStatus.OK).json(customers); } // Fetch a particular customer using ID @Get('customer/:customerID') async getCustomer(@Res() res, @Param('customerID') customerID) { const customer = await this.customerService.getCustomer(customerID); if (!customer) throw new NotFoundException('Customer does not exist!'); return res.status(HttpStatus.OK).json(customer); } }
In order to interact with the database, the CustomerService was injected into the controller via the class constructor(). The addCustomer() and getAllCustomer() methods will be used to add a new customer’s details and retrieve the list of customers while the getCustomer() receives the customerID as a query parameter and throw an exception if the customer does not exist in the database.
Next, you need to be able to update and delete the details of a customer where and when necessary. For this you will add two more methods to the CustomerController class. Open the file again and add this:
// ./src/customer/customer.controller.ts ... @Controller('customer') export class CustomerController { constructor(private customerService: CustomerService) { } ... // Update a customer's details @Put('/update') async updateCustomer(@Res() res, @Query('customerID') customerID, @Body() createCustomerDTO: CreateCustomerDTO) { const customer = await this.customerService.updateCustomer(customerID, createCustomerDTO); if (!customer) throw new NotFoundException('Customer does not exist!'); return res.status(HttpStatus.OK).json({ message: 'Customer has been successfully updated', customer }); } // Delete a customer @Delete('/delete') async deleteCustomer(@Res() res, @Query('customerID') customerID) { const customer = await this.customerService.deleteCustomer(customerID); if (!customer) throw new NotFoundException('Customer does not exist'); return res.status(HttpStatus.OK).json({ message: 'Customer has been deleted', customer }) } }
Update the customer module
To keep things properly organised go back to the customer.module.ts and set up the Customer model. Update the content with the following:
// ./src/customer/customer.module.ts import { Module } from '@nestjs/common'; import { CustomerController } from './customer.controller'; import { CustomerService } from './customer.service'; import { MongooseModule } from '@nestjs/mongoose'; import { CustomerSchema } from './schemas/customer.schema'; @Module({ imports: [ MongooseModule.forFeature([{ name: 'Customer', schema: CustomerSchema }]) ], controllers: [CustomerController], providers: [CustomerService] }) export class CustomerModule { }
Enable CORS
By default, it is forbidden for two separate application on different ports to interact or share resources with each other unless it is otherwise allowed by one of them, which is often the server-side. In order to allow request from the client side that will be built with Vue.js, you will need to enable CORS (Cross-Origin Resource Sharing).
To do that in Nest.js, you only need to add app.enableCors() to the main.ts file as shown below:
// ./src/main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors(); // add this line await app.listen(3000); } bootstrap();
With this, you have just completed the backend part of the application and can now proceed to build the frontend with Vue.js
Creating the frontend app with Vue.js
The team at Vue.js already created an awesome tool named Vue CLI. It is a standard tool that allows you to quickly generate and install a new Vue.js project with ease. You will use that here to create the frontend part of the customer app, but first you need to install Vue CLI globally on your machine.
Open a new terminal and run:
npm install -g @vue/cli
Once the installation process is complete, you can now use the vue create command to craft a new Vue.js project. Run the following command to do that for this project:
vue create customer-list-app-frontend
Immediately after you hit return, you will be prompted to pick a preset. You can choose manually select features:
Next, check the features you will need for this project by using the up and down arrow key on your keyboard to navigate through the list of features. Press the spacebar to select a feature from the list. Select Babel, Router and Linter / Formatter as shown here:
Hitting return here will show you another list of options For other instructions, type y to use history mode for a router, this will ensure that history mode is enabled within the router file that will automatically be generated for this project.
Next, select ESLint with error prevention only in order to pick a linter / formatter config. After that, select Lint on save for additional lint features and save your configuration in a dedicated config file for future projects. Type a name for your preset, I named mine vuescotch:
This will create a Vue.js application in a directory named customer-list-app-frontend and install all its required dependencies.
Run the Vue.js app
You can now change directory into the newly created project and start the application with:
// change directory cd customer-list-app-frontend // run the application npm run server
You can now view the application on http://localhost:8080
Install axios
Axios, a promised based HTTP client for browser will be used here to perform HTTP requests from different component within the application. Stop the frontend application from running by hitting CTRL + C from the terminal and run the following command afterwards:
npm install axios --save
Once the installation process is completed, open the customer-list-app-frontend within a code editor and create a new file named helper.js within the src folder. Open the newly created file and paste the following content in it:
// ./src/helper.js export const server = { baseURL: 'http://localhost:3000' }
What you have done here is to define the `baseURL` for the backend project built with Nest.js. This is just to ensure that you don’t have to start declaring this URL within several Vue.js components that you will create in the next section.
Create reusable components
Vue.js favours building and structuring applications by creating reusable components to give it a proper structure. Vue.js components contains three different sections, which are
<template></template>
<script></script>
<style></style>.
Create customer component
You will start by creating a component within the application for a user to create a customer. This component will contain a form with few input fields required to accepts details of a customer and once the form is submitted, the details from the input fields will be posted to the server. To achieve this, create a new folder named customer within the ./src/components folder. This newly created folder will house all the components for this application. Next, create another file within the customer folder and name it Create.vue. Open this new file and add the following:
// ./src/components/customer/Create.vue <template> <div> <div class="col-md-12 form-wrapper"> <h2> Create Customer </h2> <form id="create-post-form" @submit.prevent="createCustomer"> <div class="form-group col-md-12"> <label for="title"> First Name </label> <input type="text" id="first_name" v-model="first_name" name="title" class="form-control" placeholder="Enter firstname"> </div> <div class="form-group col-md-12"> <label for="title"> Last Name </label> <input type="text" id="last_name" v-model="last_name" name="title" class="form-control" placeholder="Enter Last name"> </div> <div class="form-group col-md-12"> <label for="title"> Email </label> <input type="text" id="email" v-model="email" name="title" class="form-control" placeholder="Enter email"> </div> <div class="form-group col-md-12"> <label for="title"> Phone </label> <input type="text" id="phone_number" v-model="phone" name="title" class="form-control" placeholder="Enter Phone number"> </div> <div class="form-group col-md-12"> <label for="title"> Address </label> <input type="text" id="address" v-model="address" name="title" class="form-control" placeholder="Enter Address"> </div> <div class="form-group col-md-12"> <label for="description"> Description </label> <input type="text" id="description" v-model="description" name="description" class="form-control" placeholder="Enter Description"> </div> <div class="form-group col-md-4 pull-right"> <button class="btn btn-success" type="submit"> Create Customer </button> </div> </form> </div> </div> </template>
This is the <template></template> section that contains the details of the input fields. Next, paste the following code just after the end of the </template> tag:
// ./src/components/customer/Create.vue ... <script> import axios from "axios"; import { server } from "../../helper"; import router from "../../router"; export default { data() { return { first_name: "", last_name: "", email: "", phone: "", address: "", description: "" }; }, methods: { createCustomer() { let customerData = { first_name: this.first_name, last_name: this.last_name, email: this.email, phone: this.phone, address: this.address, description: this.description }; this.__submitToServer(customerData); }, __submitToServer(data) { axios.post(`${server.baseURL}/customer/create`, data).then(data => { router.push({ name: "home" }); }); } } }; </script>
Here, you created a method createCustomer() to receive the details of a customer via the input fields and used axios to post the data to the server.
Edit component
Similar to the CreateCustomer component, you need to create another component to edit customer’s details. Navigate to ./src/components/customer and create a new file named Edit.vue. Paste the following code in it:
// ./src/components/customer/Edit.vue <template> <div> <h4 class="text-center mt-20"> <small> <button class="btn btn-success" v-on:click="navigate()"> View All Customers </button> </small> </h4> <div class="col-md-12 form-wrapper"> <h2> Edit Customer </h2> <form id="create-post-form" @submit.prevent="editCustomer"> <div class="form-group col-md-12"> <label for="title"> First Name </label> <input type="text" id="first_name" v-model="customer.first_name" name="title" class="form-control" placeholder="Enter firstname"> </div> <div class="form-group col-md-12"> <label for="title"> Last Name </label> <input type="text" id="last_name" v-model="customer.last_name" name="title" class="form-control" placeholder="Enter Last name"> </div> <div class="form-group col-md-12"> <label for="title"> Email </label> <input type="text" id="email" v-model="customer.email" name="title" class="form-control" placeholder="Enter email"> </div> <div class="form-group col-md-12"> <label for="title"> Phone </label> <input type="text" id="phone_number" v-model="customer.phone" name="title" class="form-control" placeholder="Enter Phone number"> </div> <div class="form-group col-md-12"> <label for="title"> Address </label> <input type="text" id="address" v-model="customer.address" name="title" class="form-control" placeholder="Enter Address"> </div> <div class="form-group col-md-12"> <label for="description"> Description </label> <input type="text" id="description" v-model="customer.description" name="description" class="form-control" placeholder="Enter Description"> </div> <div class="form-group col-md-4 pull-right"> <button class="btn btn-success" type="submit"> Edit Customer </button> </div> </form> </div> </div> </template> <script> import { server } from "../../helper"; import axios from "axios"; import router from "../../router"; export default { data() { return { id: 0, customer: {} }; }, created() { this.id = this.$route.params.id; this.getCustomer(); }, methods: { editCustomer() { let customerData = { first_name: this.customer.first_name, last_name: this.customer.last_name, email: this.customer.email, phone: this.customer.phone, address: this.customer.address, description: this.customer.description }; axios .put( `${server.baseURL}/customer/update?customerID=${this.id}`, customerData ) .then(data => { router.push({ name: "home" }); }); }, getCustomer() { axios .get(`${server.baseURL}/customer/customer/${this.id}`) .then(data => (this.customer = data.data)); }, navigate() { router.go(-1); } } }; </script>
The route parameter was used here to fetch the details of a customer from the database and populated the inputs fields with it. As a user of the application, you can now edit the details and submit back to the server.
The editCustomer() method within the <script></script> was used to send a PUT HTTP request to the server.
View all customer
Finally, to fetch and show the complete list of customers from the server, you will create a new component. Navigate to the views folder within the src folder, you should see a Home.vue file, if otherwise, create it and paste this code in it:
// ./src/views/Home.vue <template> <div class="container-fluid"> <div class="text-center"> <h1>Nest Customer List App Tutorial</h1> <p> Built with Nest.js, Vue.js and MongoDB</p> <div v-if="customers.length === 0"> <h2> No customer found at the moment </h2> </div> </div> <div class=""> <table class="table table-bordered"> <thead class="thead-dark"> <tr> <th scope="col">Firstname</th> <th scope="col">Lastname</th> <th scope="col">Email</th> <th scope="col">Phone</th> <th scope="col">Address</th> <th scope="col">Description</th> <th scope="col">Actions</th> </tr> </thead> <tbody> <tr v-for="customer in customers" :key="customer._id"> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> <div class="d-flex justify-content-between align-items-center"> <div class="btn-group" style="margin-bottom: 20px;"> <router-link :to="{name: 'Edit', params: {id: customer._id}}" class="btn btn-sm btn-outline-secondary">Edit Customer </router-link> <button class="btn btn-sm btn-outline-secondary" v-on:click="deleteCustomer(customer._id)">Delete Customer</button> </div> </div> </td> </tr> </tbody> </table> </div> </div> </template> <script> import { server } from "../helper"; import axios from "axios"; export default { data() { return { customers: [] }; }, created() { this.fetchCustomers(); }, methods: { fetchCustomers() { axios .get(`${server.baseURL}/customer/customers`) .then(data => (this.customers = data.data)); }, deleteCustomer(id) { axios .delete(`${server.baseURL}/customer/delete?customerID=${id}`) .then(data => { console.log(data); window.location.reload(); }); } } }; </script>
Within <template> section, you created an HTML table to display all customers details and used the <router-link> to create a link for editing and to a view a single customer by passing the customer._id as a query parameter. And finally, within the <script> section of this file, you created a method named fetchCustomers() to fetch all customers from the database and updated the page with the data returned from the server.
Update App.vue
Open the AppComponent of the application and update it with the links to both Home and Create component by using the content below:
// ./src/App.vue <template> <div id="app"> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/create">Create</router-link> </div> <router-view/> </div> </template> <style> ... .form-wrapper { width: 500px; margin: 0 auto; } </style>
Also included is a <style></style> section to include styling for the forms.
Include Bootstrap
Navigate to the index.html file within the public folder and include the CDN file for bootstrap as shown below. This is just to give the page some default style:
<!DOCTYPE html> <html lang="en"> <head> ... <!-- Add this line --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <title>customer-list-app-frontend</title> </head> <body> ... </body> </html>
Setting up routing
Finally, configure the router file within ./src/router.js to include the link to all the required reusable components created so far by updating its content as shown here:
// ./src/router.js import Vue from 'vue' import Router from 'vue-router' import HomeComponent from '@/views/Home'; import EditComponent from '@/components/customer/Edit'; import CreateComponent from '@/components/customer/Create'; Vue.use(Router) export default new Router({ mode: 'history', routes: [ { path: '/', redirect: { name: 'home' } }, { path: '/home', name: 'home', component: HomeComponent }, { path: '/create', name: 'Create', component: CreateComponent }, { path: '/edit/:id', name: 'Edit', component: EditComponent }, ] });
Test the application
You can now proceed to test the application by running npm run serve to start it and navigate to http://localhost:8080 to view it:
Ensure that the backend server is running at this moment, if otherwise, navigate to the backend application from a different terminal and run:
npm run start
Lastly, also ensure that the MongoDB instance is running as well. Use sudo mongod from another terminal on your local system, if it is not running at the moment.
Create new customer
Homepage ( View all customers )
Edit a customer details
Conclusion
In this tutorial, you have created a simple customer list management application by using Nest.js and Vue.js. Here, you used Nest.js to build a RESTful backend API and then leveraged on Vue.js to craft a client that consumes the API.
This has given you an overview of how to structure Nest.js application and integrate it with a MongoDB database.
I hope you found this tutorial helpful. Don’t hesitate to explore the source code of both application by checking it out here on GitHub.
via Scotch.io https://ift.tt/2SoUgim
0 notes