Nikhil Project File
Nikhil Project File
ON
“Dropship Academy"
BATCH-2021-2025
SUBMITTED BY: Nikhil
(1821322)
UNDER THE SUPERVISION OF
ER. PRERNA DHALL
(H.O.D. )
It is further certified that the work done in this project is a result of the candidate's own efforts . I wish
him/her all success in life.
I /We hereby certify that this work which is presented in the project-I entitled“Dropship Academy”
in fulfilment of requirement for the award of the degree of Bachelor of Technology and submitted to
the department of Computer Science and Engineering of Haryana Engineering College (HEC) Jagadhri
affiliated to Kurukshetra University , Kurukshetra is an authentic record of my/our own, carried out
during period from September 2024 to November 2024 under the Guidance of Er. Anushka Nagpal.
The matter presented in this report has not been submitted by me/us for the award of any other degree
of this or any other Institution/University.
Nikhil (1821322)
III
ACKNOWLEGMENT
Wewishtoexpressourdeepsenseofindebtednessandsincerestgratitudetoour
guide, Er. Prerna Dhall, Department of Computer Science & Engineering,
HaryanaengineeringCollege,Jagadhri,Haryana,forhisinvaluableguidanceand
constructivecriticismthroughoutthisProject.Hehasdisplayeduniquetolerance
and understanding at every step ofprogressandencouragesus.Wedeemitour
privilege to have carried out our project work under his able guidance.
We would especially like to thank Er. Prerna Dhall (HOD) Department of
Computer Science & Engineering, Haryana Engineering College, Jagadhri,
Haryana whom, this work would not have been as it is now.
AsaFinalPersonalNote,Wearegratefultoourparents,whoareinspirationalto
us in their understanding, patience and constant encouragement.
Nikhil (1821322)
IV
TABLE OF CONTENT
HOD’sDeclarationCertificate..........................................................................................................I
Guide’sDeclarationCertificate.........................................................................................................II
Candidate’sDeclarationCertificate................................................................................................III
Acknowledgement...............................................................................................................................IV
ListOfFigures...................................................................................................................................V
Abstact................................................................................................................................................VI
Chapter 1: INTRODUCTION………….…………………………………………………….
● IntroductiontoWebDevelopment......................................................................................1
● HTML,CSSAndJAVASCRIPT.........................................................................................2-3
● HTML..................................................................................................................................4
● CSS...................................................................................................................................5-6
● JAVSCRIPT.......................................................................................................................6-7
● SystemDesign...................................................................................................................8-9
● IntroductiontoProject........................................................................................................10
● Terminologyused................................................................................................................10
● Requirements.......................................................................................................................11
● ProjectCode......................................................................................................................12-20
Chapter 6: RESULTS…………………………………………………………………………….
● The result of the above Project are 21-23
REFRENCES……………………………………………………………………………………
V
ABSTRACT
The goal of this project was to design a course selling website for a graduating
designstudentandtoreportontheprocess.Thisprojectwillbeusedintherealtime
to provide the course to the student who will buy them manually.
The objective of this work is to create guidelines for a student or a new starter to
start their own businesswhentheyarenewtothebusiness.Weselltheproductsto
them and they buy them.
V
CHAPTER 1
INTRODUCTION
CHAPTER 1 INTRODUCTION
Figure:1.1
1
●HTML: HTML (Hypertext Markup Language) is the codethat is used to
s tructure a web page and its content. For example, content could be structured
within a set of paragraphs, a list of bulleted points, or using images and data tables.
As the title suggests, this article will give you a basic understanding of HTML and its
functions.
Figure: 1.2
CSS: CSS (Cascading Style Sheets) is used to styleand layout web pages — for
●
example, to alter the font, colour, size, and spacing of your content, split it into
multiple columns, or add animations and other decorative features. This module
provides a gentle beginning to your path towards CSS mastery with the basics of
how it works, what the syntax looks like, and how you can start using it to add
styling to HTML.
Figure: 1.3
2
● Javascript: JavaScript is a scripting or programminglanguage that allows
you to implement complex features on web pages - every time a web page does
more than just sit there and display static information for you to look at -
displaying timely content updates, interactive maps, animated 2D/3D graphics,
scrolling video jukeboxes, etc . In our web page we used javascript for the
animations on our login.
Figure:1.4
3
CHAPTER 2
LITERATURE SURVEY
CHAPTER 2 LITERATURE SURVEY
2.1HTML
TML stands for Hyper Text Markup Language. It is the standard Markup language used to create
H
web pages. HTML is a combination of Hypertext and Markup language. Hypertext defines the link
between web pages. A Markup language is used to define the text document within the tag to define
the structure of web pages.
his language is used to annotate (make notes for the computer) text so that a machine can
T
understand it and manipulate text accordingly. Most Markup languages (e.g. HTML) are
human-readable. The language uses tags to define what manipulation has to be done on the text.
STRUCTURE OF HTML
he basic structure of an HTML page is shown below. It contains the essential building-block elements
T
(i.e. doctype declaration, HTML, head, title, and body elements) upon which all webpages are created.
Figure:2.1
USES:
H
● TML is used to build websites.
● It is supported by all browsers.
● It can be integrated with other languages like CSS, JavaScript, etc.
4
2.2CSS
SS (Cascading Style Sheets) is a simply designed language intended to simplify the process of
C
making web pages presentable. CSS allows you to apply styles to HTML documents. It describes
how a webpage should look. It prescribes color, fonts, spacing, etc. In short, you can make your
website look however you want. CSS lets developers and designers define how it behaves, including
how elements are positioned in the browser.
Figure:2.2
TML uses tags and CSS uses rulesets. CSS styles are applied to the HTML element using selectors.
H
CSS is easy to learn and understand, but it provides powerful control over the presentation of an
HTML document.
•Used in creating social media. It is highly used in styling the UI of social media.
• Used in dynamic templates. Many CSS frameworks help to create the dynamicelement of the
web page.
5
•e-Commerce
ne of the key applications of CSS involves the development and designing of eCommerce
O
platforms from scratch. From large-scale portals to small sites, every eCommerce platform today
uses CSS files to heighten the visual appeal and user experience of their websites.
•Social Media
acebook, Instagram, Twitter, and other major social media networks have all used
F
Cascading Style Sheets to create dynamic websites that look great on desktop web browsers and
mobile devices alike. Customizing the user interface and making design changes from an end-user
perspective are the primary applications of CSS on social media platforms.
ADVANTAGES OF CSS
• CSS plays an important role, by using CSS you simply got to specify a repeated style for
element once & use it multiple times as because CSS will automatically apply the required styles.
• The main advantage of CSS is that style is applied consistently across variety of sites. One
instruction can control several areas which is advantageous.
•Web designers need to use few lines of programming for every page improving site speed.
• Cascading sheet not only simplifies website development, but also simplifies the maintenance as
a change of one line of code affects the whole web site and maintenance time.
•It is less complex therefore the effort is significantly reduced.
•It helps to form spontaneous and consistent changes.
• CSS changes are device friendly. With people employing a batch of various range of smart
devices to access websites over the web, there’s a requirement for responsive web design.
• It has the power for re-positioning. It helps us to determine the changes within the position of
web elements who are there on the page.
2.3JAVASCRIPT
JavaScript is a programming language for use in HTML pages
6
WHAT CAN JAVASCRIPT DO?
•JavaScript can dynamically modify an HTML page.
Figure:2.3
7
CHAPTER 3 SYSTEM DESIGN
CHAPTER 3 SYSTEM DESIGN
Systemdesignistheprocessofdesigningtheelementsofasystemsuchas
the architecture, modules and components, the different interfaces of those
components and the data that goes through that system.
ThepurposeoftheSystemDesignprocessistoprovidesufficientdetailed
data and information about the systemanditssystemelementstoenable
the implementation consistent with architectural entities as defined in
models and views of the system architecture.
This Website will provide the work , experience , Achievements and contains
information of the author.
● System Interface:
Theuserinterfaceforthetaskwillhaveawebsitethatwillhavethework,experience
,Achievementsandcontactinformationabouttheauthor.ThissitewillutilizeHTML,
CSS and JavaScript for portfolio website projects.
● Product Functions:
● It will show the Academic Details about the author.
● It will show the Technical Specializations about the author.
8
● It will also show Achievements , Skills and Contact details about the author.
A website is a web page which you can run using your favourite browser. In the
website all details are static and can only be updated by the author. It requires
knowledge of html , CSS and JS, react js , node superbase to update any entry in this
project.
CHAPTER 4 PROJECT DETAILS WITH REQUIREMENTS
Introduction to Project
A portfolio introduction sets the stage for Dropship, an online learning platform
designed to deliver a variety of educational courses to users inastreamlinedand
efficient manner. The platform isstructuredtosupportlearnersbyofferingdigital
content acrossmultiplesubjects,andtheinteractionprocessiscarriedoutthrough
a user-friendly interface accessible from any device. These courses cover a wide
range of topics and are structured for self-paced learning, enablingindividualsto
gain skills, certifications, or insights at their convenience. Dropship leverages
modern web technologies to provide a scalable, secure,andengagingexperience,
with features such as progress tracking, resource downloads, and integrated
assessments.Theplatformisaimedatanyonelookingtoenhancetheirknowledge
or career through structured, accessible digital education.
Technology Stack:
● TML
H
● CSS
● JAVASCRIPT
● React
● Node
● Superbase
10
Requirements
11
const
config
=
{
server:
{
mongoHost:
process
.
e
nv
.
MONGO_DB_HOST
||
'127.0.0.1'
,
mongoPort:
parseInt
(
p
rocess
.
env
.
MONGO_DB_PORT
||
'27017'
),
mongoDb:
process
.
env
.
MONGO_DB
,
poolSize:
process
.
e
nv
.
MONGO_POOL_SIZE
||
'100'
,
route:
process
.
env
.
R
OUTE
||
'api'
,
port:
process
.
e
nv
.
P
ORT
||
'4000'
,
nodeEnv:
process
.
env
.
NODE_ENV
||
'dev'
,
jwtSecretKey:
process
.
env
.
J
WT_SECRET
,
db:
process
.
env
.
MONGO_DB
||
'template'
,
backendLink:
process
.
env
.
B
ACKEND_LINK
||
''
,
smtpMail:
process
.
e
nv
.
SMTP_MAIL
||
''
,
smtpPassword:
process
.
env
.
S
MTP_PASS
||
''
}
};
module
.
exports
=
config
;
const
mongoose
=
require
(
'
mongoose'
);
const
config
=
require
(
'./config'
);
const
cluster
=
require
(
'cluster'
);
const
{
server
: {
mongoHost
,
mongoPort
,
db
,
poolSize
}
}
=
config
;
const
mongoUrl
=̀mongodb://
${
mongoHost
}
:
$
{
mongoPort
}
/
${
db
}
?maxPoolSize=
${
poolSize
}
̀
;
const
CoachService
=
require
(
'../services/coach-services'
);
const
{
ErrorHandler
}
=
require
(
'
../utils/error-handler'
);
const
{
sendResponse
}
=
require
(
'
../helpers/helpers'
);
const
{
Student
}
=
require
(
'../models/user-model'
);
const
{
wrapAsync
}
=
require
(
'../utils/wrapAsync'
);
const
{
USER_ROLE
,
COACH
}
=
require
(
'
../helpers/constant-enums'
);
const
MAIL_HANDLER
=
require
(
'../mails/mails'
);
const
{
generatePassword
}
=
require
(
'
../utils/utils'
);
// Create Coach
const
createCoach
=
wrapAsync
(
async
(
req
,
res
)
=>
{
const
coachData
=
req
.
b
ody
;
// Check if email already exists
const
emailExists
=
await
CoachService
.
g
etUserByEmail
(
c
oachData
.
email
);
if
(emailExists
) {
throw
new
ErrorHandler
(
400
,
'Email already
exists'
);
}
const
studentIds
=
coachData
.
a
ssignedStudents
;
if
(studentIds
&&
studentIds
.
length
>
0
) {
await
CoachService
.
c
heckAssignedStudents
({
...
coachData
,
_id:
emailExists
?.
_id
});
}
const
newCoach
=
await
CoachService
.
createCoach
({
...
coachData
,
role:
USER_ROLE
.
COACH
});
await
Student
.
u
pdateMany
({
_id:
{
$in:
studentIds
} }, {
$set:
{
assignedCoach:
newCoach
.
_id
} });
const
randomPassword
=
generatePassword
(
8
)
;
newCoach
.
password
=
randomPassword
;
await
newCoach
.
save
();
MAIL_HANDLER
.
sendEmailToUserWithPassword
(
n
ewCoach
?.
email
,
'Coach Account Created'
,
'Your
account has been created successfully'
,
randomPassword
);
newCoach
.
password
=
undefined
;
delete
newCoach
.
password
;
sendResponse
(
res
,
201
,
newCoach
,
'Coach created
successfully'
);
});
// Update Coach
const
updateCoach
=
wrapAsync
(
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
p
arams
;
const
updateData
=
req
.
b
ody
;
const
studentIds
=
updateData
.
assignedStudents
;
if
(studentIds
&&
studentIds
.
length
>
0
) {
await
CoachService
.
c
heckAssignedStudents
({
...
updateData
,
_id:
id
});
}
if
(updateData
.
coachType
===
COACH
.
COACH_TYPE
.
LOW_TICKET
)
{
updateData
.
highTicketStudentSpots
=
0
;
}
if
(updateData
.
coachType
===
COACH
.
COACH_TYPE
.
HIGH_TICKET
)
{
updateData
.
lowTicketStudentSpots
=
0
;
}
const
updatedCoach
=
await
CoachService
.
updateCoach
(
id
,
updateData
);
await
Student
.
u
pdateMany
({
_id:
{
$in:
studentIds
} }, {
$set:
{
assignedCoach:
updatedCoach
.
_id
} });
if
(updateData
.
assignedStudents
===
undefined
||
updateData
.
assignedStudents
.
length
===
0
) {
await
Student
.
u
pdateMany
({
assignedCoach:
id
}, {
$unset:
{
assignedCoach:
1
} });
}
if
(!
updatedCoach
)
throw
new
ErrorHandler
(
404
,
'Coach not found'
);
sendResponse
(
res
,
200
,
updatedCoach
,
'Coach updated
successfully'
);
});
const
getCoachById
=
wrapAsync
(
a
sync
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
p
arams
;
const
coach
=
await
CoachService
.
g
etCoachById
(
id
);
if
(!
coach
)
throw
new
ErrorHandler
(
404
,
'Coach
not found'
);
sendResponse
(
res
,
200
,
coach
,
'Coach fetched successfully'
);
});
const
getAllCoaches
=
wrapAsync
(
a
sync
(
req
,
res
)
=>
{
const
{
page
=
1,
limit
=
10
,
...
rest
}
=
req
.
q
uery
;
const
coaches
=
await
CoachService
.
getAllCoaches
(
r
est
,
page
,
limit
);
return
res
.
status
(
2
00
).
json
({
data:
coaches
.
c
oaches
,
total:
coaches
.
total
,
page:
coaches
.
p
age
,
limit:
coaches
.
limit
,
message:
'Coaches fetched successfully'
});
});
// Delete Coach
const
deleteCoach
=
wrapAsync
(
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
p
arams
;
const
coach
=
await
CoachService
.
g
etCoachById
(
id
);
const
checkAssignedStudents
=
coach
.
assignedStudents
.
length
;
if
(checkAssignedStudents
>
0
)
{
throw
new
ErrorHandler
(
400
,
'Cannot delete
coach with assigned students'
);
}
const
deletedCoach
=
await
CoachService
.
deleteCoach
(
id
);
if
(!
deletedCoach
)
throw
new
ErrorHandler
(
404
,
'Coach not found'
);
sendResponse
(
res
,
200
,
null
,
'Coach deleted successfully'
);
});
// Deactivate Coach
const
deactivateCoach
=
wrapAsync
(
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
p
arams
;
const
updatedCoach
=
await
CoachService
.
deactivateCoach
(
id
);
if
(!
updatedCoach
)
throw
new
ErrorHandler
(
404
,
'Coach not found'
);
sendResponse
(
res
,
200
,
updatedCoach
,
'Coach deactivated
successfully'
);
});
// Activate Coach
const
activateCoach
=
wrapAsync
(
a
sync
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
p
arams
;
const
updatedCoach
=
await
CoachService
.
activateCoach
(
i
d
);
if
(!
updatedCoach
)
throw
new
ErrorHandler
(
404
,
'Coach not found'
);
sendResponse
(
res
,
200
,
updatedCoach
,
'Coach activated
successfully'
);
});
module
.
exports
=
{
createCoach
,
updateCoach
,
getCoachById
,
getAllCoaches
,
deleteCoach
,
deactivateCoach
,
activateCoach
};
{
"users"
: {
"columns"
: [
{
"headerName"
:
"lastVisit"
,
"field"
:
"lastVisit"
,
"wrapText"
:
true
,
"autoHeight"
:
true
,
"resizable"
:
false
,
"hide"
:
false
},
{
"headerName"
:
"isVerified"
,
"field"
:
"isVerified"
,
"wrapText"
:
true
,
"autoHeight"
:
true
,
"resizable"
:
false
,
"hide"
:
true
},
{
"headerName"
:
"role"
,
"field"
:
"role"
,
"wrapText"
:
true
,
"autoHeight"
:
true
,
"resizable"
:
false
,
"hide"
:
true
},
{
"headerName"
:
"createdAt"
,
"field"
:
"createdAt"
,
"wrapText"
:
true
,
"autoHeight"
:
true
,
"resizable"
:
false
,
"hide"
:
true
},
{
"headerName"
:
"updatedAt"
,
"field"
:
"updatedAt"
,
"wrapText"
:
true
,
"autoHeight"
:
true
,
"resizable"
:
false
},
{
"headerName"
:
"password"
,
"field"
:
"password"
,
"wrapText"
:
true
,
"autoHeight"
:
true
,
"resizable"
:
false
,
"hide"
:
true
}
]
}
}
const
{
Joi
,
Segments
}
=
require
(
'celebrate'
);
const
objectIdRegex
=
/
^
[
0
-9a-fA-F
]
{24}
$
/
;
const
objectIdMessage
=
'Invalid ObjectId format.
Must be a 24-character hex string.'
;
const
createCourse
=
{
[
Segments
.
BODY
]:
Joi
.
object
().
keys
({
title:
Joi
.
string
().
required
().
messages
({
'string.base'
:
'Course title must be a
string.'
,
'any.required'
:
'Course title is required.'
}),
subtitle:
Joi
.
s
tring
().
optional
().
allow
(
''
,
null
).
messages
({
'string.base'
:
'Subtitle must be a string.'
}),
category:
Joi
.
array
().
items
(
Joi
.
s
tring
().
regex
(
objectIdRegex
).
message
(
objectIdMessage
)).
required
().
message
s
({
'array.base'
:
'Category must be an array
of valid ObjectIds.'
,
'any.required'
:
'You must provide at least
one category.'
,
'string.pattern.base'
:
objectIdMessage
}),
thumbnail:
Joi
.
s
tring
().
optional
().
messages
({
'string.base'
:
'Thumbnail must be a string.'
}),
banner:
Joi
.
string
()
.
optional
()
.
messages
({
'string.base'
:
'Banner must be a string.'
})
.
allow
(
''
,
null
),
trailer:
Joi
.
s
tring
().
optional
().
allow
(
''
,
null
).
messages
({
'string.base'
:
'Trailer URL must be a string.'
}),
description:
Joi
.
string
().
optional
().
messages
({
'string.base'
:
'Description must be a string.'
}),
enrolledStudents:
Joi
.
array
().
items
(
Joi
.
s
tring
().
regex
(
objectIdRegex
).
message
(
objectIdMessage
)).
optional
().
message
s
({
'array.base'
:
'Enrolled students must be
an array of valid ObjectIds.'
,
'string.pattern.base'
:
objectIdMessage
}),
vimeoVideoData:
Joi
.
a
ny
().
optional
().
allow
(
''
,
null
)
})
};
const
updateCourse
=
{
[Segments.
PARAMS
]:
Joi
.
o
bject
().
keys
({
id:
Joi
.
s
tring
().
regex
(
objectIdRegex
).
required
().
messages
({
'string.base'
:
'Course ID must be a string.'
,
'string.pattern.base'
:
objectIdMessage
,
'any.required'
:
'Course ID is required.'
})
}),
[Segments.
BODY
]:
Joi
.
object
().
keys
({
title:
Joi
.
string
().
optional
().
messages
({
'string.base'
:
'Course title must be a
string.'
}),
subtitle:
Joi
.
s
tring
().
optional
().
allow
(
''
,
null
).
messages
({
'string.base'
:
'Subtitle must be a string.'
}),
category:
Joi
.
array
().
items
(
Joi
.
s
tring
().
regex
(
objectIdRegex
).
message
(
objectIdMessage
)).
optional
().
mess
const
{
Joi
,
Segments
}
=
require
(
'celebrate'
);
const
{
EVENT
}
=
require
(
'
../helpers/constant-enums'
);
const
createEvent
=
{
[
Segments
.
BODY
]:
Joi
.
object
().
keys
({
topic:
Joi
.
string
().
required
().
messages
({
'any.required'
:
'Event topic is required'
}),
dateTime:
Joi
.
d
ate
().
required
().
messages
({
'any.required'
:
'Event date and time are
required'
}),
eventHost:
Joi
.
s
tring
().
optional
(),
meetingLink:
Joi
.
string
().
when
(
'
typeOfEvent'
,
{
is:
EVENT
.
EVENT_TYPE
.
ONLINE
,
then:
Joi
.
r
equired
().
messages
({
'any.required'
:
'Meeting link is required
for online events'
}),
otherwise:
Joi
.
f
orbidden
()
}),
location:
Joi
.
s
tring
().
when
(
'typeOfEvent'
,
{
is:
EVENT
.
EVENT_TYPE
.
ONSITE
,
then:
Joi
.
r
equired
().
messages
({
'any.required'
:
'Location is required
for onsite events'
}),
otherwise:
Joi
.
f
orbidden
()
}),
typeOfEvent:
Joi
.
string
().
valid
(
EVENT
.
EVENT_TYPE
.
ONLINE
,
EVENT
.
EVENT_TYPE
.
O
NSITE
).
required
().
messages
({
'any.required'
:
'Event type is required'
}),
attendees:
Joi
.
a
rray
()
.
items
(
Joi
.
string
()
.
regex
(
/
^
[
0
-9a-fA-F
]
{
24}
$
/
)
.
messages
({
'string.pattern.base'
:
'Attendee ID must be a valid 24-character
hexadecimal string'
})
)
.
optional
(),
thumbnail:
Joi
.
s
tring
().
optional
().
allow
(
''
).
allow
(
null
)
})
};
const
requestMeeting
=
{
[Segments.
BODY
]:
Joi
.
object
().
keys
({
topic:
Joi
.
string
().
required
().
messages
({
'any.required'
:
'Meeting topic is required'
}),
dateTime:
Joi
.
d
ate
().
required
().
messages
({
'any.required'
:
'Meeting date and time
are required'
}),
eventHost:
Joi
.
s
tring
().
optional
(),
meetingLink:
Joi
.
string
().
when
(
'
typeOfEvent'
,
{
is:
EVENT
.
EVENT_TYPE
.
ONLINE
,
then:
Joi
.
r
equired
().
messages
({
'any.required'
:
'Meeting link is required
for online events'
}),
otherwise:
Joi
.
f
orbidden
()
}),
location:
Joi
.
s
tring
().
when
(
'typeOfEvent'
,
{
is:
EVENT
.
EVENT_TYPE
.
ONSITE
,
then:
Joi
.
r
equired
().
messages
({
'any.required'
:
'Location is required
for onsite events'
}),
otherwise:
Joi
.
f
orbidden
()
}),
typeOfEvent:
Joi
.
string
().
valid
(
EVENT
.
EVENT_TYPE
.
ONLINE
,
EVENT
.
EVENT_TYPE
.
O
NSITE
).
required
().
messages
({
'any.required'
:
'Event type is required'
}),
thumbnail:
Joi
.
s
tring
().
optional
().
allow
(
''
).
allow
(
null
),
reason:
Joi
.
string
().
optional
(),
attendees:
Joi
.
a
rray
()
.
items
(
Joi
.
string
()
.
regex
(
/
^
[
0
-9a-fA-F
]
{
24}
$
/
)
.
messages
({
'string.pattern.base'
:
'Attendee
ID must be a valid 24-character
hexadecimal string'
})
)
.
optional
(),
timeZone:
Joi
.
s
tring
().
optional
()
})
};
const
updateEvent
=
{
[Segments.
PARAMS
]:
Joi
.
o
bject
().
keys
({
id:
Joi
.
s
tring
()
.
regex
(
/
^
[
0-9a-fA-F
]
{
24}
$
/
)
.
required
()
.
messages
({
'string.pattern.base'
:
'Event ID must
be a valid 24-character hexadecimal
string'
,
'any.required'
:
'Event ID is required'
})
}),
[Segments.
BODY
]:
Joi
.
object
().
keys
({
topic:
Joi
.
string
().
optional
(),
dateTime:
Joi
.
d
ate
().
optional
(),
eventHost:
Joi
.
s
tring
().
optional
(),
meetingLink:
Joi
.
string
().
when
(
'
typeOfEvent'
,
{
is:
EVENT
.
EVENT_TYPE
.
ONLINE
,
then:
Joi
.
r
equired
().
messages
({
'any.required'
:
'Meeting link is required
for online events'
}),
otherwise:
Joi
.
f
orbidden
()
}),
location:
Joi
.
s
tring
().
when
(
'typeOfEvent'
,
{
is:
EVENT
.
EVENT_TYPE
.
ONSITE
,
then:
Joi
.
r
equired
().
messages
({
'any.required'
:
'Location is required
for onsite events'
}),
otherwise:
Joi
.
f
orbidden
()
}),
typeOfEvent:
Joi
.
string
().
valid
(
EVENT
.
EVENT_TYPE
.
ONLINE
,
EVENT
.
EVENT_TYPE
.
O
NSITE
).
optional
(),
attendees:
Joi
.
a
rray
()
.
items
(
Joi
.
string
()
.
regex
(
/
^
[
0
-9a-fA-F
]
{
24}
$
/
)
.
messages
({
'string.pattern.base'
:
'Attendee
ID must be a valid 24-character
hexadecimal string'
})
)
.
optional
(),
thumbnail:
Joi
.
s
tring
().
optional
().
allow
(
null
,
''
)
})
};
const
getEventById
=
{
[Segments.
PARAMS
]:
Joi
.
o
bject
().
keys
({
id:
Joi
.
s
tring
()
.
regex
(
/
^
[
0-9a-fA-F
]
{
24}
$
/
)
.
required
()
.
messages
({
'string.pattern.base'
:
'Event ID must
be a valid 24-character hexadecimal
string'
,
'any.required'
:
'Event ID is required'
})
})
};
const
deleteEvent
=
{
[Segments.
PARAMS
]:
Joi
.
o
bject
().
keys
({
id:
Joi
.
s
tring
()
.
regex
(
/
^
[
0-9a-fA-F
]
{
24}
$
/
)
.
required
()
.
messages
({
'string.pattern.base'
:
'Event ID must
be a valid 24-character hexadecimal
string'
,
'any.required'
:
'Event ID is required'
})
})
};
module
.
exports
=
{
createEvent
,
requestMeeting
,
updateEvent
,
getEventById
,
deleteEvent
CHAPTER 6 RESULTS
The results of the above project are:
Figure: 5.1
Lecture view
Figure : 5.4
Video play
22
Figure:5.5
Conclusion:
ropship serves as a comprehensive digital learning platform focused on delivering quality
D
educational content to users in an accessible and efficient manner. By offering structured
courses across various domains, it empowers learners to take control of their personal and
professional development. With an intuitive interface and scalable architecture, the system
ensures a seamless experience from enrollment to course completion. Through consistent
performance and ease of use, Dropship positions itself as a reliable solution for modern
e-learning needs.
🔮 Future Scope
•In the future, Dropship aims to expand its course catalog by partnering with industry
experts and institutions to offer certified programs.
• Additional features like community forums, mobile apps, multilingual support, and
live instructor sessions are planned to further enrich the learning journey.
•Dropship also envisions incorporating blockchain for certificate validation and secure
credential storage to boost trust and transparency in the education ecosystem.
24
REFERENCES
https://react.dev/
https://www.npmjs.com/package/html-docx-js
https://developer.mozilla.org/en-US/docs/Web/HTML
https://nodejs.org/docs/latest/api/
https://supabase.com/docs
VII