Project Report EASYSTAY

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 83

A

Project Report

On

EASYSTAY
Submitted by

MOHD DANIYAL ASHARAF (2003600100065)


ABHISHEK KUMAR GUPTA (2003600100004)
Submitted for fulfilment for the degree of

BACHELOR OF TECHNOLOGY
In

Computer Science & Engineering


Under the Supervision of

MR. DILEEP KUMAR GUPTA

GOEL INSTITUTE OF TECHNOLOGY AND MANAGEMNET LUCKNOW


Affiliated

DR. A.P.J. ABDUL KALAM TECHNICAL


UNIVERSITY, LUCKNOW

I
DEPARTMENT OF

COMPUTER SCIENCE AND ENGINEERING

GOEL INSTITUTE OF TECHNOLOGY AND MANAGEMENT

CERTIFICATE

This is to certify that the project entitled “EASYSTAY” is a Bonafide


work carried out by MOHD DANIYAL ASHRAF (2003600100065) &
ABHISHEK KUMAR GUPTA (2003600100004) in partial fulfilment
of the requirement for the award of Bachelor of Technology from Goel
Institute of Technology and Management, Lucknow. This project
embodies result of the original work carried out by students themselves
and the contents of the project do not form the basis for the award of any
degree to the candidate or anybody else.

Signature:

MR. DILEEP KUMAR GUPTA


(Assistant Professor)

II
DEPARTMENT OF

COMPUTER SCIENCE AND ENGINEERING

GOEL INSTITUTE OF TECHNOLOGY AND MANAGEMENT

DECLARATION

We hereby declare that the project entitled “EASYSTAY” submitted by


us is in partial fulfilment of the requirements for the award of the Degree
of Bachelor of Technology (Computer Science & Engineering) from
Dr. A.P.J Abdul Kalam Azad Technical University, is record of our
own work carried under the supervision and guidance of Mr. DILEEP
KUMAR GUPTA (ASSISTANT PROFESSOR)
To the best of our knowledge this project has not submitted to Dr. A.P.J
Abdul Kalam Technical University or other University or Institute for
the award of any degree.

Signature:

MOHD DANIYAL ASHRAF (2003600100065)

Signature:

ABHISHEK KUMAR GUPTA (2003600100004)

III
ACKNOWLEDGEMENT

I would like to express my deep and sincere gratitude to my supervisor


Mr. DILEEP GUPTA who gave me his full support and encouraged
me to work in an innovative and challenging project for educational
field.His wide knowledge and logical thinking gave me right direction
all the time. I am deeply grateful my project coordinator for his help
and support provided at every step of the project. Last but not the least,
I thank to all my faculty members for their support and co-operation.

ABHISHEK GUPTA MOHD DANIYAL AHSRAF


(2003600100004) (2003600100065)

IV
ABSTRACT

Finding suitable and affordable accommodation can be a challenging and time-


consuming task, especially for students and professionals who are new to an
area. EasyStay aims to address these challenges by providing a user-friendly
platform for discovering housing options. This project leverages modern web
technologies to create an efficient and convenient system for both property
owners and seekers.

The EasyStay platform offers a seamless user experience with separate


interfaces for property owners and seekers. Property owners can easily list their
accommodations, including details such as location, price, amenities, and
availability. Seekers can browse and search for accommodations based on their
preferences, view detailed listings, and contact owners directly through the
platform.

Additionally, the system includes features for users to leave reviews, rate
accommodations, and manage bookings. By integrating geolocation services,
EasyStay ensures that users can find accommodations that are conveniently
located and meet their specific needs.

Overall, EasyStay simplifies the accommodation search process, enhances


transparency, and improves the overall experience for both property owners and
seekers.

Keywords: Web-Based System, Accommodation, Online Booking, Reviews,


Geo location.

V
----- 11

----- 19

vi
VII
LIST OF FIGURES

SNO. TITLE PAGE NO.


1 Software Management Life Cycle 21
2 ER Diagram 29
3 0 level DFD 31
4 1 level DFD 32
5 2 level DFD 33
6 Top-Down Designing 35
7 Bottom-Up Designing 36

VIII
CHAPTER-1

1
INTRODUCTION
 Welcome to EASYSTAY a revolutionary platform for hassle-free housing searches. The
challenges people face in finding suitable accommodations, Difficulties in finding quality
rooms, flats, hostels, and PG’s.

 EASYSTAY is a comprehensive online platform designed to simplify the process of


finding quality living spaces. It addresses the challenges faced by individuals in search of
flats, rooms, hostels, and PGs by providing a centralized solution,

Silent features of EASYSTAY:

1- Affordability and Quality: Ensure affordability without compromising on the quality


of accommodation.

2- Customer Attraction: Social media app for easystay provide the facility to post photos
of the products and description of the product to attract the customers.

3- Business expansion: Since this app is useful for increasing the sales of products of the
vendors hence it helps to increase the business by providing good amount of funds in
form of profits by sales of other products.

4- Advertise of Rooms: There is not so much good applications or platforms for the for
the finding of room in short time. This application provides fast and easy way to find
the best room in the area where we can rented room in fast and secure way. It is also
recommended the best place in the living areas.

5- Efficient Search: Implement an efficient and effective search mechanism to save users
time.

6- User Experience: Enhance user experience through a modern and intuitive interface

7- Comprehensive Listings: Provide a user-friendly platform for users to search for


nearby accommodation options, including rooms, flats, hostels, and PGs

8- Reviews and Comments: The application should allow customers to leave


reviews and comments for products they have purchased. Positive reviews
and can enhance the seller's reputation and attract more customers.

9- Prepare the Property: Ensure the property is clean, furnished, and meets safety
standards.
10- Set Rental Terms: Decide on the rent amount, security deposit, and included

11- Advertise: Utilise online real estate platforms like

12- NoBroker: social media, or local advertising to reach the relevant tenants.

2
1.1 - OBJECTIVES

 To provide a platform for travelers to find suitable accommodations based on their


preferences and budgets.

 To offer hosts a convenient way to list their rooms for rent and manage bookings.

 To facilitate secure transactions between guests and hosts.

 To enhance the overall experience of both guests and hosts through efficient
communication and streamlined processes
.
For Gurst
 User Registration/Login: Guests can create an account or log in using existing
credentials.

 Search and Filters: Users can search for accommodations based on location, price
range, amenities, and other preferences.

 Detailed Listings: Each accommodation listing includes photos, descriptions,


reviews, and an availability calendar

 Booking and Payment: Guests can book rooms securely through the app and make
payments using various methods, including credit/debit cards or digital wallets.

 Messaging System: Guests can communicate with hosts regarding booking


inquiries, special requests, or other details

For Hosts:
 Listing Management: Hosts can easily create, edit, and manage listings for their
available rooms.

 Booking Management: Hosts can view, accept, or reject booking requests from gues

General features

 User-Friendly Interface: Provide users with a user-friendly interface for easy


navigation and efficient search for accommodations
.
 Diverse Selection of Accommodations: Offer a diverse selection of
accommodations, including hotels, hostels, vacation rentals, and home stays

 Secure Payment Processing: Implement secure payment processing for hassle-free


booking transactions.

 User Reviews and Ratings: Incorporate features for user reviews and ratings to
ensure transparency and reliability

3
1.2 - PROBLEM DEFINITION:

Many individuals, especially students and professionals, struggle to find suitable and
affordable accommodation in their preferred locations. This challenge is exacerbated by
various factors that make the search process cumbersome and frustrating.

PAIN POINTS

 Limited Options

 Insufficient Listings: Many platforms have a limited number of listings, especially


in high-demand areas, which reduces the chances of finding suitable
accommodation.
 Geographic Constraints: Listings are often concentrated in certain areas, leaving
many neighborhoods underrepresented

 Time-Consuming Searches

 Inefficient Search Tools: Existing platforms often lack advanced search and
filtering options, making it difficult to quickly find properties that meet specific
criteria.
 Fragmented Information: Users need to visit multiple websites and platforms to
gather comprehensive information, leading to a scattered and prolonged search
process

 Quality Concerns
 Inaccurate Listings: Many listings do not provide accurate or complete
information, leading to mismatched expectations.
 Poor Property Conditions: There is often a discrepancy between the advertised
quality of the property and its actual condition, resulting in unpleasant surprises.
 Unverified Reviews: Reviews and ratings on many platforms are not always
reliable or verified, making it hard to trust the feedback provided .

 Financial Transparency

 Hidden Costs: Many listings fail to disclose all associated costs upfront, such as
utility bills, maintenance fees, and other hidden charges, leading to financial
strain.
 Inconsistent Pricing: There is often a lack of standardization in pricing, with
significant variations for similar properties, creating confusion and potential
exploitation

4
1.3 – EXISTING SYSTEM DESCRIPTION

a. Before the development of Easy Stay, travelers relied on various methods to find and
book accommodations, including:

b. Manual Search: Travelers would manually search for accommodations through search
engines, travel websites, or contacting hotels directly. This process could be time-consuming
and often involved comparing prices and amenities across multiple platforms.

c. Travel Agencies: Some travelers preferred to use traditional travel agencies to assist
with booking accommodations. However, this method typically involved additional fees
and limited flexibility in terms of available options.

d. Word of Mouth: Recommendations from friends, family, or online forums played a


