Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
students
quiz-competition
Commits
35f88acc
Commit
35f88acc
authored
Sep 28, 2020
by
Yoon, Daeki
😅
Browse files
sign in
parent
55f78aee
Changes
16
Expand all
Show whitespace changes
Inline
Side-by-side
src/client/.env
0 → 100644
View file @
35f88acc
browser=none
\ No newline at end of file
src/client/package.json
View file @
35f88acc
...
...
@@ -3,11 +3,17 @@
"version"
:
"0.1.0"
,
"private"
:
true
,
"dependencies"
:
{
"@fortawesome/fontawesome-free"
:
"^5.14.0"
,
"@testing-library/jest-dom"
:
"^4.2.4"
,
"@testing-library/react"
:
"^9.3.2"
,
"@testing-library/user-event"
:
"^7.1.2"
,
"bootstrap"
:
"^4.5.2"
,
"jquery"
:
"^3.5.1"
,
"popper.js"
:
"^1.16.1"
,
"react"
:
"^16.13.1"
,
"react-bootstrap"
:
"^1.3.0"
,
"react-dom"
:
"^16.13.1"
,
"react-router-dom"
:
"^5.2.0"
,
"react-scripts"
:
"3.4.3"
},
"scripts"
:
{
...
...
@@ -30,5 +36,6 @@
"last 1 firefox version"
,
"last 1 safari version"
]
}
},
"proxy"
:
"http://localhost:3001"
}
src/client/src/App.css
deleted
100644 → 0
View file @
55f78aee
.App
{
text-align
:
center
;
}
.App-logo
{
height
:
40vmin
;
pointer-events
:
none
;
}
@media
(
prefers-reduced-motion
:
no-preference
)
{
.App-logo
{
animation
:
App-logo-spin
infinite
20s
linear
;
}
}
.App-header
{
background-color
:
#282c34
;
min-height
:
100vh
;
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
calc
(
10px
+
2vmin
);
color
:
white
;
}
.App-link
{
color
:
#61dafb
;
}
@keyframes
App-logo-spin
{
from
{
transform
:
rotate
(
0deg
);
}
to
{
transform
:
rotate
(
360deg
);
}
}
src/client/src/App.js
View file @
35f88acc
import
React
from
'
react
'
;
import
logo
from
'
./logo.svg
'
;
import
'
./App.css
'
;
import
{
BrowserRouter
}
from
'
react-router-dom
'
import
MainRouter
from
'
./MainRouter
'
;
function
App
()
{
return
(
<
div
className
=
"
App
"
>
<
header
className
=
"
App-header
"
>
<
img
src
=
{
logo
}
className
=
"
App-logo
"
alt
=
"
logo
"
/>
<
p
>
Edit
<
code
>
src
/
App
.
js
<
/code> and save to reload
.
<
/p
>
<
a
className
=
"
App-link
"
href
=
"
https://reactjs.org
"
target
=
"
_blank
"
rel
=
"
noopener noreferrer
"
>
Learn
React
<
/a
>
<
/header
>
<
/div
>
<
BrowserRouter
>
<
MainRouter
/>
<
/BrowserRouter
>
);
}
...
...
src/client/src/MainRouter.jsx
0 → 100644
View file @
35f88acc
import
React
from
"
react
"
;
import
{
Route
,
Switch
}
from
"
react-router-dom
"
;
import
Signin
from
"
./auth/Signin
"
;
import
Home
from
"
./core/Home
"
;
import
Menu
from
"
./core/Menu
"
;
function
MainRouter
()
{
return
(
<
div
>
<
Menu
/>
<
Switch
>
<
Route
exact
path
=
'/'
>
<
Home
/>
</
Route
>
<
Route
path
=
'/signin'
>
<
Signin
/>
</
Route
>
</
Switch
>
</
div
>
);
}
export
default
MainRouter
;
src/client/src/auth/Signin.jsx
0 → 100644
View file @
35f88acc
import
React
,
{
useState
}
from
"
react
"
;
import
Button
from
"
react-bootstrap/Button
"
;
import
Form
from
"
react-bootstrap/Form
"
;
import
Container
from
"
react-bootstrap/Container
"
;
import
{
signin
}
from
"
./api-auth
"
;
import
auth
from
"
./auth-helpers
"
;
import
{
Redirect
}
from
"
react-router-dom
"
;
function
Signin
()
{
const
[
values
,
setValues
]
=
useState
({
email
:
""
,
password
:
""
,
error
:
""
,
redirect
:
false
,
});
const
handleChange
=
(
name
)
=>
(
event
)
=>
{
setValues
({
...
values
,
[
name
]:
event
.
target
.
value
});
};
const
clickSubmit
=
(
event
)
=>
{
event
.
preventDefault
()
const
user
=
{
email
:
values
.
email
||
undefined
,
password
:
values
.
password
||
undefined
,
};
// console.log('user in Signin.jsx:', user)
signin
(
user
).
then
((
data
)
=>
{
if
(
data
.
error
)
{
setValues
({
...
values
,
error
:
data
.
error
});
}
else
{
auth
.
authenticate
(
data
,
()
=>
{
setValues
({
...
values
,
error
:
""
,
redirect
:
true
});
});
}
});
};
if
(
values
.
redirect
)
{
return
<
Redirect
to
=
'/'
/>
}
return
(
<
Container
className
=
"col-sm-6 col-md-5 col-lg-4 p-5"
>
<
Form
>
<
Form
.
Group
controlId
=
"email"
>
<
Form
.
Label
>
Email
</
Form
.
Label
>
<
Form
.
Control
type
=
"email"
placeholder
=
"Enter email"
onChange
=
{
handleChange
(
'
email
'
)
}
/>
<
Form
.
Text
className
=
"text-muted"
>
We'll never share your email with anyone else.
</
Form
.
Text
>
</
Form
.
Group
>
<
Form
.
Group
controlId
=
"password"
>
<
Form
.
Label
>
Password
</
Form
.
Label
>
<
Form
.
Control
type
=
"password"
placeholder
=
"Password"
onChange
=
{
handleChange
(
'
password
'
)
}
/>
</
Form
.
Group
>
<
Button
variant
=
"primary"
type
=
"submit"
onClick
=
{
clickSubmit
}
>
Submit
</
Button
>
</
Form
>
</
Container
>
);
}
export
default
Signin
;
src/client/src/auth/api-auth.js
0 → 100644
View file @
35f88acc
const
signin
=
async
(
user
)
=>
{
try
{
let
response
=
await
fetch
(
'
/auth/signin
'
,
{
method
:
'
POST
'
,
headers
:
{
'
Accept
'
:
'
application/json
'
,
'
Content-Type
'
:
'
application/json
'
,
},
credentials
:
'
include
'
,
body
:
JSON
.
stringify
(
user
),
})
return
await
response
.
json
()
}
catch
(
error
)
{
console
.
log
(
error
)
}
}
const
signout
=
async
()
=>
{
try
{
let
response
=
await
fetch
(
'
/auth/signout
'
,
{
method
:
'
GET
'
,
})
return
await
response
.
json
()
}
catch
(
error
)
{
console
.
log
(
error
)
}
}
export
{
signin
,
signout
,
}
\ No newline at end of file
src/client/src/auth/auth-helpers.js
0 → 100644
View file @
35f88acc
const
authenticate
=
(
jwt
,
cb
)
=>
{
if
(
typeof
window
!==
'
undefined
'
)
{
sessionStorage
.
setItem
(
'
jwt
'
,
JSON
.
stringify
(
jwt
))
}
cb
()
}
const
isAuthenticated
=
()
=>
{
if
(
typeof
window
===
'
undefined
'
)
{
return
false
}
const
token
=
sessionStorage
.
getItem
(
'
jwt
'
)
if
(
token
)
{
return
JSON
.
parse
(
token
)
}
else
{
return
false
}
}
export
default
{
authenticate
,
isAuthenticated
,
}
\ No newline at end of file
src/client/src/core/Home.jsx
0 → 100644
View file @
35f88acc
import
React
from
'
react
'
function
Home
()
{
return
(
<
div
>
Home
</
div
>
)
}
export
default
Home
src/client/src/core/Menu.jsx
0 → 100644
View file @
35f88acc
import
React
,
{
useState
}
from
"
react
"
;
import
Navbar
from
"
react-bootstrap/Navbar
"
;
import
Nav
from
"
react-bootstrap/Nav
"
;
import
NavDropdown
from
"
react-bootstrap/NavDropdown
"
;
import
Form
from
"
react-bootstrap/Form
"
;
import
FormControl
from
"
react-bootstrap/FormControl
"
;
import
Button
from
"
react-bootstrap/Button
"
;
import
auth
from
"
../auth/auth-helpers
"
;
import
{
Link
}
from
"
react-router-dom
"
;
// import { Link } from "react-router-dom";
function
Menu
()
{
return
(
// <div className='row'>
<
Navbar
bg
=
"dark"
variant
=
"dark"
expand
=
"sm"
>
<
Navbar
.
Brand
href
=
"#home"
>
<
i
className
=
"fas fa-child fa-2x"
></
i
>
</
Navbar
.
Brand
>
<
Navbar
.
Toggle
aria
-
controls
=
"basic-navbar-nav"
/>
<
Navbar
.
Collapse
id
=
"basic-navbar-nav"
>
<
Nav
className
=
"mr-auto"
>
<
Nav
.
Link
href
=
"#home"
>
Home
</
Nav
.
Link
>
<
Nav
.
Link
href
=
"#link"
>
Link
</
Nav
.
Link
>
<
NavDropdown
title
=
"Dropdown"
id
=
"basic-nav-dropdown"
>
<
NavDropdown
.
Item
href
=
"#action/3.1"
>
Action
</
NavDropdown
.
Item
>
<
NavDropdown
.
Item
href
=
"#action/3.2"
>
Another action
</
NavDropdown
.
Item
>
<
NavDropdown
.
Item
href
=
"#action/3.3"
>
Something
</
NavDropdown
.
Item
>
<
NavDropdown
.
Divider
/>
<
NavDropdown
.
Item
href
=
"#action/3.4"
>
Separated link
</
NavDropdown
.
Item
>
</
NavDropdown
>
</
Nav
>
{
auth
.
isAuthenticated
()
?
(
<
Button
>
Sign out
</
Button
>
)
:
(
<
Link
to
=
"/signin"
>
<
Button
>
Sign in
</
Button
>
</
Link
>
)
}
</
Navbar
.
Collapse
>
</
Navbar
>
// </div>
// <nav className="navbar navbar-expand-md navbar-light bg-dark">
// <Link to="" className="navbar-brand">
// <i className="fas fa-child fa-2x text-warning"></i>
// </Link>
// <ul className="navbar-nav">
// <li className="nav-item">
// <Link
// to=""
// className="nav-link text-light text-uppercase font-weight-bold px-3"
// >
// Home
// </Link>
// </li>
// <li className="nav-item">
// <Link
// to=""
// className="nav-link text-light text-uppercase font-weight-bold px-3"
// >
// Skills
// </Link>
// </li>
// <li className="nav-item dropdown" onClick={toggleOpen}>
// <Link
// to=""
// className="nav-link dropdown-toggle text-light text-uppercase font-weight-bold px-3"
// data-toggle="dropdown"
// >
// Projects
// </Link>
// <div className={menuClass}>
// <a href="#nogo" className="dropdown-item">
// Project 1
// </a>
// <a href="#" className="dropdown-item">
// Project 2
// </a>
// <a href="#" className="dropdown-item">
// Project 3
// </a>
// <a href="#" className="dropdown-item">
// Project 4
// </a>
// </div>
// </li>
// <li className="nav-item">
// <Link
// to=""
// className="nav-link text-light text-uppercase font-weight-bold px-3"
// >
// Teams
// </Link>
// </li>
// <li className="nav-item">
// <Link
// to=""
// className="nav-link text-light text-uppercase font-weight-bold px-3"
// >
// Contacts
// </Link>
// </li>
// </ul>
// </nav>
);
}
export
default
Menu
;
src/client/src/index.css
deleted
100644 → 0
View file @
55f78aee
body
{
margin
:
0
;
font-family
:
-apple-system
,
BlinkMacSystemFont
,
'Segoe UI'
,
'Roboto'
,
'Oxygen'
,
'Ubuntu'
,
'Cantarell'
,
'Fira Sans'
,
'Droid Sans'
,
'Helvetica Neue'
,
sans-serif
;
-webkit-font-smoothing
:
antialiased
;
-moz-osx-font-smoothing
:
grayscale
;
}
code
{
font-family
:
source-code-pro
,
Menlo
,
Monaco
,
Consolas
,
'Courier New'
,
monospace
;
}
src/client/src/index.js
View file @
35f88acc
import
React
from
'
react
'
;
import
ReactDOM
from
'
react-dom
'
;
import
'
./index.css
'
;
import
App
from
'
./App
'
;
import
*
as
serviceWorker
from
'
./serviceWorker
'
;
import
'
bootstrap/dist/css/bootstrap.min.css
'
;
import
'
@fortawesome/fontawesome-free/css/all.css
'
ReactDOM
.
render
(
<
React
.
StrictMode
>
...
...
src/client/src/logo.svg
deleted
100644 → 0
View file @
55f78aee
<svg
xmlns=
"http://www.w3.org/2000/svg"
viewBox=
"0 0 841.9 595.3"
>
<g
fill=
"#61DAFB"
>
<path
d=
"M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"
/>
<circle
cx=
"420.9"
cy=
"296.5"
r=
"45.7"
/>
<path
d=
"M520.5 78.1z"
/>
</g>
</svg>
src/client/yarn.lock
View file @
35f88acc
This diff is collapsed.
Click to expand it.
src/server/auth/auth.controller.js
View file @
35f88acc
...
...
@@ -4,6 +4,7 @@ import User from '../user/user.model.js'
import
config
from
'
../config/config.js
'
const
signin
=
async
(
req
,
res
)
=>
{
console
.
log
(
req
.
body
);
try
{
let
user
=
await
User
.
findOne
({
'
email
'
:
req
.
body
.
email
})
if
(
!
user
)
{
...
...
src/server/config/config.js
View file @
35f88acc
const
config
=
{
env
:
process
.
env
.
NODE_ENV
||
'
development
'
,
port
:
process
.
env
.
PORT
||
300
0
,
port
:
process
.
env
.
PORT
||
300
1
,
jwtSecret
:
'
My_Secure_Screte
'
,
mongoUri
:
process
.
env
.
MONGODB_URI
||
'
mongodb://localhost:27017/quizcompetition
'
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment