Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
ecommerce-maven
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ascend
ecommerce-maven
Commits
e7f38f23
Commit
e7f38f23
authored
May 10, 2021
by
Xiyang Lu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[AFP-36] Joe MoveGradleToMaven, finished afp 36 both frontend and backend
parent
1fb4a1bd
Changes
18
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
501 additions
and
20250 deletions
+501
-20250
.DS_Store
ecom-service/.DS_Store
+0
-0
UsersController.java
...ava/com/nisum/ecomservice/controller/UsersController.java
+64
-3
UserRequestBody.java
...ain/java/com/nisum/ecomservice/model/UserRequestBody.java
+17
-0
UserRepository.java
...java/com/nisum/ecomservice/repository/UserRepository.java
+4
-0
UserService.java
.../main/java/com/nisum/ecomservice/service/UserService.java
+28
-1
.env
ecom-web/.env
+2
-0
package-lock.json
ecom-web/package-lock.json
+232
-20241
package.json
ecom-web/package.json
+3
-0
session_actions.js
ecom-web/src/actions/session_actions.js
+30
-0
header-container.js
ecom-web/src/components/Header/header-container.js
+12
-0
header.js
ecom-web/src/components/Header/header.js
+37
-0
product-market.jsx
ecom-web/src/components/product-market/product-market.jsx
+2
-0
session-container.jsx
ecom-web/src/components/session/session-container.jsx
+4
-2
session.jsx
ecom-web/src/components/session/session.jsx
+33
-2
index.js
ecom-web/src/index.js
+1
-0
root_reducer.js
ecom-web/src/reducers/root_reducer.js
+3
-1
user_reducer.js
ecom-web/src/reducers/user_reducer.js
+19
-0
session-api-util.js
ecom-web/src/util/session-api-util.js
+10
-0
No files found.
ecom-service/.DS_Store
View file @
e7f38f23
No preview for this file type
ecom-service/src/main/java/com/nisum/ecomservice/controller/UsersController.java
View file @
e7f38f23
package
com
.
nisum
.
ecomservice
.
controller
;
//import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
//import com.google.api.client.http.javanet.NetHttpTransport;
//import com.google.api.client.json.gson.GsonFactory;
import
com.nisum.ecomservice.model.User
;
import
com.nisum.ecomservice.
repository.UserRepositor
y
;
import
com.nisum.ecomservice.
model.UserRequestBod
y
;
import
com.nisum.ecomservice.service.UserService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.web.bind.annotation.*
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
import
java.util.Collections
;
@RestController
@RequestMapping
(
"/api/users"
)
...
...
@@ -14,8 +22,18 @@ public class UsersController {
@Autowired
private
UserService
userService
;
@Autowired
private
UserRepository
userRepository
;
// @Value("${google.client_id}")
// private String CLIENT_ID;
// NetHttpTransport transport = new NetHttpTransport();
// GsonFactory jsonFactory = new GsonFactory().getDefaultInstance();
//
// GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// // Specify the CLIENT_ID of the app that accesses the backend:
// .setAudience(Collections.singletonList(CLIENT_ID))
// // Or, if multiple clients access the backend:
// //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
// .build();
@GetMapping
()
private
Flux
<
User
>
getUsers
(){
...
...
@@ -25,4 +43,47 @@ public class UsersController {
return
userService
.
getUsers
();
}
@PostMapping
()
public
ResponseEntity
<
Mono
<
User
>>
createUser
(
@RequestBody
UserRequestBody
requestBody
)
{
// GoogleIdToken idToken = verifier.verify(idTokenString);
// if (idToken != null) {
// Payload payload = idToken.getPayload();
// String userId = payload.getSubject();
//// System.out.println("User ID: " + userId);
// // Get profile information from payload
// String email = payload.getEmail();
// boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
// String lastName = (String) payload.get("family_name");
// String firstName = (String) payload.get("given_name");
//
// User newUser = null;
// newUser.setUserId(userId);
// newUser.setEmail(email);
// newUser.setFirstName(firstName);
// newUser.setLastName(lastName);
// newUser.setAccessToken(accessTokenString);
//
// return ResponseEntity.ok(userService.getUserbyEmail(email).switchIfEmpty(userService.createUser(newUser)));
// } else {
// return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
// }
String
idTokenString
=
requestBody
.
getIdToken
();
User
newUser
=
new
User
(
requestBody
.
getUserId
(),
requestBody
.
getEmail
(),
requestBody
.
getFirstName
(),
requestBody
.
getLastName
(),
requestBody
.
getAccessToken
());
Mono
<
Boolean
>
response
=
userService
.
verifyToken
(
idTokenString
);
Mono
<
User
>
newUserMono
=
response
.
flatMap
(
res
->
{
if
(
res
){
return
userService
.
createUser
(
newUser
);
}
else
{
return
Mono
.
empty
();
}
});
return
ResponseEntity
.
ok
(
newUserMono
);
}
}
ecom-service/src/main/java/com/nisum/ecomservice/model/UserRequestBody.java
0 → 100644
View file @
e7f38f23
package
com
.
nisum
.
ecomservice
.
model
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
lombok.Setter
;
@Getter
@Setter
@AllArgsConstructor
public
class
UserRequestBody
{
String
idToken
;
String
userId
;
String
email
;
String
firstName
;
String
lastName
;
String
accessToken
;
}
ecom-service/src/main/java/com/nisum/ecomservice/repository/UserRepository.java
View file @
e7f38f23
package
com
.
nisum
.
ecomservice
.
repository
;
import
com.nisum.ecomservice.model.User
;
import
org.springframework.data.mongodb.repository.Query
;
import
org.springframework.data.mongodb.repository.ReactiveMongoRepository
;
import
org.springframework.stereotype.Repository
;
import
reactor.core.publisher.Mono
;
public
interface
UserRepository
extends
ReactiveMongoRepository
<
User
,
String
>
{
@Query
(
"SELECT u from User u where u.email= $email"
)
Mono
<
User
>
findUserbyEmail
(
String
email
);
}
ecom-service/src/main/java/com/nisum/ecomservice/service/UserService.java
View file @
e7f38f23
...
...
@@ -3,18 +3,45 @@ package com.nisum.ecomservice.service;
import
com.nisum.ecomservice.model.User
;
import
com.nisum.ecomservice.repository.UserRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.reactive.function.client.WebClient
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
@Service
public
class
UserService
{
private
WebClient
webClient
;
@Autowired
private
UserRepository
userRepository
;
public
Flux
<
User
>
getUsers
()
{
return
userRepository
.
findAll
();
}
public
Mono
<
User
>
createUser
(
User
user
)
{
return
userRepository
.
save
(
user
);
}
public
Mono
<
User
>
getUserbyEmail
(
String
email
){
return
userRepository
.
findUserbyEmail
(
email
);
}
public
Mono
<
Boolean
>
verifyToken
(
String
token
){
return
WebClient
.
builder
()
.
build
()
.
get
()
.
uri
(
"https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={token}"
,
token
)
.
exchangeToMono
(
clientResponse
->
{
if
(
clientResponse
.
statusCode
().
is2xxSuccessful
()){
return
Mono
.
just
(
Boolean
.
TRUE
);
}
else
{
return
Mono
.
just
(
Boolean
.
FALSE
);
}
});
}
}
ecom-web/.env
0 → 100644
View file @
e7f38f23
REACT_APP_GOOGLE_CLIENT_ID=925243198137-vco98nrjenavrk0n00dvloblpe205vst
REACT_APP_GOOGLE_SERCRET=hnQt949bODSsvriMfi2lDKdm
\ No newline at end of file
ecom-web/package-lock.json
View file @
e7f38f23
This diff is collapsed.
Click to expand it.
ecom-web/package.json
View file @
e7f38f23
...
...
@@ -8,9 +8,12 @@
"@testing-library/user-event"
:
"^12.1.10"
,
"animate.css"
:
"^4.1.1"
,
"axios"
:
"^0.21.1"
,
"bootstrap"
:
"^5.0.0"
,
"jquery"
:
"^3.6.0"
,
"react"
:
"^17.0.2"
,
"react-bootstrap"
:
"^1.5.2"
,
"react-dom"
:
"^17.0.2"
,
"react-google-login"
:
"^5.2.2"
,
"react-redux"
:
"^7.2.4"
,
"react-router-dom"
:
"^5.2.0"
,
"react-scripts"
:
"4.0.3"
,
...
...
ecom-web/src/actions/session_actions.js
0 → 100644
View file @
e7f38f23
// import {postUser} from '../util/session-api-util'
export
const
SET_CURRENT_USER
=
"SET_CURRENT_USER"
export
const
LOGOUT_USER
=
"LOGOUT_USER"
export
const
setCurrentUser
=
()
=>
{
return
{
type
:
SET_CURRENT_USER
}
}
export
const
logoutUser
=
()
=>
{
return
{
type
:
LOGOUT_USER
}
}
// export const login = (user) => dispatch => {
// return postUser(user).then((response)=>
// dispatch(setCurrentUser(response))
// )
// }
export
const
login
=
()
=>
{
return
(
dispatch
)
=>
{
return
dispatch
(
setCurrentUser
());
};
};
export
const
logOut
=
()
=>
{
return
(
dispatch
)
=>
{
return
dispatch
(
logoutUser
());
};
};
\ No newline at end of file
ecom-web/src/components/Header/header-container.js
0 → 100644
View file @
e7f38f23
import
{
connect
}
from
'react-redux'
;
import
Header
from
'./header'
;
const
mSTP
=
state
=>
({
});
const
mDTP
=
dispatch
=>
({
});
export
default
connect
(
mSTP
,
mDTP
)(
Header
);
\ No newline at end of file
ecom-web/src/components/Header/header.js
0 → 100644
View file @
e7f38f23
import
React
,
{
Component
}
from
'react'
import
Nav
from
'react-bootstrap/Nav'
import
Navbar
from
'react-bootstrap/Navbar'
import
NavDropdown
from
'react-bootstrap/NavDropdown'
import
Session
from
'../session/session-container'
export
default
class
Header
extends
Component
{
constructor
(
props
)
{
super
(
props
)
this
.
state
=
{}
}
render
()
{
return
(
<
div
>
<
Navbar
collapseOnSelect
expand
=
"lg"
bg
=
"primary"
variant
=
"dark"
>
<
Navbar
.
Brand
href
=
"#home"
>
Ascend
Ecommerce
<
/Navbar.Brand
>
<
Navbar
.
Toggle
aria
-
controls
=
"responsive-navbar-nav"
/>
<
Navbar
.
Collapse
id
=
"responsive-navbar-nav"
>
<
Nav
>
<
Navbar
.
Text
>
Hello
Guest
!
<
/Navbar.Text
>
<
/Nav
>
<
Nav
className
=
"ms-auto"
>
<
Session
/>
<
Nav
.
Link
>
Cart
<
/Nav.Link
>
<
/Nav
>
<
/Navbar.Collapse
>
<
/Navbar
>
<
/div
>
)
}
}
ecom-web/src/components/product-market/product-market.jsx
View file @
e7f38f23
import
'../../resources/stylesheets/product-market.css'
;
import
React
,
{
Component
}
from
'react'
import
Header
from
'../Header/header-container'
export
default
class
ProductMarket
extends
Component
{
constructor
(
props
)
{
...
...
@@ -16,6 +17,7 @@ export default class ProductMarket extends Component {
render
()
{
return
(
<
div
>
<
Header
/>
{
this
.
props
.
products
.
map
(
prod
=>
{
return
(
<
div
key=
{
prod
.
sku
}
>
...
...
ecom-web/src/components/session/session-container.jsx
View file @
e7f38f23
import
{
connect
}
from
'react-redux'
;
import
Session
from
'./session'
;
import
{
login
,
logOut
}
from
'../../actions/session_actions'
const
mSTP
=
state
=>
({
currentUser
:
state
.
user
});
const
mDTP
=
dispatch
=>
({
login
:
()
=>
dispatch
(
login
()),
logOut
:
()
=>
dispatch
(
logOut
())
});
export
default
connect
(
mSTP
,
mDTP
)(
Session
);
\ No newline at end of file
ecom-web/src/components/session/session.jsx
View file @
e7f38f23
import
React
,
{
Component
}
from
'react'
import
{
GoogleLogin
,
GoogleLogout
}
from
'react-google-login'
;
const
clientId
=
`
${
process
.
env
.
REACT_APP_GOOGLE_CLIENT_ID
}
.apps.googleusercontent.com`
;
export
default
class
Session
extends
Component
{
constructor
(
props
)
{
super
(
props
)
this
.
state
=
{}
this
.
loginSuccess
=
this
.
loginSuccess
.
bind
(
this
)
this
.
loginFailed
=
this
.
loginFailed
.
bind
(
this
)
this
.
logOutSuccess
=
this
.
logOutSuccess
.
bind
(
this
)
}
loginSuccess
=
(
response
)
=>
{
console
.
log
(
'Login Success: currentUser:'
,
response
);
this
.
props
.
login
()
}
loginFailed
=
(
response
)
=>
{
console
.
log
(
'Login failed: res:'
,
response
);
}
logOutSuccess
=
(
response
)
=>
{
console
.
log
(
'Logout made successfully'
);
this
.
props
.
logOut
()
}
render
()
{
return
(
<
div
>
This is the Session component
{
this
.
props
.
currentUser
===
null
?
<
GoogleLogin
clientId=
{
clientId
}
buttonText=
"Login"
onSuccess=
{
this
.
loginSuccess
}
onFailure=
{
this
.
loginFailed
}
cookiePolicy=
{
'single_host_origin'
}
/>
:
<
GoogleLogout
clientId=
{
clientId
}
buttonText=
"Logout"
onLogoutSuccess=
{
this
.
logOutSuccess
}
></
GoogleLogout
>
}
</
div
>
)
}
...
...
ecom-web/src/index.js
View file @
e7f38f23
...
...
@@ -2,6 +2,7 @@ import React from 'react';
import
ReactDOM
from
'react-dom'
;
import
configureStore
from
'./store/store'
import
Root
from
'./components/root'
import
'bootstrap/dist/css/bootstrap.css'
document
.
addEventListener
(
"DOMContentLoaded"
,
()
=>
{
let
store
=
configureStore
();
...
...
ecom-web/src/reducers/root_reducer.js
View file @
e7f38f23
import
{
combineReducers
}
from
'redux'
;
import
productsReducer
from
'./products_reducer'
;
import
userReducer
from
'./user_reducer'
const
rootReducer
=
combineReducers
({
market
:
productsReducer
market
:
productsReducer
,
user
:
userReducer
,
});
export
default
rootReducer
;
\ No newline at end of file
ecom-web/src/reducers/user_reducer.js
0 → 100644
View file @
e7f38f23
import
{
SET_CURRENT_USER
,
LOGOUT_USER
}
from
'../actions/session_actions'
const
initialState
=
{
currentUser
:
null
}
const
userReducer
=
(
state
=
initialState
,
action
)
=>
{
Object
.
freeze
(
state
);
let
newState
=
Object
.
assign
({},
state
);
switch
(
action
.
type
)
{
case
SET_CURRENT_USER
:
return
newState
.
currentUser
=
{
emailAddress
:
'fakeEmail@123'
};
case
LOGOUT_USER
:
return
newState
.
currentUser
=
null
;
default
:
return
state
;
}
}
export
default
userReducer
;
ecom-web/src/util/session-api-util.js
0 → 100644
View file @
e7f38f23
import
axios
from
'axios'
;
// export const postUser = (user) => {
// return currentUser
// }
// export const postLogOutUser = (user) => {
// return axios.post("/api/user", user)
// }
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