significant role in decision-making for many travelers. However, this approach lacked
the convenience and reliability of an organized platform.

e. Online Booking Platforms: Existing online booking platforms provided a centralized


platform for finding and booking accommodations. However, users often faced
challenges such as outdated listings, limited search filters, and impersonalized
recommendations.

f. While these methods served their purpose, they often fell short in terms of efficiency,
convenience, and user experience. EasyStay seeks to address these shortcomings by
offering a modern, user-centric platform that streamlines the process of finding and
booking accommodations for travelers worldwide.

g. The existing reference application are based on the static document concept. And
commonly these type of application are available on online.ie, online type. The content
of the application is depend on the administrator, so thus make a problem that the
pupation’s are not made directly by user.

h. There is also another problem behind that online concept that the personal information
such like text book name, details its documents are available on the existing system. This
application can overcome this problem by using system database.

i. Now user can overcome these problems by using system database and customize as per
user requirement. The objective of this application is to allow every user to edit and find
out the details and documents. It’ll also facility store new documents. And it can retrieve
within few seconds. Overall, it’ll make an easier way to access all documents and details
by using the USER application. The administrator privilege is used to update the
application contained dynamic documents. Thus it overcome all the drawback of the
existing system. It make the availability of wanted documents any time.

5
1.4 - PROPOSED SYSTEM

a. EasyStay introduces a comprehensive solution to the challenges faced by travelers in


finding and booking accommodations. The proposed system leverages cutting-edge
technology and user-centric design principles to offer a seamless and personalized
experience. Below is a detailed explanation of the proposed system:

b. User-Centric Interface: EasyStay features a user-friendly interface designed to simplify


the accommodation booking process.

c. Intuitive navigation and clear layout enhance usability, ensuring that users can quickly
find the information they need and complete bookings with minimal effort

d. Advanced Search and Filtering: The application offers advanced search and filtering
options, allowing users to specify their preferences based on location, dates, price range,
accommodation type, amenities, and more.

e. Smart search algorithms provide relevant results tailored to each user's preferences and
requirements, minimizing the time spent on browsing through irrelevant listings.

f. Diverse Accommodation Options: EasyStay provides a diverse range of accommodation


options to cater to the varying needs and preferences of travelers.

g. Users can choose from hotels, hostels, vacation rentals, home stays, boutique
accommodations, and more, ensuring that there is something suitable for every traveler
and budget.

h. Secure Booking and Payment Processing: The application implements secure booking
and payment processing mechanisms to ensure the confidentiality and integrity of user
data and financial transactions.

i. Integration with reputable payment gateways such as Stripe or PayPal enables users to
make seamless and secure payments using their preferred payment methods.

j. Transparent Reviews and Ratings: EasyStay encourages transparency and reliability by


providing users with access to detailed reviews and ratings for each accommodation.

k. Users can make informed decisions based on the experiences shared by other travelers,
fostering trust and confidence in the platform.

l. Personalized recommendations are provided to users, suggesting accommodations that


align with their preferences, past bookings, and travel patterns, thereby enhancing the
overall user experience and satisfaction.

6
CHAPTER-2

7
SYSTEM ANALYSIS

2.1- OBJECTIVES

a) Convenience for Travelers: Provide a user-friendly website where


passengers can quickly explore listings, compare options, and make
bookings based on their budget and interests to streamline the process of
discovering and booking lodging.

b) Opportunity for Hosts: Provide hosts with an easy-to-use interface for


advertising available rooms for rent, handling reservations, and
corresponding with visitors to optimize occupancy rates and revenue
possibilities for their establishments.

c) Streamlined Booking Process: Enable visitors and hosts to make secure


and effective reservations, guaranteeing openness, dependability, and
user-friendliness throughout the whole booking process.

2.2 - PHASES:
System Development Life Cycle (SDLC) mainly consists of the following 9
phases which can be detailed: -

1. Preliminary Investigation

2. Feasibility Study

3. Request Approval

4. System Analysis

5. System Design

6. Coding

7. Testing

8. Implementation

9. Maintenance

8
2.2.1 – PRELIMINARY INVESTIGATION

a) The system development life cycle begins with this phase. During this
stage, we typically ascertain the client's needs—what precisely is the client
looking for? The needs, goals, and scope of the system must be
understood before any development can begin.
b) b) This preliminary investigation report's goal is to assess whether creating
the EasyStay app is feasible. The goal of this application is to make the
process of looking for and reserving short-term lodging easier. The project
background, problem statement, objectives, methodology, findings,
requirements analysis, alternative solutions, suggestions, and conclusion
will all be covered in this report..

c) Project Background: The goal of EasyStay is to provide a platform that


links vacationers with short-term rental property owners. The goal of the
application is to guarantee dependability, security, and simplicity of use for
both hosts and guests. Such a platform is required due to the rising
popularity of the sharing economy and the growing need for flexible
housing options.

d) Problem Statement: The short-term rental market is currently fragmented,


making it difficult for consumers to find trustworthy information, compare
costs, and make sure their transactions are secure. Property managers also
have trouble keeping track of reservations, listings, and client
communications. A thorough platform that effectively tackles these issues
is obviously needed.

e) Objectives of the Preliminary Investigation: To assess the feasibility of


developing the EasyStay application.

f) f) Assessing the project's operational, financial, and technical viability.

g) g) To investigate potential fixes and suggest the best line of action.

h) h) The feasibility of creating the EasyStay application is confirmed by the


preliminary investigation. Technically, operationally, and financially, the
project is feasible, and there is a clear market need..

9
2.2.2 – FEASIBILITY STUDY

1. The second phase of the system development life cycle is the feasibility
study. In every software process, things are never difficult at first. Nothing is
actually possible with infinite time and resources. However, that is not true.
Thus, practically speaking, we have a limited amount of time and resources
to work with. Thus, the following factors need to be taken into account for
the system to be feasible. The purpose of the feasibility study is to
determine the viability of the proposed system.

2. The system that has been designed and developed is the one that has been
determined to be the best based on the criteria. The feasibility study
accounts for the risks associated with project development in advance. As a
result, we must conduct a feasibility study during this phase, which involves
testing the website's functionality, impact on the company, ability to satisfy
user needs, and efficient use of resources. We do the feasibility study for
website to analyze the risks, costs and benefits relating to economics,
technology and user organization. Various forms of feasibility exist based on
the aspects they address. Among those imported are:

3. Technical Feasibility: One significant finding from the initial research is this.
It consists of the following queries:

 Can Project Bed One be completed using the current tools, software,
and manpower available?
 In the event that technology is needed, what avenues for development
exist?

4. Economic Feasibility: It addresses issues pertaining to the economy. It


consists of the following queries:
Are the benefits of developing the system great enough to justify the
expense?
Must the project be under budget because the costs of not developing the
system would be so high?

5. Legal Feasibility: It deals with the question related to the legal issues. It
comprises of the following questions:

6. Contract Signing: Software License Agreement Signing Contract matters


pertaining to cyber laws. legal matters concerning the contract for
manpower..

10
2.2.3 - REQUEST APPROVAL

 The third stage of the system development lifecycle is request approval. The
stage of request approval is when all requirements that will be included in
the system are specified. An agreement of sorts exists between the client
and the software development company regarding the approval of the
request. The specified requirements should be accepted by both parties.

 This project approval report describes how the EasyStay application was
created to offer a smooth platform for making last-minute hotel
reservations. The project's history, goals, scope, feasibility study, project
plan, risk assessment, benefits analysis, and recommendations are all
covered in the report. The objective is to obtain authorization for the
project's initiation while emphasizing its possible benefits and feasibility..

 EasyStay provides a user-friendly platform for both hosts and guests in an


effort to revolutionize the short-term rental industry. This report describes
the plan for the project's development and implementation and offers a
thorough analysis of its viability.

 The need to address inefficiencies in the short-term rental market gave rise
to the idea for EasyStay. The smooth user experience, secure transactions,
and effective property management tools for hosts are areas where current
platforms frequently fall short. EasyStay uses cutting-edge technology and a
user-centric design philosophy to try and close these gaps...

 Creating an intuitive application to manage and schedule short-term rentals.


to offer efficient and safe transaction processing. to guarantee dependability
and scalability to accommodate an expanding user base. to provide property
owners with powerful tools for managing listings and reservations.

 Creating a mobile and web application. putting profile management and


user authentication into practice. developing a module for property listings
that includes thorough descriptions, images, and costs. creating a search
and filter feature to help users locate appropriate lodging. putting in place a
booking administration system. incorporating safe payment processors
supplying a system of ratings and reviews
.
 It is advised to move forward with the development of the EasyStay
application based on the benefits delineated and the feasibility analysis.
From a technical, operational, and financial standpoint, the project is
feasible, and there is a good chance it will be successful in the market.

11
2,2,4 – SYSTEM ANALYSIS

 Phase II is system analysis, which comes after request approval. During this
stage, we typically examine the entire system that needs to be constructed.
The critical component of the SDLC is system analysis.

 An inventive app called EasyStay was created to make the process of locating
and reserving short-term lodging easier and more enjoyable. The application
seeks to ensure a safe and user-friendly environment while offering a smooth
interface for users to search for properties, make reservations, and manage
their bookings.

 This system analysis project report aims to provide an overview of the


