Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
W
warehouse-management
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
1
Merge Requests
1
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
warehouse-management
Commits
90701776
Commit
90701776
authored
May 06, 2021
by
Alex Pinto
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into backend2
parents
b909eba1
feb78f4d
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
251 additions
and
54 deletions
+251
-54
order_actions.js
frontend/src/actions/order_actions.js
+5
-4
OrderButtons.jsx
frontend/src/components/order/OrderButtons.jsx
+37
-0
OrderIndex.jsx
frontend/src/components/order/OrderIndex.jsx
+7
-8
OrderIndexItem.jsx
frontend/src/components/order/OrderIndexItem.jsx
+18
-1
orders_reducer.js
frontend/src/reducers/entities/orders_reducer.js
+11
-3
orders_api_util.jsx
frontend/src/util/orders_api_util.jsx
+73
-37
pom.xml
pom.xml
+4
-0
Consumer.java
src/main/java/com/ascendfinalproject/warehouse/Consumer.java
+21
-0
Producer.java
src/main/java/com/ascendfinalproject/warehouse/Producer.java
+31
-0
WarehouseApplication.java
...om/ascendfinalproject/warehouse/WarehouseApplication.java
+1
-0
KafkaController.java
...ndfinalproject/warehouse/controllers/KafkaController.java
+27
-0
application.properties
src/main/resources/application.properties
+16
-1
No files found.
frontend/src/actions/order_actions.js
View file @
90701776
...
@@ -4,9 +4,9 @@ export const RECEIVE_ORDERS = 'RECEIVE_ORDERS';
...
@@ -4,9 +4,9 @@ export const RECEIVE_ORDERS = 'RECEIVE_ORDERS';
export
const
RECEIVE_ORDER
=
'RECEIVE_ORDER'
;
export
const
RECEIVE_ORDER
=
'RECEIVE_ORDER'
;
export
const
UPDATE_ORDER
=
'UPDATE_ORDER'
;
export
const
UPDATE_ORDER
=
'UPDATE_ORDER'
;
const
receiveOrders
=
(
payload
)
=>
({
const
receiveOrders
=
(
orders
)
=>
({
type
:
RECEIVE_ORDERS
,
type
:
RECEIVE_ORDERS
,
payload
,
orders
,
})
})
const
receiveOrder
=
(
order
)
=>
({
const
receiveOrder
=
(
order
)
=>
({
...
@@ -32,8 +32,9 @@ export const createOrder = (order) => (dispatch) =>
...
@@ -32,8 +32,9 @@ export const createOrder = (order) => (dispatch) =>
dispatch
(
receiveOrder
(
res
))
dispatch
(
receiveOrder
(
res
))
});
});
export
const
editOrder
=
(
order
)
=>
(
dispatch
)
=>
export
const
editOrder
=
(
order
)
=>
(
dispatch
)
=>
{
OrderAPIUtil
.
editOrder
(
order
)
OrderAPIUtil
.
editOrder
(
order
)
.
then
(
res
=>
{
.
then
(
res
=>
{
dispatch
(
updateOrder
(
res
))
dispatch
(
updateOrder
(
res
))
});
});
}
\ No newline at end of file
frontend/src/components/order/OrderButtons.jsx
0 → 100644
View file @
90701776
import
React
from
"react"
;
import
{
connect
}
from
"react-redux"
;
import
{
editOrder
}
from
"../../actions/order_actions"
;
const
OrderButtons
=
({
order
,
editOrder
})
=>
{
// const { id, orderId, status, orderItems, createdAt, modifiedAt } = order;
const
handleUpdate
=
(
action
)
=>
{
console
.
log
(
action
);
if
(
action
===
"FULFILL"
)
{
editOrder
({
...
order
,
status
:
"FULFILLED"
})
}
else
if
(
action
===
"CANCEL"
)
{
editOrder
({
...
order
,
status
:
"CANCELLED"
});
}
}
const
fulfill
=
(
<
button
onClick=
{
()
=>
handleUpdate
(
"FULFILL"
)
}
>
Fulfill
</
button
>
)
const
cancel
=
(
<
button
onClick=
{
()
=>
handleUpdate
(
"CANCEL"
)
}
>
Cancel
</
button
>
)
return
(
<
div
>
{
fulfill
}
{
cancel
}
</
div
>
);
};
const
mapStateToProps
=
(
state
)
=>
({});
const
mapDispatchToProps
=
(
dispatch
)
=>
({
editOrder
:
(
order
)
=>
dispatch
(
editOrder
(
order
)),
});
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
OrderButtons
);
frontend/src/components/order/OrderIndex.jsx
View file @
90701776
...
@@ -23,17 +23,16 @@ const OrderIndex = ({
...
@@ -23,17 +23,16 @@ const OrderIndex = ({
<
h1
>
Order Index
</
h1
>
<
h1
>
Order Index
</
h1
>
<
button
onClick=
{
createOrder
}
>
Create New Order
</
button
>
<
button
onClick=
{
createOrder
}
>
Create New Order
</
button
>
<
button
onClick=
{
editOrder
}
>
Update Order
</
button
>
<
button
onClick=
{
editOrder
}
>
Update Order
</
button
>
{
orders
.
allIds
.
map
(
orderId
=>
{
<
br
/>
<
br
/>
{
orders
.
allIds
.
map
((
orderId
)
=>
{
const
order
=
orders
.
byId
[
orderId
];
const
order
=
orders
.
byId
[
orderId
];
return
(
return
<
OrderIndexItem
key=
{
order
.
id
}
order=
{
order
}
/>;
<
OrderIndexItem
key=
{
order
.
id
}
order=
{
order
}
/>
)
})
}
})
}
</
div
>
</
div
>
)
)
;
}
}
...
...
frontend/src/components/order/OrderIndexItem.jsx
View file @
90701776
import
React
from
'react'
;
import
React
from
'react'
;
import
OrderButtons
from
'./OrderButtons'
;
const
OrderIndexItem
=
({
order
})
=>
{
const
OrderIndexItem
=
({
order
})
=>
{
const
{
id
,
orderId
,
status
,
orderItems
,
createdAt
,
modifiedAt
}
=
order
;
const
actions
=
(
status
===
"RECEIVED"
?
<
OrderButtons
order=
{
order
}
/>
:
<
div
>
{
status
}
</
div
>)
return
(
return
(
<
div
>
<
div
>
{
order
.
orderId
}
{
order
.
status
}
<
div
>
{
`Order #: ${orderId}`
}
</
div
>
{
actions
}
</
div
>
</
div
>
)
)
};
};
...
...
frontend/src/reducers/entities/orders_reducer.js
View file @
90701776
...
@@ -16,10 +16,18 @@ const OrdersReducer = (oldState = initialState, action) => {
...
@@ -16,10 +16,18 @@ const OrdersReducer = (oldState = initialState, action) => {
switch
(
action
.
type
)
{
switch
(
action
.
type
)
{
case
RECEIVE_ORDERS
:
case
RECEIVE_ORDERS
:
return
action
.
payload
;
const
orderState
=
{
byId
:
{},
allIds
:
[],
};
Object
.
keys
(
action
.
orders
).
forEach
(
wareId
=>
{
orderState
.
allIds
.
push
(
wareId
);
orderState
.
byId
[
wareId
]
=
action
.
orders
[
wareId
];
})
return
orderState
;
case
RECEIVE_ORDER
:
case
RECEIVE_ORDER
:
newState
.
byId
[
order
.
id
]
=
order
;
newState
.
byId
[
order
.
id
]
=
order
;
newState
.
allIds
.
unshift
(
order
.
id
);
newState
.
allIds
.
push
(
order
.
id
);
return
newState
;
return
newState
;
case
UPDATE_ORDER
:
case
UPDATE_ORDER
:
newState
.
byId
[
order
.
id
]
=
order
;
newState
.
byId
[
order
.
id
]
=
order
;
...
...
frontend/src/util/orders_api_util.jsx
View file @
90701776
// import axios from 'axios';
// import axios from 'axios';
const
RECEIVED
=
"RECEIVED"
;
// const FULFILLED = "FULFILLED";
// const CANCELLED = "CANCELLED";
const
sampleGetAll
=
{
const
sampleGetAll
=
{
allIds
:
[
"1"
,
"2"
,
"3"
],
//
allIds: ["1", "2", "3"],
byId
:
{
//
byId: {
"1"
:
{
1
:
{
id
:
"1"
,
id
:
"1"
,
orderId
:
"o1"
,
orderId
:
"o1"
,
status
:
"unfulfilled"
,
status
:
RECEIVED
,
orderItems
:
[
{
itemId
:
"17"
,
itemName
:
"Item 1"
,
itemQuantity
:
4
,
itemPrice
:
17.99
,
itemSku
:
8765309
,
},
{
itemId
:
"18"
,
itemName
:
"Item 2"
,
itemQuantity
:
42
,
itemPrice
:
17.99
,
itemSku
:
8715309
,
},
},
"2"
:
{
],
},
2
:
{
id
:
"2"
,
id
:
"2"
,
orderId
:
"o2"
,
orderId
:
"o2"
,
status
:
"unfulfilled"
,
status
:
RECEIVED
,
orderItems
:
[
{
itemId
:
"17"
,
itemName
:
"Item 1"
,
itemQuantity
:
3
,
itemPrice
:
17.99
,
itemSku
:
8765309
,
},
{
itemId
:
"18"
,
itemName
:
"Item 2"
,
itemQuantity
:
41
,
itemPrice
:
17.99
,
itemSku
:
8715309
,
},
},
"3"
:
{
],
},
3
:
{
id
:
"3"
,
id
:
"3"
,
orderId
:
"o3"
,
orderId
:
"o3"
,
status
:
"unfulfilled"
,
status
:
RECEIVED
,
orderItems
:
[
{
itemId
:
"17"
,
itemName
:
"Item 1"
,
itemQuantity
:
2
,
itemPrice
:
17.99
,
itemSku
:
8765309
,
},
{
itemId
:
"18"
,
itemName
:
"Item 2"
,
itemQuantity
:
40
,
itemPrice
:
17.99
,
itemSku
:
8715309
,
},
},
],
},
},
// },
};
};
const
sampleNew
=
{
const
sampleNew
=
{
id
:
"4"
,
id
:
"4"
,
orderId
:
"o4"
,
orderId
:
"o4"
,
status
:
"unfulfilled"
,
status
:
RECEIVED
,
};
const
sampleUpdateFul
=
{
id
:
"3"
,
orderId
:
"o3"
,
status
:
"fulfilled"
,
};
const
sampleUpdateCan
=
{
id
:
"2"
,
orderId
:
"o2"
,
status
:
"cancelled"
,
};
};
const
getAllPromise
=
new
Promise
(
(
resolve
,
reject
)
=>
{
const
getAllPromise
=
new
Promise
(
(
resolve
,
reject
)
=>
{
...
@@ -45,12 +85,6 @@ const getAllPromise = new Promise( (resolve, reject) => {
...
@@ -45,12 +85,6 @@ const getAllPromise = new Promise( (resolve, reject) => {
const
createNewPromise
=
new
Promise
(
(
resolve
,
reject
)
=>
{
const
createNewPromise
=
new
Promise
(
(
resolve
,
reject
)
=>
{
resolve
(
sampleNew
)
resolve
(
sampleNew
)
})
})
const
updateFulfillPromise
=
new
Promise
(
(
resolve
,
reject
)
=>
{
resolve
(
sampleUpdateFul
)
})
const
updateCancelPromise
=
new
Promise
(
(
resolve
,
reject
)
=>
{
resolve
(
sampleUpdateCan
)
})
export
const
getOrders
=
()
=>
{
export
const
getOrders
=
()
=>
{
return
getAllPromise
;
return
getAllPromise
;
...
@@ -61,7 +95,9 @@ export const createOrder = (order) => {
...
@@ -61,7 +95,9 @@ export const createOrder = (order) => {
}
}
export
const
editOrder
=
(
order
)
=>
{
export
const
editOrder
=
(
order
)
=>
{
return
updateFulfillPromise
;
return
new
Promise
(
(
resolve
,
reject
)
=>
{
resolve
(
order
);
})
}
}
// export const getOrders =() => {
// export const getOrders =() => {
...
...
pom.xml
View file @
90701776
...
@@ -29,6 +29,10 @@
...
@@ -29,6 +29,10 @@
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-webflux
</artifactId>
<artifactId>
spring-boot-starter-webflux
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>
org.apache.kafka
</groupId>
<groupId>
org.apache.kafka
</groupId>
<artifactId>
kafka-streams
</artifactId>
<artifactId>
kafka-streams
</artifactId>
...
...
src/main/java/com/ascendfinalproject/warehouse/Consumer.java
0 → 100644
View file @
90701776
package
com
.
ascendfinalproject
.
warehouse
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.kafka.annotation.KafkaListener
;
import
org.springframework.stereotype.Service
;
import
java.io.IOException
;
@Service
public
class
Consumer
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
Consumer
.
class
);
// this is placeholder
@KafkaListener
(
topics
=
"fulfilled"
,
groupId
=
"WAREHOUSE_MANAGEMENT"
)
public
void
consume
(
String
message
)
throws
IOException
{
logger
.
info
(
String
.
format
(
"#### -> Consumed message -> %s"
,
message
));
}
}
src/main/java/com/ascendfinalproject/warehouse/Producer.java
0 → 100644
View file @
90701776
package
com
.
ascendfinalproject
.
warehouse
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.kafka.core.KafkaTemplate
;
import
org.springframework.stereotype.Service
;
@Service
public
class
Producer
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
Producer
.
class
);
private
static
final
String
FULFILLED
=
"fulfilled"
;
private
static
final
String
CANCELLED
=
"cancelled"
;
@Autowired
// publish messages to the topic
private
KafkaTemplate
<
String
,
String
>
kafkaTemplate
;
public
void
orderFulfilled
(
String
message
)
{
logger
.
info
(
String
.
format
(
"#### -> this order is fulfilled -> %s"
,
message
));
this
.
kafkaTemplate
.
send
(
FULFILLED
,
message
);
}
public
void
orderCancelled
(
String
message
)
{
logger
.
info
(
String
.
format
(
"#### -> this order is cancelled -> %s"
,
message
));
this
.
kafkaTemplate
.
send
(
CANCELLED
,
message
);
}
}
src/main/java/com/ascendfinalproject/warehouse/WarehouseApplication.java
View file @
90701776
...
@@ -11,3 +11,4 @@ public class WarehouseApplication {
...
@@ -11,3 +11,4 @@ public class WarehouseApplication {
}
}
}
}
src/main/java/com/ascendfinalproject/warehouse/controllers/KafkaController.java
0 → 100644
View file @
90701776
package
com
.
ascendfinalproject
.
warehouse
.
controllers
;
import
com.ascendfinalproject.warehouse.Producer
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
@RestController
@RequestMapping
(
value
=
"/kafka"
)
public
class
KafkaController
{
private
final
Producer
producer
;
@Autowired
KafkaController
(
Producer
producer
)
{
this
.
producer
=
producer
;
}
@PostMapping
(
value
=
"/fulfilled"
)
public
void
sendMessageToKafkaTopic
(
@RequestParam
(
"message"
)
String
message
)
{
this
.
producer
.
orderFulfilled
(
message
);
}
}
src/main/resources/application.properties
View file @
90701776
spring.data.mongodb.uri
=
mongodb+srv://warehouse1:ascendWarehouseProject@warehouse-cluster.xopll.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
spring.data.mongodb.uri
=
mongodb+srv://warehouse1:ascendWarehouseProject@warehouse-cluster.xopll.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
spring.data.mongodb.database
=
test
spring.data.mongodb.database
=
test
server
:
port
:
9000
spring
:
kafka
:
consumer
:
bootstrap-servers
:
localhost:9092
group-id
:
WAREHOUSE_MANAGEMENT
auto-offset-reset
:
earliest
key-deserializer
:
org.apache.kafka.common.serialization.StringDeserializer
value-deserializer
:
org.apache.kafka.common.serialization.StringDeserializer
producer
:
bootstrap-servers
:
localhost:9092
key-serializer
:
org.apache.kafka.common.serialization.StringSerializer
value-serializer
:
org.apache.kafka.common.serialization.StringSerializer
\ No newline at end of file
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