EasyStay application's development. The report outlines the goals,
specifications, architecture, design, and implementation techniques required
to successfully develop and launch the application. Stakeholders in the
project are among the target audience; development.

 User-Friendly Interface: User-Friendly Interface: Make it simple for users to


look for and reserve lodging with an intuitive interface. Effective Search
Technique Provide a powerful search engine so that properties can be
filtered according to user preferences.

 Secure Transactions: Make sure that every financial transaction is encrypted


and safe. The ability to scale Plan the system to support an increasing
number of properties and users. Provide customers with a dependable
method for managing their reservations, changes, and cancellations.

 User Authentication: The ability for users to create accounts, log in, and edit
their profiles is a must. Property Listings: Property owners ought to be able to
list their properties with comprehensive details, images, and costs. Advanced
search filters (such as location, price range, amenities, etc.) are necessary for
search and filter users. Reservation administration Reservations should be
easy for users to make, amend, and cancel. Payment Gateway Integration for
managing transactions using safe payment gateways. Reviews and Ratings:
Visitors ought to be able to rate and write reviews of their experiences.

 The goal of the EasyStay app is to provide a scalable, safe, and easy-to-use
way to book short-term lodging. Following the comprehensive
implementation plan and adhering to the specified system requirements will
enable the development team to guarantee a smooth launch and sustained
platform growth.

12
2,2,5 – SYSTEM DESIGN

1. System design refers to the process of creating a system. The two methods
listed below can be used to implement the System.

2. EasyStay provides a user-friendly, safe, and dependable platform for hosts


and guests in an effort to transform the short-term rental industry. The system
design is covered in detail in this report, from high-level architecture to
component-level design, guaranteeing a thorough and well-organized
approach to the development of the application.

functional requirements

 User Authentication: Registration, login, and profile management.


 Property Listings: Hosts can list properties with descriptions, photos, and
pricing.
 Search and Filter: Users can search and filter properties based on various
criteria.
 Booking Management: Real-time booking, modification, and cancellation.
 Payment Processing: Integration with secure payment gateways.
 Reviews and Ratings: Users can leave reviews and ratings for properties.

Detailed Design

 Frontend Design: Using EJS, and CSS for a seamless user experience..

 Backend Services: Micro services architecture to handle different
functionalities like user management, property management, booking
system, and payment processing
.
 Database Schema: MangoDB design with collections for users, properties,
bookings, and reviews.

Technology Stack

 Frontend: EJS, CSS, JavaScript


 Backend: Node.js, Express.js
 Database: MongoDB,
 Authentication: Passport.js
 Hosting: GITHUB
13
2,2,6 – CODING

1. A developer uses one or more programming languages to code during the


coding phase. Coding is easier to write and makes up only 20% of the project
overall. Teams also work on the coding; the system is typically developed
using the modular programming style, which can take either a top-down or
bottom-up approach.

2. The EasyStay application development process is described in this coding


project report, along with the project structure, implementation specifics,
coding standards, and quality control procedures. Ensuring a strong, safe, and
excellent codebase that satisfies the needs of the application is the aim.

Coding Standards and Guidelines –

 Code Readability: Ensure code is easy to read and understand. 


 Consistent Naming Conventions: Use camel Case for variables and
functions,Pascal Case for classes.
 Commenting and Documentation: Provide comments and documentation
forcomplex logic.
 Modular Code: Write reusable and modular code to enhance maintainability.

Frontend Guidelines –

 CSS: Follow BEM (Block, Element, Modifier) naming convention. 
 JavaScript: Use ‘const’ and ‘let’, and arrow function.
.

Backend Guidelines :

 Node.js and Express.js: Follow RESTful API design principles. 


 Error Handling: Implement comprehensive error handling. 

The EasyStay application's coding phase was successfully finished by adhering


to coding standards and best practices.
The application is made to be maintainable, scalable, and secure. Having
implemented a comprehensive testing and deployment plan, EasyStay is ready
to offer a reliable platform for booking short-term lodging.

14
Project Structure for frontend

 public/css: Main contains css files for styling.


 rating.css
 style.css
 public/js: Main contains js files.
 flash_msg.js
 map.js
 night.js
 s_map.js
 script.js
 views/: This directory includes EJS templates used for rendering HTML pages
dynamically.
 Views/include
 flash_msg.ejs
 footer.ejs
 Views/layouts
 Boilerplate.ejs
 Views/listings
 booking-form.ejs
 edit.ejs
 error.ejs
 index.js
 notfound.ejs
 new.ejs
 show.ejs
 slisting.ejs
 Views/users
 login.ejs
 profile.ejs
 signup.ejs

15
Project Structure for Backend

 Controllers/ : Contains the controllers which handle the logic for different
functionalities.
 listing.js
 review.js
 user.js
 model/: Contains the schema definitions for the database models
 listing.js
 review.js
 user.js
 routes/: Defines the routing for different HTTP requests.
 listing.js
 review.js
 user.js

 utils/: Contains utility functions and error handlers.
 Expresserror.js
 wrapAsync.js
 app.js: Main application file initializing the app and connecting middleware.
 cloudConfig.js: Configuration for cloud services. 
 error.js: Custom error definitions
 middleware.js: Custom middleware for request handling.
Structure for Database
 Models/listing.js: Schema and model for listings.
 Models/review.js: Schema and model for reviews.
 Models/user.js: Schema and model for users.

Key features
 Homepage: Displays featured properties and search bar.
 Search Results: Lists properties based on search criteria.
 listing Details: Detailed view of a listing with booking options.
 User Profile: User information and booking history.
 MongoDB: Used for storing user data, property listings, bookings, and
reviews.
 Schema Design: schemas for users, properties, bookings, and reviews

16
Some example of code are given below
app.js

17
2,2,7 – TESTING

 Testing is the stage where the developed system is put to the test. Sixty
percent of the system's development is dedicated to testing. System testing
is crucial because it seeks to identify the various flaws in the system. The
system can be tested using a variety of different testing methodologies.

 Testing: Frameworks
 Debugging Tools
 Frontend: Chrome Dev Tools.
 Backend: Node.js Debugger, Postman for API testing.

2,2,8 – IMPLEMENTATION

Software installation was a step in the implementation process for the user. The
actual implementation process varies depending on the system type. Selecting an
appropriate conversion strategy is a step in the process. The following are the
conversion procedures:

 Parallel Conversion
 Direct Conversion Approach
 Pilot Conversion Approach
 Phase In Conversion Approach

Deployment Strategy:

a) Staging Environment: To conduct final testing and validation, deploy the


application in a staging environment.

b) Production Environment: To reduce interruptions, gradually deploy to the


production environment.

c) Infrastructure: For scalable and dependable infrastructure, make use of


cloud services (like AWS).

18
2,2,0– MAINTENANCE

It is not sufficient to develop the system alone; maintenance is also necessary.


The system's construction company offers the client free maintenance for a
certain amount of time; after that, the service is typically charged for.
.

Monitoring and Performance


Management

 Alert Systems: To guarantee quick problem solving, set up alerts for


important metrics.

 Performance Tuning: Examine performance data on a regular basis


and adjust application components as necessary. Frequent bug fixes
and updates

 Update Schedule: Establish a consistent update schedule for security


patches, bug fixes, and new features.

 Version Control: To manage code changes and guarantee seamless
updates, use Git..

 Testing: Prior to production deployment, every update must undergo


extensive testing in a staging environment.

 Regular Audits: Find and fix vulnerabilities through regular security


audits.

 Patch Management: To reduce risks, apply security updates as soon as


possible.

 Access Control: To guarantee that only authorized users have access to


sensitive data, review and update access controls on a regular basis.

Backup and Recovery

 Backup Strategy: Use AWS S3 or comparable services to regularly


backup all important data.
 Disaster Recovery Plan: To guarantee business continuity in the event
of significant incidents, create and test a disaster recovery plan.

19

CHAPTER - 3

20
3.2 - SOFTWARE MANAGEMENT LIFE CYCLE

1 - Software Management Life Cycle

 This report outlines the Software Development Life Cycle (SDLC) for the
EasyStay application, detailing each phase from requirements gathering
through to maintenance.The objective is to provide a structured and
comprehensive approach to developing and managing the EasyStay
application to ensure its success and sustainability.

 EasyStay is a platform designed to streamline the process of booking short-


term accommodations.

 This report provides a detailed overview of the SDLC processes,
methodologies, and management approaches used in the development and
maintenance of the EasyStay application.

 System Architecture: Overview of the system’s architecture, including
components and their interactions.

 Technology Stack Selection of technologies to be used for frontend,
backend, and database.

21
3.1 - PROCESS DESCRIPTION

m. Gantt charts mainly used to allocate resources to activities. The resources


allocated to activities include staff, hardware, and software.

n. Gantt charts (named after its developer Henry Gantt) are useful for resource
planning.

o. A Gantt chart is special type of bar chart where each bar represents an
activity. The bars are drawn along a timeline.

p. The length of each bar is proportional to the duration of the time planned for
the corresponding activity.

q. Gantt chart is a project scheduling technique. Progress can be represented


easily in a Gantt chart, by coloring each milestone when completed. The
project will start in the month of January and end after 4 months at the
beginning of April.

User Registration:

 Users can register via email, name, and password.

User Login:

 Registered users log in using their email/phone and password or social media
credentials.

Property Owner Registration:

 Property owners sign up similarly to regular users.

Listing a Property:

 Owners can list their properties by providing details such as location,


type, amenities, pricing, and availability.
 Owners upload images and descriptions to attract potential guests.

22
Managing Listings:

 Owners have access to a dashboard to manage their properties,


update availability, and modify details as needed.

Booking Process:

1. Search and Filter:

 Users can search for properties using various filters like location, price
range, amenities, and ratings.

2. Property Selection:

 Users select a property and view detailed information, including images,


descriptions, availability, and reviews. 

3. Booking:

 Users choose their stay dates and confirm the booking. 


 The system checks availability and processes the booking request. 

4. Confirmation:

 Users receive a booking confirmation via email and within the app. 
 Property owners are notified of the new booking. 

Payment Gateway Integration:

1. Payment Options:

 Users can pay using QR code

23
3.2 - PROJECT MODEL USED

 This model has the same phases as the waterfall model, but with fewer
restrictions. Generally the phases occur in the same order as in the waterfall
model, but they may be conducted in several cycles.

 EasyStay is an innovative application designed to facilitate the booking of
short-term accommodations. To ensure the successful development and
deployment of EasyStay, we have employed an agile project model,
specifically leveraging the Scrum framework.

 This report outlines the project model used, detailing each phase, the roles
involved, tools and technologies, risk management strategies, and quality
assurance processes.

 The Agile project management methodology was chosen for the EasyStay
application due to its flexibility and iterative nature. Agile promotes
continuous improvement, collaboration, and adaptability, which aligns well
with the dynamic requirements of the project.

 Useable product is released at the end of the each cycle, with each release
providing additional functionality. Customers and developers specify as many
requirements as possible and prepare a SRS document. Developers and
customers then prioritize these requirements.

 Developers implement the specified requirements in one or more cycles of
design, implementation and test based on the defined priorities.

 The procedure itself consists of the initialization step, the iteration step, and
the Project Control List.

 The initialization step creates a base version of the system. The goal for this
initial implementation is to create a product to which the user can react.

 It should offer a sampling of the key aspects of the problem and provide a
 solution that is simple enough to understand and implement easily.
 To guide the iteration process, a project control list is created that contains a
record of all tasks that need to be performed.

 It includes such items as new features to be implemented and areas of
redesign of the existing solution. The control list is constantly being revised as
a result of the analysis phase.
24
3.3 - PHASES
2 Incremental development slices the system functionality into increments
(portions). In each increment, a slice of functionality is delivered through
cross- discipline work, from the requirements to the deployment. The unified
process groups increments/iterations into phases: inception, elaboration,
construction, and transition.

3 Inception identifies project scope, requirements (functional and non-


functional) and risks at a high level but in enough detail that work can be
estimated.

4 Elaboration delivers a working architecture that mitigates the top risks and
full fills the non-functional requirements.
5 Construction incrementally fills-in the architecture with production-ready
code produced from analysis, design, implementation, and testing of the
functional requirements.

6 Transition delivers the system in to the production operating environment.

7 EasyStay is an innovative application aimed at simplifying the process of


booking short-term accommodations.

8 It connects property owners with travelers, offering a seamless experience


from booking to stay.

9 This report details the various phases involved in the development of


EasyStay, ensuring a structured approach to achieving the project objectives.

10 Develop a user-friendly platform for booking accommodations.

11 Ensure secure and efficient transaction processes.

12 Provide a reliable system for property owners to manage their listings.

13 Integrate a comprehensive review system for user feedback.

14 Development of web and mobile applications Integration with payment


gateways.Implementation of user authentication and authorization Building
a database for user, property, and transaction management Developing
customer support functionalities.

25
Initiation Phase- 1

1. Project Charter:

 Define the project’s purpose, objectives, scope, and stakeholders.


 Outline the project’s deliverables and initial timeline.

2. Stakeholder Identification:

 Identify all stakeholders and their interests, influence, and


requirements.

3. Feasibility Study:

 Conduct a feasibility study to assess technical, economic, and


operational viability.

4. Approval and Funding:

 Secure approval and funding from stakeholders to proceed with the


project

Planning Phase- 2

1. Project Plan Development:

 Develop a detailed project plan, including timelines, resources, and


budget.

2. Requirement Gathering:

 Collect detailed requirements from stakeholders through interviews,


surveys, and workshops.

3. Work Breakdown Structure (WBS):

 Break down the project into smaller, manageable tasks.

4. Resource Allocation:

 Allocate resources, including team members, tools, and technologies.


5. Risk Management Planning:

 Identify potential risks and develop mitigation strategies.


26
6. Communication Plan:

 Develop a communication plan to ensure timely and effective


communication among stakeholders.

Execution Phase- 3

1. Development:

 Begin the actual coding and development of the EasyStay application


based on the project plan.

2. Design:

 Create wireframes, mockups, and prototypes for the application


interface.

3. Database Development:

 Design and implement the database to manage users, properties,


bookings, and transactions.

4. Integration:

 Integrate payment gateways and other third-party services.

5. Testing:

 Conduct unit testing, integration testing, and system testing to identify


and fix bugs.

6. Iteration:

 Implement feedback from testing to refine and improve the


application.

Monitoring and Controlling Phase- 4

1. Progress Tracking:

 Use project management tools (e.g., JIRA, Trello) to track progress


against the project plan.

27
2.
3. Performance Metrics:

 Monitor key performance indicators (KPIs) such as timeline


adherence, budget compliance, and quality standards.

4. Risk Management:

 Continuously monitor and manage risks, updating the risk


management plan as necessary.

5. Quality Control:

 Ensure all deliverables meet the predefined quality standards through


regular reviews and audits.

6. Change Management:

 Manage changes to the project scope, schedule, and costs through a


structured change control process.

Closing Phase- 5
1. Final Testing:

 Conduct final user acceptance testing (UAT) to ensure the application


meets all requirements.

2. Documentation:

 Compile all project documentation, including user manuals, technical


documentation, and final reports.

3. Training:

 Provide training to end-users and administrators on how to use and


manage the EasyStay application.

4. Deployment:

 Deploy the application to the production environment.

5. Post-Deployment Support:

 Offer support to users and fix any post-deployment issues.

28
3.5 – DIAGRAM

3.5.1 – ER DIAGRAM

2 - ER Diagram
 In software engineering an entity-relationship model (ERM) is an abstract
and conceptual representation of data. Entity-relationship modeling is a
database modelling method, used to produce a type of conceptual schema or
semantic data model of a system, often a relational database, and its
requirements in a top-down fashion. Diagrams created by this process are
called entity-relationship diagrams, ER diagrams, or ERDs. ER Diagrams
depicts relationship between data objects.

.
29
 The attribute of each data objects noted in the entity-relationship diagram
can be described using a data object description. Entity relationship diagram
is very basic, conceptual model of data and it is fundamental to the physical
database design. This analysis is then used to organize data as relations,
normalizing relations, and obtaining a Relational database.

 ER Model stands for Entity Relationship Model is a high-level conceptual


data model diagram. ER model helps to systematically analysis data
requirements to produce a well-designed database. The ER Model represents
real-world entities and the relationships between them. Creating an ER
Model in DBMS is considered as a best practice before implementing your
database

 ER Modeling helps you to analysis data requirements systematically to


produce a well designed database. So, it is considered a best practice to
complete ER modeling before implementing your database.

 The entity-relationship model for data uses three features to describe data.
These are:

 Entities which specify distinct real-world items in an application.

 Relationship, which connect entities and represent meaningful dependencies


between them.

3.5.2 – DATA FLOW DIAGRAM

 DFD is an acronym for the word Data Flow Diagram. DFD is pictorial
representation of the system. DFD is a graphical representation of the
―flow of data through the information system.

 DFD are also used for the visualization of data processing (structured
design). A DFD provides no information the timing of the process, or about
whether process will operate in parallel or sequence.

 DFD is an important technique for modelling a system’s high- level detail by

showing how input data is transformed to output results through sequence of


functional transformations.
 DFD reveal relationships among between the various components in a
program or system.

 The strength of DFD lies in the fact that using few symbols we are able to
30
express program design in an easier manner.

 A DFD can be used to represent the following:

o Process that changes the data.


o Flow of data within the system.
o Data storage location.

0 - LEVEL DFD :

3 - 0 level DFD

 EasyStay is a platform designed to streamline the booking process for short-


term accommodations. The application connects property owners with
travelers, facilitating secure and efficient transactions. This report provides a
comprehensive overview of the data flow diagrams (DFD) used to model the
flow of information within the EasyStay application.

o External Entities: Users, Administrators, External Databases


o Processes: Main Processes such as User Interaction, Booking
Management, System Administration
o Data Stores: User Profiles, Accommodation Listings, Booking
Records, Payment Information

 The Data Flow Diagram for EasyStay is divided into multiple levels, with
each level providing a more detailed view of the system's data flow. Here,
we present a high-level overview of the DFD for EasyStay.

31
1 - LEVEL DFD:

4 - 1 level DFD

 User Interaction Process: This process handles user interactions such as


Registration, Login, Search for Accommodations, and Booking.

 Booking Management Process: This process manages booking-related


activities such as Confirmation, Cancellation, and Payment Processing.

32
2 - LEVEL DFD:

5 - 2 level DFD

33
3.6 – SOFTWARE REQUIREMENT SPECIFICATION

 A requirements specification for a software system is a complete description


of the behaviour of a system to be developed and it includes a set of use
cases that describe all the interactions the users will have with the software.
In addition to use cases, the SRS also contains non-functional requirements.

 Non-functional requirements are requirements which impose constraints on


the design or implementation (such as performance engineering
requirements, qualitystandards, or design constraints).

 Requirements are a sub-field of software engineering that deals with the


elicitation, analysis, specification, and validation of requirements for
software. The software requirement specification document enlists all
necessary requirements for project development.

 To derive the requirements, we need to have clear and thorough


understanding of the products to be developed. This is prepared after
detailed communications with project team and the customer.

 Programming Language Support :

a) Node.js
b) JavaScript for client-side validation.
c) Next.js

 Server-side Software Requirement :

a) IDE-Visual Studio Code


b) MongoDB
c) Google Chrome

 Client-side Software Requirement

a) Google Chrome Browser


b) Operating System

 It illustrates how data moves through various processes, data stores, and
external entities, facilitating a better understanding of the system's
architecture and functionality. By visualizing the data flow, stakeholders can
gain insights into the

34
 interactions between different components of the application, aiding in
system analysis, design, and optimization.

3.7 – SUPPORT AND MAINTENANCE


 Regular Updates: Implement regular updates to the system to ensure it
remains secure and efficient. This includes updating software libraries,
fixing bugs, and adding new features.

 Performance Monitoring: Continuously monitor the performance of the


platform to identify and resolve any performance bottlenecks or issues.
 Security Patches: Apply security patches promptly to protect the platform
from vulnerabilities and potential attacks.

 Data Backup: Perform regular data backups to prevent data loss and ensure
data integrity.

 Technical Audits: Conduct periodic technical audits to assess the system’s


health and ensure compliance with industry standards.

 User Feedback: Collect and analyze user feedback to identify areas for
improvement and prioritize feature enhancements.

3.8 – SYSTEM DESIGN APPROACH

Top-Down designing:

 The top - down designing approach started with major components of the
system. It is a stepwise refinement which starts from an abstract design, in
each steps the design is refined two or more concrete levels until we reach a
level where no – more refinement is possible or not needed.

6 - Top-Down Designing
35
Bottom–Up Designing:

 In bottom – up designing the most basic and primitive components are


designed first, and we proceed to higher level components. We work with
layers of abstractions an abstraction are implemented until the stage is
reached where the operations supported by the layer is complete.

7 - Bottom-Up Designing

3.9 – DATA MODELING

 Login Schema

 Login User Credentials

 Posts Schema

 Posts Mongo Atlas store

36
3.10 – LOW LEVEL DESIGN

 Low Level Design creation is one of the most important activities in the
development of any software product. The low-level design document gives
the design of the actual software application. Low level design document is
based on High Level

 Design document. It defines internal logic of every sub module. A good low-
level design document will make the application very easy to develop by the
developer. An effective design document results in very low efforts in
developing a Software product.

 Each project's low-level design document should provide a complete and


detailed specification of the design for the software that will be developed in
the project, including the classes, member and non-member functions, and
associations between classes that are involved.

 The low-level design document should contain a listing of the declarations


of all the classes, non-member-functions, and class member functions that
will be defined during the subsequent implementation stage, along with the
associations between those classes and any other details of those classes
(such as member variables) that are firmly determined by the low–level
design stage.

3.11 – TESTING

a) Testing is the integral part of any System Development Life Cycle


insufficient and interested application tends to crash and result in loss of
economic and manpower investment besides user’s dissatisfaction and
downfall of reputation.

b) Software Testing includes selecting test data that have more probability of
giving errors.” The first step in System testing is to develop the plan that all
aspect of system. Complements, Correctness, Reliability and
Maintainability.

c) Software is to be tested for the best quality assurance, an assurance that


system meets the specification and requirement for its intended use and
performance.

d) System Testing is the most useful practical process of executing the program
with the implicit intention of finding errors that makes the program fail.

37
Types of Testing:

3.11.1 – BLACKBOX (FUNCTIONAL) TESTING

a) Testing against specification of system or components study it by examining


its inputs and related outputs. Key is to devise inputs that have a higher
likelihood of causing outputs that reveal the presence of defects.

b) Use experience and knowledge of domain to identify such test cases. Failing
this a systematic approach may be necessary. Equivalence partitioning is
where the input to a program falls into a number of classes, e.g. positive
numbers vs. negative numbers.

c) Programs normally behave the same way for each member of a class.
Partitions exist for both input and output. Partitions may be discrete or
overlap. Invalid data (i.e. outside the normal partitions) is one or more
partitions that should be tested. Internal System design is not considered in
this type of testing. Tests are based on requirements and functionality.

d) This type of test case design method focuses on the functional requirements
of the software, ignoring the control structure of the program. Black box
testing attempts to find errors in the following categories:
1. Incorrect or missing functions.
2. Interface errors.
3. Errors in data structures or external data base access

3.11.2 – WHITE BOX TESTING

 Testing based on knowledge of structure of component (e.g. by looking at


source code). Advantage is that structure of code can be used to find out
how many test case need to be performed.

 Knowledge of the algorithm (examination of the code) can be used to


identify the equivalence partitions. Path testing is where the tester aims to
exercise every independent execution path through the component.

 All conditional statements tested for both true and false cases. If a unit has
no control statements, there will be up to 2n possible paths through it. This
demonstrates that it is much easier to test small program units than large
ones.

38
Flow graphs are a pictorial representation of the paths of control through a
program (ignoring assignments, procedure calls and I/O statements).
 Use flow graph to design test cases that execute each path. Static tools may
be used to make this easier in programs that have a complex branching
structure. Tools support. Dynamic program analyses instrument a program
with additional code. Typically, this will count how many times each
statement is executed. At end print out report showing which statements
have and have not been executed.

 Problems with flow graph derived testing:

a) Data complexity could not take into account.

b) We can not test all paths in combination.

c) It is really only possible at unit and module testing stages because beyond
that, the complexity is too high.

d) This testing is based on knowledge of the internal logic of an application's


code. Also known as Glass Box Testing, the internal software and code
workings should be known for this type of testing. Tests are based on
coverage of code statements, branches, paths, and conditions.

3.11.3 – UNIT TESTING

 Unit testing concentrates on each unit of the software as implemented in the


code. This is done to check syntax and logical errors in programs. At this
stage, the test focuses on each module individually, assuring that it functions
properly as a unit. In our case, we used extensive white-box testing at the
unit testing stage.

3.11.4 – INCREMENTAL INTEGRATION:

 Bottom up approach for testing i.e. continuous testing of an application as


new functionality is added; Application functionality and modules should be
independent enough to test separately done by programmers or by testers.

3.11.5 – INTEGRATION TESTING:


 Testing of integration modules to verify combined functionality after
integration. Modules are typically code modules, individual applications,
client and server and distributed systems.
39
3.11.6 – FUNCTION TESTING:

 This type of testing ignores the internal parts and focus on the output is as
per requirement or not. Black box type testing geared to functionality
requirements of an application.

3.11.7 – SYSTEM TESTING:

 Entire system is tested as per the requirements Black box type test that is
based on overall requirement specifications covers all combined parts of a
system.

3.11.8 - END-TO-END TESTING:


 Similar to system testing, involves testing of a complete application
environment in a situation that mimics real-world use, such as interacting
with a database, using network communications, or interacting with
hardware, applications, or system if appropriate.

3.11.9 – REGRESSION TESTING:


 Testing the whole application for the modification in any module or
functionality Difficult to coverall the system in regression testing so
typically automation tools are used for these testing types.

3.11.10 – ACCEPTANCE TESTING:


 Normally this type of testing is done to verify if system meets the customer
specified requirements User or customers do this testing to determine
whether to accept application.

3.11.11 – PERFORMANCE TESTING:


 Term often used interchangeably with “stress” and “load” testing, To check
whether system meets performance requirements, Used different
performance and load tools to do this.

3.11.12 - ALPHA TESTING:


 In house virtual user environment can be created for this type of Testing is
done at the end of development. Still minor design changes may be made as
a result of such testing.

40
CHAPTER - 4

41
IMPLEMENTAION:

4-1 CODE IMPLEMENTAION


app.js:-

// dotenv
if (process.env.NODE_ENV != "production") {
require("dotenv").config();
}

const express = require("express");


const app = express();
const mongoose = require("mongoose");
const path = require("path");
// Middleware for parsing form data
app.use(express.urlencoded({ extended: true }));

// Method-override for handling PUT and DELETE requests


const methodOverride = require("method-override");
app.use(methodOverride("_method"));

// EJS setup
const ejsMate = require("ejs-mate");
app.engine("ejs", ejsMate);
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");

// Serve static files


app.use(express.static(path.join(__dirname, "/public")));

// Passport
const passport = require("passport");
const LocalStategy = require("passport-local");
const User = require("./models/user.js");

// Express-session setup
const expressSession = require("express-session");
const flash = require("connect-flash");

const sessionOptions = {
secret: "mycode",
resave: false,
saveUninitialized: true,
};
app.use(expressSession(sessionOptions));
app.use(flash());

42
// Passport setup
app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

let port = 8080;


app.listen(port, () => {
console.log("Server listening on Port : 8080");
});

// Database connection
async function main() {
await mongoose.connect("mongodb://127.0.0.1:27017/mainP");
}

main()
.then((res) => {
console.log("Success! Connection to MongoDB");
})
.catch((err) => {
console.log(err);
});

// Routes
const listingRouter = require("./routes/listing.js");
const reviewsRouter = require("./routes/review.js");
const userRouter = require("./routes/user.js");

// Home route
app.get("/", (req, res) => {
res.render("start.ejs");
});

// Middleware for flash


app.use((req, res, next) => {
res.locals.success = req.flash("success");
res.locals.failure = req.flash("failure");
res.locals.currentUser = req.user;
next();
});

app.use("/listing", listingRouter);
app.use("/listing/:_id/reviews", reviewsRouter);
app.use("/", userRouter);

// 404 Page not found


app.all("*", (req, res, next) => {
res.render("./listings/notfound.ejs");
});

43
// Error handler
app.use((err, req, res, next) => {
let { statusCode = 500, message = "Something went wrong!" } = err;
res.render("./listings/error.ejs", { err });
});

Listing Schema:-

const mongoose = require("mongoose");


const Schema = mongoose.Schema;
const Review = require("./review.js");

const ListingSchema = new Schema({


title: {
type: String,
required: true,
},
description: {
type: String,
},
image: {
url: String,
filename: String,
},
price: {
type: Number,
},
location: {
type: String,
},
country: {
type: String,
},
reviews: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Review",
},
],
owner: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
geometry: {
type: {
type: String, // 'geometry.type' must be 'Point'
enum: ["Point"], // Only 'Point' is allowed
required: true,
},
coordinates: {
type: [Number],
44
required: true,
},
},
});

ListingSchema.post("findOneAndDelete", async (listing) => {


if (listing) {
await Review.deleteMany({ _id: { $in: listing.reviews } });
}
});

const Listing = mongoose.model("Listing", ListingSchema);


module.exports = Listing;

Review Schema;-

const mongoose = require("mongoose");


const Schema = mongoose.Schema;

// Define the schema for the Review model


const reviewSchema = new Schema({
comment: String, // A field to store the comment associated with the review
rating: {
type: Number,
min: 1, // Minimum allowed rating value
max: 5, // Maximum allowed rating value
},
createdat: {
type: Date,
default: Date.now(),
},
author: {
type: mongoose.Schema.Types.ObjectId,
ref: "User", // Reference to the User model, indicating that this field stores the ID of
the user who created the review
},
});

// Create the Review model using the reviewSchema


module.exports = mongoose.model("Review", reviewSchema);

User Schema:-

const mongoose = require("mongoose");

45
const Schema = mongoose.Schema;
const passportLocalMongoose = require("passport-local-mongoose");

const userSchema = new Schema({


email: {
type: String,
required: true,
},
bookings: [
{
bookedListingDetails: {
type: mongoose.Schema.Types.ObjectId,
ref: "Listing",
},
checkIn: {
type: Date,
},
checkOut: {
type: Date,
},
guest: {
type: Number,
},
},
],
orders: [
{
orderedListingDetails: {
type: mongoose.Schema.Types.ObjectId,
ref: "Listing",
},
orderOwner: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
checkIn: {
type: Date,
},
checkOut: {
type: Date,
},
guest: {
type: Number,
},
},
],
});

// Passport-local-mongoose will automatically add username and password fields, along with
hash and salt functions
userSchema.plugin(passportLocalMongoose);

46
module.exports = mongoose.model("User", userSchema);

Listing Route;-

const express = require("express");


const router = express.Router();
const wrapasync = require("../util/wrapasync.js");
const { isLogedin, isowner, validlisting } = require("../middleware.js");

// Controllers files
const listingControllers = require("../controllers/listing.js");

const multer = require("multer");


const { storage } = require("../cloudConfig.js");
const upload = multer({ storage });
const expressSession = require("express-session");
const flash = require("connect-flash");

const sessionOptions = {
secret: "mycode",
resave: false,
saveUninitialized: true,
};

router.use(expressSession(sessionOptions));
router.use(flash());
router.route("/")
// Our home page
.get(wrapasync(listingControllers.index))
// for inserting the new data
.post(
isLogedin,
// validlisting,
upload.single("image"),
wrapasync(listingControllers.saveNewListing)
);

router.get("/new", isLogedin, listingControllers.newListingFrom);


// for getting req for new listing

router.route("/:_id")
// for showing a particular data
.get(wrapasync(listingControllers.showListing))
// updation in database
.put(
isLogedin,
isowner,
validlisting,

47
wrapasync(listingControllers.updateListing)
)
// for deleting the listing
.delete(isLogedin, isowner, wrapasync(listingControllers.deleteListing));

router.get(
"/:_id/edit",
isLogedin,
isowner,
wrapasync(listingControllers.updateFrom)
);
module.exports = router;

Review Route:-

const express = require("express");


const router = express.Router({ mergeParams: true });
const wrapasync = require("../util/wrapasync.js");
const Review = require("../models/review.js");
const Listing = require("../models/listing.js");
const { validateReview, isLogedin, isReviewAuthor } = require("../middleware.js");

// Controller for review


const reviewControllers = require("../controllers/review.js");
const expressSession = require("express-session");
const flash = require("connect-flash");

const sessionOptions = {
secret: "mycode",
resave: false,
saveUninitialized: true,
};

router.use(expressSession(sessionOptions));
router.use(flash());

// Create review route


router.post(
"/",
isLogedin,
validateReview,
wrapasync(reviewControllers.createReview)
);

// Deleting the review


router.delete(
"/:reviewid", // Correcting the route to include :reviewid
isLogedin,
isReviewAuthor,
wrapasync(reviewControllers.deleteReview)
)
48
module.exports = router;

User Route:-

const express = require("express");


const router = express.Router();
const passport = require("passport");
const { isLogedin, saveRedirectUrl } = require("../middleware.js");

// Controllers for User


const userControllers = require("../controllers/user.js");
router.route("/signup")
// For signup form
.get(userControllers.signupForm)
// For saving the signup
.post(userControllers.saveUser);

router.route("/login")
// Form for login
.get(userControllers.loginForm)
// Login authentication
.post(
saveRedirectUrl,
passport.authenticate("local", {
failureRedirect: "/login",
}),
userControllers.login
);

// Route for logout


router.get("/logout", isLogedin, userControllers.logout);

// Route for Profile


router.get("/profile", userControllers.showProfile);

module.exports = router;
EJS Template For Listing

Boilerplate.ejs:-

<!DOCTYPE html>
<html lang="en">
<head>
49
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Airbnb</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Roboto&display=swap"
rel="stylesheet" />
<link href="https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css"
rel="stylesheet" />
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:o
psz,wght,FILL,GRAD@24,400,0,0" />

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-


awesome/6.5.1/css/all.min.css" integrity="sha512-
DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1
c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous"
referrerpolicy="no-referrer" />
<link rel="stylesheet" href="/css/style.css" />
<link rel="stylesheet" href="/css/rating.css" />
</head>

<body>
<!-- Nav bar -->
<nav>
<div class="outer header">
<div class="left"><a href="/listing">EasyStay</a></div>
<ul>
<a href="/listing" class="white">Home</a>
<a href="/about" class="white">About</a>
<a href="/listing/new" class="white">New listing</a>

<div class="login-singup">
<div class="menu-show">
<i class="bx bx-menu login-menu"></i>
<i class="bx bxs-user-circle login-img"></i>

</div>
<div class="login-items">
<% if(!currentUser){ %>
<a href="/login" class="white">Login</a>
<a href="/singup" class="white">Sign-up</a>
<% } %> <% if(currentUser){ %>
50
<a href="/profile" class="white">Profile</a>
<a href="/logout" class="white">logout</a>
<% } %>
<a href="/" class="white">EasyStay your home</a>
<a href="/HelpCente" class="white">Help Center</a>
</div>
</div>

<!-- <i class="bx bx-moon n-mode white" style="transform:


rotate(10deg)"></i>
<i class="bx bx-sun n-mode white"></i> -->
</ul>
</div>
</nav>
<div class="contanier">
<%- include("../include/flash_msg.ejs") %> <%-body %>
</div>
<%- include("../include/footer.ejs") %>
<script src="/js/night.js"></script>
<script src="/js/flash_msg.js"></script>
</body>
</html>
Index.ejs:-

<% layout("/layouts/boilerplate.ejs") %>

<body>
<div class="listing-container">
<% for (let list of allistring) { %>
<a href="/listing/<%= list._id %>">
<div class="card">
<img src="<%= list.image.url %>" alt="img">
<div class="location white"><%= list.location %>, <%= list.country
%></div>
<a href="/listing/<%= list._id %>" class="white"><%= list.title %></a>
<p class="white" id="click">&#8377; <%= list.price %> total before

include</p>
</div>
</a>
<% } %>
</div>
</body>
51
Show.ejs:-

<% layout("/layouts/boilerplate.ejs") %>


<link href="https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css"
rel="stylesheet" />
<body>
<div class="listing-details">
<div class="left">
<img src="<%= showdata.image.url %>" alt="img." />
</div>
<div class="right">
<% if (currentUser && currentUser.equals(showdata.owner)) { %>
<!-- Edit and Delete buttons -->
<div class="rightF">
<form action="http://localhost:8080/listing/<%= showdata._id %>/edit"
method="get">
<button>Edit listing</button>
</form>
<form action="http://localhost:8080/listing/<%= showdata._id
%>?_method=DELETE" method="post" id="del">
<button>Delete listing</button>
</form>
</div>
<% } %>

<div class="rightS">
<p id="title" class="white"><%= showdata.title %></p>
<p class="white"><%= showdata.owner.username %> : <%=
showdata.owner.email %></p>
<p class="white"><%= showdata.description %></p>
<p class="white">&#8377; <%= showdata.price %>/night</p>
<p style="text-decoration: underline" class="white">
<i class="fa-solid fa-location-dot"></i> <%= showdata.location %>,
<%= showdata.country %>
</p>
</div>
</div>
</div>

<!-- Review form -->


<% if (currentUser) { %>
<div class="review white">
<div class="review-heading">Leave a review</div>
<form action="/listing/<%= showdata._id %>/reviews" method="post"
id="rform">
52
<label for="rating" class="Rform-label">Rating: </label>
<fieldset class="starability-slot">
<!-- Rating stars -->
<!-- Your rating star radio inputs and labels go here -->
</fieldset>
<label for="comment" class="Rform-label">Comment: </label>
<textarea name="comment" id="comment" class="rcomment form-
input"></textarea>
<button type="submit" id="review-btn">Save</button>
</form>
</div>
<% } %>

<!-- Show all reviews -->


<div class="show-review white">
<h1 id="review-heading">All reviews</h1>
<div class="review-content">
<% for (let review of showdata.reviews) { %>
<div class="review-row">
<div class="review-title">
<h2><%= review.author.username %></h2>
<!-- Delete review button -->
<% if (currentUser && currentUser.equals(review.author)) { %>
<form method="post" action="/listing/<%= showdata._id
%>/reviews/<%= review._id %>?_method=DELETE">
<button type="submit" id="del-review">
<i class="bx bx-x"></i>
</button>
</form>
<% } %>
</div>
<div class="review-comment white"><%= review.comment %></div>
<div class="Drating-date">
<!-- Display rating stars and date -->
<!-- Your code to display stars and date goes here -->
</div>
</div>

<% } %>
</div>
</div>

<!-- JavaScript for form validation -->


<script>
53
// Your JavaScript code for form validation goes here
</script>
</body>
New.ejs:-
<% layout("/layouts/boilerplate.ejs") %>
<body>
<div id="new-listing">
<form action="http://localhost:8080/listing" method="POST" id="listing-
form" enctype="multipart/form-data">
<label for="title" class="form-label white">Title</label>
<input type="text" name="title" id="title" class="form-input" />
<span class="material-symbols-outlined titileicon">error</span>

<label for="description" class="form-label white">Description</label>


<textarea name="description" class="form-input"></textarea>
<span class="material-symbols-outlined titileicon" style="top: -
3.6rem">error</span>

<label for="image" class="form-label white">Upload Image</label>


<input type="file" name="image" class="form-input" />
<span class="material-symbols-outlined titileicon">error</span>

<div class="location-c">
<div class="f">
<label for="location" class="form-label white">Location</label>
<label for="country" class="form-label white" id="s-l">Country</label>
</div>
<div class="s">
<input type="text" name="location" class="form-input" />
<span class="material-symbols-outlined titileicon" style="left: -2.9rem;
top: 0.24rem">error</span>
<input type="text" name="country" class="form-input" />
<span class="material-symbols-outlined titileicon" style="left: -2.9rem;
top: 0.24rem">error</span>
</div>
</div>

<label for="price" class="form-label white">Price</label>


<input type="number" name="price" class="form-input spicial" />
<span class="material-symbols-outlined titileicon
spicialicon">error</span>
<button type="submit" id="add-btn">Add</button>
</form>
</div>
54
<script src="/js/script.js"></script>
</body>

Edit.ejs:-
<% layout("/layouts/boilerplate.ejs") %>
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:o
psz,wght,FILL,GRAD@24,400,0,0" />

<body>
<div id="new-listing">

<form method="POST" action="/listing/<%= editlisting._id

%>?_method=PUT" id="listing-form">
<label for="title" class="form-label white titlee">Title</label>
<input type="text" value="<%= editlisting.title %>" name="title"
class="form-input" />
<span class="material-symbols-outlined titileicon">error</span>

<label for="description" class="form-label white">Description</label>


<textarea name="description" class="form-input"><%=
editlisting.description %></textarea>
<span class="material-symbols-outlined titileicon" style="top: -
3.6rem">error</span>

<label for="image" class="form-label white">Image</label>


<input type="text" value="<%= editlisting.image %>" name="image"
class="form-input" />
<span class="material-symbols-outlined titileicon">error</span>

<div class="location-c">
<div class="f">
<label for="location" class="form-label white">Location</label>
<label for="country" class="form-label white" id="s-l">Country</label>
</div>
<div class="s">
<input type="text" value="<%= editlisting.location %>"
name="location" class="form-input" />
<span class="material-symbols-outlined titileicon" style="left: -2.9rem;
top: 0.24rem">error</span>
<input type="text" value="<%= editlisting.country %>" name="country"
class="form-input" />
<span class="material-symbols-outlined titileicon" style="left: -2.9rem;
55
top: 0.24rem">error</span>
</div>
</div>

<label for="price" class="form-label white">Price</label>


<input type="number" value="<%= editlisting.price %>" name="price"
class="form-input spicial" />
<span class="material-symbols-outlined titileicon
spicialicon">error</span>

<button type="submit" id="edit-btn">Save</button>


</form>
</div>
<script src="/js/script.js"></script>
</body>
Booking-form.ejs:-

<% layout("/layouts/boilerplate.ejs")%>

<body>
<div id="boolFormCaontainer">
<div class="bookFromleft">
<a href="/listing/<%= bookinglisting._id %>">
<img
src="<%= bookinglisting.image.url %>"
alt=""
/>
</a>
<div class="bookingimgtitle"><%= bookinglisting.title %></div>
<div class="bookingprice">
<span style="text-decoration: underline">
<i class="fa-solid fa-location-dot" style="margin-left: 0.3rem"></i>
<%= bookinglisting.location %>, <%= bookinglisting.country %>
</span>
<p class="white" style="margin-left: 0.3rem; font-weight: bold">
&#8377; <%= bookinglisting.price %>/night
</p>
</div>
</div>
<form
action="/<%= bookinglisting._id %>/book"
method="POST"
id="listing-form"
class="booking-form"
56
style="width: 30%; padding-top: 1.2rem"
<label for="checkIn" class="form-label white">CHECK-IN</label>
<input
type="date"
name="checkIn"
id="checkIn"
class="form-input"
style="width: 90%"
required
/>
<label for="checkOut" class="form-label white">CHECK-OUT</label>
<input

type="date"
name="checkOut"
id="checkOut"
class="form-input"
style="width: 90%"
required
/>
<label for="guest" class="form-label white">GUEST</label>
<input
type="number"
name="guest"
id="guest"
class="form-input spicial"
style="width: 90%"
required
/>
<button type="submit" id="add-btn" style="width:
5.5rem">Reserve</button>
</form>
</div>

<div class="payment-container" style="display: none">


<div class="payment-card">
<h2>Pay Using QR</h2>
<img
src="https://www.qrstuff.com/images/default_qrcode.png"
alt="qr-code"
/>
<h4>Scan QR from any Payment App</h4>
<div class="py-apps">
<span
57
><img

src="https://i.pinimg.com/originals/60/5a/bd/605abdb7af3405c6b20a426b1e12
8322.png"
alt="Pay App"
/></span>
<span
><img
src="https://cdn.freelogovectors.net/wp-
content/uploads/2023/11/phonepelogo-freelogovectors.net_.png"
alt="PhonePe"
/></span>
<span

><img
src="https://cdn.iconscout.com/icon/free/png-256/free-paytm-
226448.png?f=webp"
alt="Paytm"
/></span>
</div>
<div class="counter">
<span>Time left : </span>
<span id="countdown">00 : 59</span>
</div>
<div class="total">
<span>Total : </span>
<span id="py-amount">&#8377; 0</span>
</div>
</div>
</div>

<script>
document.addEventListener("DOMContentLoaded", () => {
const form = document.querySelector(".booking-form");
const checkIn = document.querySelector("#checkIn");
const checkOut = document.querySelector("#checkOut");
const guest = document.querySelector("#guest");
const pyPopUp = document.querySelector(".payment-container");
const pyAmount = document.querySelector("#py-amount");

const isLeapYear = year => (year % 4 === 0 && year % 100 !== 0) || year
% 400 === 0;

const noOfDays = s => {

58
const [year, month, day] = s.split('-').map(Number);
const monthDays = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31];
return day + monthDays.slice(0, month - 1).reduce((a, b) => a + b, 0) +
year * 365 + Math.floor(year / 4) - Math.floor(year / 100) + Math.floor(year /
400);
};
const startCountdown = () => {
let timeLeft = 59;
const countdownElement = document.getElementById("countdown");
const interval = setInterval(() => {
countdownElement.textContent = `00 : ${timeLeft < 10 ? "0" + timeLeft
: timeLeft}`;

if (timeLeft-- < 0) {
clearInterval(interval);
countdownElement.textContent = "00 : 00";
}
}, 1000);
};
form.addEventListener("submit", e => {
e.preventDefault();
const days1 = noOfDays(checkIn.value);
const days2 = noOfDays(checkOut.value);
const totalDays = Math.abs(days2 - days1);
const guests = parseInt(guest.value, 10);
if (!isNaN(totalDays) && !isNaN(guests)) {
const totalAmount = <%= bookinglisting.price %> * guests * totalDays;
pyAmount.innerHTML = `&#8377; ${totalAmount}`;
pyPopUp.style.display = "flex";
startCountdown();
setTimeout(() => {
pyPopUp.style.display = "none";
form.submit();
}, 1000 * 60);
}
});
});
</script>
</body>

59
EJS For User

Login.ejs:-

<% layout("/layouts/boilerplate.ejs")%>

<body>
<div id="new-listing">
<form action="/login" method="POST" id="listing-form" style="width:
30%">
<h1>Login</h1>
<label for="username" class="form-label white">Username</label>
<input
type="text"
name="username"
id="title"
class="form-input"
style="width: 90%"
/>
<span class="material-symbols-outlined titileicon" style="left:
20.4rem">error</span>

<label for="password" class="form-label white">Password</label>


<input
type="password"
name="password"
class="form-input spicial"
style="width: 90%"
/>
<span class="material-symbols-outlined titileicon spicialicon" style="left:
20.4rem">error</span>

<div class="login-singup-btns">
<button type="submit" id="add-btn" style="width: 5rem">Login</button>
</div>
</form>
</div>
<script src="/js/script.js"></script>
</body>
Singup.ejs

<% layout("/layouts/boilerplate.ejs")%>
<body>

60
<div id="new-listing">
<form action="/singup" method="POST" id="listing-form" style="width:
30%">
<h1>Sign-Up</h1>
<label for="username" class="form-label white">Username</label>
<input
type="text"
name="username"
id="title"
class="form-input"
style="width: 90%" />

<span class="material-symbols-outlined titileicon" style="left:


20.4rem">error</span>
<label for="email" class="form-label white">Email</label>
<input type="email" name="email" class="form-input" style="width: 90%"
/>
<span class="material-symbols-outlined titileicon" style="left:
20.4rem">error</span>

<label for="password" class="form-label white">Password</label>


<input
type="password"
name="password"
class="form-input spicial"
style="width: 90%"
/>
<span class="material-symbols-outlined titileicon spicialicon" style="left:
20.4rem">error</span>

<button type="submit" id="add-btn" style="width: 5.5rem">Sign-


Up</button>
</form>
</div>
<script src="/js/script.js"></script>
</body>

Szyleing for Listing And User EJS

Style.css
*::selection {
color: #ffffff;
background-color: #fe424d;
61
}
body {
margin: 0;
background-color: #ffffff;
font-family: "Roboto", sans-serif;
height: 100vh;
}
.outer {

height: 5rem;
padding: 0 3.06rem;
display: flex;
justify-content: space-between;
align-items: center;
background-color: #e5e7e7;
position: sticky;
top: 0;
transition: background-color 0.2s linear;
}

.left a {
font-size: 2rem;
font-weight: 700;
text-decoration: none;
color: #fe424d;
}

.right {
width: 55%;
}

ul {
width: 55%;
display: flex;
justify-content: space-between;
align-items: center;
}

h3 {
margin: 0;
}

ul a {
62
color: black;
font-weight: 600;
}
a{
text-decoration: none;
}
/* night-mode */
.n-mode {
font-size: 1.5rem;
cursor: pointer;
padding: 12px;
border-radius: 50%;
}
.n-mode:hover {
background-color: rgb(216, 213, 213);
}
.bx-sun {
position: absolute;
left: 73.4rem;
visibility: hidden;
}
footer {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
margin-top: 5rem;
background-color: rgba(251, 251, 251, 0.569);
height: 8rem;
box-shadow: 0 0 0 0.1px black;
background-color: #e5e7e7;
transition: background-color 0.2s linear;
}
.company-info {
width: 25rem;
display: flex;
justify-content: space-around;
flex-wrap: nowrap;
color: black;
}
.company-info a {
display: inline-block;
}
.social i {
margin-left: 10px;
63
color: black;
font-size: 1.2rem;
}
.listing-container {
margin-top: 2rem;
padding: 0 2.5rem;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.listing-container .card {
display: inline-block;
width: 17.31rem;
margin-bottom: 1rem;
height: 22.6rem;
border-radius: 10px;
padding-left: 9px;
padding-right: 9px;
}
.card img {
width: 100%;
height: 70%;
border-radius: 10px;
}
.card img:hover {
/* filter: brightness(108%); Decrease brightness of the image on hover */
}
.card .location {
margin-top: 0.5rem;
margin-bottom: 0.2rem;
font-size: 1rem;
font-weight: bold;
color: rgb(28, 28, 28);
}
.card a {
font-size: 1rem;
font-weight: lighter;
color: rgb(132, 129, 129);
}
.card p {
margin-top: 0.3rem;
font-weight: bold;
color: rgb(86, 85, 85);
text-decoration: underline;
font-size: 1rem;
64
}
#new-listing {
display: flex;
margin-top: 2.5rem;
flex-direction: column;
align-items: center;
height: 100vh;
}
form {
width: 53%;
display: flex;
flex-direction: column;
}
form input,
textarea {
margin-bottom: 1.3rem;
height: 1.7rem;
font-size: 1.04rem;
padding-left: 10px;
border: none;
box-shadow: 0 0 0 0.2px black;
border-radius: 3px;
}
form textarea {
height: 3rem;
}
.form-label {
margin-bottom: 0.4rem;
}
#add-btn,
#edit-btn,
#review-btn {
width: 4rem;
height: 2rem;
background-color: #fe424d;
color: white;
font-size: 1rem;
border-radius: 4px;
cursor: pointer;
border: none;
}
#review-btn {
background-color: black;
box-shadow: 0 0 0 0.4px rgb(255, 255, 255);
}
65
.location-c {
display: flex;
flex-direction: column;
}
.f {
margin-bottom: 0.4rem;
}
.s {
display: flex;
flex-wrap: wrap;
}
.tax {
transform: scale(0.9);
margin-left: 7rem;
height: 2.5rem;
display: flex;
align-items: center;
box-shadow: 0 0 0 1px rgb(223, 223, 223);
padding: 0 0.3rem 0 1rem;
transition: 0.3s;
border-radius: 10px;
}
.tax:hover {
box-shadow: 0 0 0 1px rgb(0, 0, 0);
cursor: pointer;
}

66
4.2 – SANPSHOT OF PROJECT

SNAPSHOTS OF HOME PAGE

SNAPSHOTS OF SHOW DETAILS PAGE

67
SNAPSHOTS OF SINGUP PAGE

SNAPSHOTS OF LOGIN PAGE

68
SNAPSHOTS OF PROFILE PAGE

SNAPSHOTS OF CREATE NEW LISTING PAGE

69
SNAPSHOTS OF EDIT LISTING PAGE

SNAPSHOTS OF CREATE REVIEW PAGE

70
SNAPSHOTS OF ALL BOOKING PAGE

SNAPSHOTS OF ALL PAYMENT PAGE

71
SNAPSHOTS OF ALL REVIEW PAGE

SNAPSHOTS OF ALL BOOKING PAGE

72
CHAPTER - 5

73
5.1 – FUTURES COPE
 Service Expansion into New Locations: Easystay may look into ways to
extend its reach into other cities and areas in order to serve a larger
clientele of people looking for high-quality housing outside of its present
service areas. •

 Diversification of Accommodation Types: To accommodate a range of user


preferences and needs, Easystay can offer a greater selection of lodging
options in addition to the standard flats, rooms, hostels, and private guest
rooms. These options include serviced apartments, co-living spaces, and
short-term rentals.

 Better User Experience: To make it even simpler and more effective for
people to find appropriate lodging on the platform, ongoing enhancements
to the user interface, search algorithms, and booking procedure can be put
into place.

 Integration of Cutting-Edge Technologies: Easystay can provide cutting-


edge features like virtual property tours, tailored recommendations, and
predictive analytics by utilizing cutting-edge technologies like augmented
reality (AR) and artificial intelligence (AI). This will increase user satisfaction
and engagement.

 Partnerships and Collaborations: Working together with property


management firms, housing associations, and real estate developers can
give Easystay access to a larger selection of properties and special offers,
enhancing the services that are offered to platform users.

74
3.2 – CONCLUSION
Easystay is well-positioned to transform the housing search process by
tackling the obstacles people encounter when trying to locate high-quality
apartments. Easystay provides a centralized solution for users by
streamlining the process of finding apartments, rooms, hostels, and private
groups with its extensive online platform. Easystay has enormous potential
to grow into new areas, diversify its lodging options, and incorporate
cutting-edge technologies as it develops further. Easystay strives to not
only meet but surpass its users' expectations by putting a high priority on
the user experience, establishing strategic partnerships, and supporting
sustainability initiatives. Easystay is positioned to maintain its leadership
position in the housing search industry by providing convenience,
efficiency, and satisfaction to people looking for their dream homes. This is
due to its unwavering dedication to innovation and continuous
improvement.

4.2 – REFERENCES

 www.airbnb.co.in
 www.geeksforgeeks.org
 www.github.com
 https://firebase.google.com/docs/
 https://mongodb.com/docs/

75

You might also like