Skip to content

Commit 569a68c

Browse files
author
gustavnavar
committed
0.0.6
1 parent 8a04f2e commit 569a68c

30 files changed

Lines changed: 544 additions & 150 deletions

.gitignore

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,19 @@ build/
3535
.vscode/
3636

3737
### Mac OS ###
38-
.DS_Store
38+
.DS_Store
39+
/.idea/dataSources/0c65a8f5-b3f4-462e-a382-2b383a0b633e.xml
40+
/.idea/dataSources.local.xml
41+
/.idea/dataSources/0c65a8f5-b3f4-462e-a382-2b383a0b633e/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/dbo.sYMBAA.meta
42+
/.idea/dataSources/ede369a1-6fac-4381-baa8-49852c4d584d/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/dbo.sYMBAA.meta
43+
/.idea/dataSources/0c65a8f5-b3f4-462e-a382-2b383a0b633e/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/dbo.sYMBAA.zip
44+
/.idea/dataSources/ede369a1-6fac-4381-baa8-49852c4d584d/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/dbo.sYMBAA.zip
45+
/.idea/dataSources/ede369a1-6fac-4381-baa8-49852c4d584d.xml
46+
/out/artifacts/gridcore_jar/gridcore.jar
47+
/.idea/dataSources/0c65a8f5-b3f4-462e-a382-2b383a0b633e/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/INFORMATION_SCHEMA.NBgcMw.meta
48+
/.idea/dataSources/ede369a1-6fac-4381-baa8-49852c4d584d/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/INFORMATION_SCHEMA.NBgcMw.meta
49+
/.idea/dataSources/0c65a8f5-b3f4-462e-a382-2b383a0b633e/storage_v2/_src_/database/NORTHWIND.bf6LwA.meta
50+
/.idea/dataSources/ede369a1-6fac-4381-baa8-49852c4d584d/storage_v2/_src_/database/NORTHWIND.bf6LwA.meta
51+
/.idea/dataSources/0c65a8f5-b3f4-462e-a382-2b383a0b633e/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/sys.zb4BAA.meta
52+
/.idea/dataSources/ede369a1-6fac-4381-baa8-49852c4d584d/storage_v2/_src_/database/NORTHWIND.bf6LwA/schema/sys.zb4BAA.meta
53+
/.idea/workspace.xml

demo/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111
<groupId>me.agno</groupId>
1212
<artifactId>demo</artifactId>
13-
<version>0.0.5</version>
13+
<version>0.0.6</version>
1414
<name>demo</name>
1515
<description>demo</description>
1616
<properties>
Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,46 @@
11
package me.agno.demo.controllers;
22

33
import java.math.BigDecimal;
4+
import java.math.MathContext;
45
import java.time.Instant;
56
import java.util.function.Consumer;
67

7-
import com.fasterxml.jackson.core.JsonProcessingException;
88
import jakarta.persistence.EntityManager;
99
import jakarta.persistence.EntityManagerFactory;
1010
import jakarta.servlet.http.HttpServletRequest;
11-
import jakarta.servlet.http.HttpServletResponse;
12-
import me.agno.demo.DemoApplication;
1311
import me.agno.demo.model.Order;
1412
import me.agno.gridcore.IGridColumnCollection;
1513
import me.agno.gridcore.server.GridServer;
1614
import me.agno.gridcore.server.IGridServer;
1715
import me.agno.gridcore.utils.ItemsDTO;
1816
import org.springframework.beans.factory.annotation.Autowired;
19-
import org.springframework.http.HttpStatus;
2017
import org.springframework.http.MediaType;
2118
import org.springframework.http.ResponseEntity;
2219
import org.springframework.web.bind.annotation.GetMapping;
2320
import org.springframework.web.bind.annotation.RequestMapping;
2421
import org.springframework.web.bind.annotation.RestController;
2522

2623
@RestController
27-
@RequestMapping(value = "/api/sampledata")
24+
@RequestMapping(value = {"/api/sampledata", "/api/SampleData"})
2825
public class SampleDataController {
2926

3027
@Autowired
3128
EntityManagerFactory entityManagerFactory;
3229

33-
@GetMapping(value = "getordersgrid", produces = MediaType.APPLICATION_JSON_VALUE)
34-
public ResponseEntity<ItemsDTO<Order>> getUser(HttpServletRequest request) throws JsonProcessingException {
30+
@GetMapping(value = {"getordersgrid", "GetOrdersGrid"}, produces = MediaType.APPLICATION_JSON_VALUE)
31+
public ResponseEntity<ItemsDTO<Order>> getOrdersGrid(HttpServletRequest request) {
3532

3633
EntityManager em = entityManagerFactory.createEntityManager();
3734

3835
Consumer<IGridColumnCollection<Order>> columns = c ->
3936
{
4037
c.add("orderID",Integer.class);
4138
c.add("orderDate", Instant.class);
42-
//c.add("customer.companyName", String.class);
43-
//c.add("customer.contactName", String.class);
44-
//c.add("customer.country", String.class, true);
39+
c.add("customer.companyName", String.class);
40+
c.add("customer.contactName", String.class);
41+
c.add("customer.country", String.class, true);
4542
c.add("freight", BigDecimal.class);
46-
//c.add("customer.isVip",Boolean.class);
43+
c.add("customer.isVip",Boolean.class);
4744
};
4845

4946
IGridServer<Order> server = new GridServer<Order>(em, Order.class, null, null,
@@ -54,7 +51,41 @@ public ResponseEntity<ItemsDTO<Order>> getUser(HttpServletRequest request) throw
5451

5552
var items = server.getItemsToDisplay();
5653
return ResponseEntity.ok(items);
57-
//var result = DemoApplication.mapper.writeValueAsString(items);
58-
//return items;
5954
}
60-
}
55+
56+
@GetMapping(value = {"getordersgridwithtotals", "GetOrdersGridWithTotals"}, produces = MediaType.APPLICATION_JSON_VALUE)
57+
public ResponseEntity<ItemsDTO<Order>> getOrdersGridWithTotals(HttpServletRequest request) {
58+
59+
EntityManager em = entityManagerFactory.createEntityManager();
60+
61+
Consumer<IGridColumnCollection<Order>> columns = c ->
62+
{
63+
c.add("orderID",Integer.class);
64+
c.add("orderDate", Instant.class).max(true).min(true);
65+
c.add("customer.companyName", String.class).max(true).min(true);
66+
c.add("customer.contactName", String.class).max(true).min(true);
67+
c.add("freight", BigDecimal.class).sum(true).average(true).max(true).min(true)
68+
.calculate("Average 2", x -> x.getGrid().getItemsCount() == 0
69+
|| x.get("freight") == null || x.get("freight").getSumValue().getNumber().isEmpty()
70+
? "" : x.get("freight").getSumValue().getNumber().get()
71+
.divide(BigDecimal.valueOf(x.getGrid().getItemsCount()), MathContext.DECIMAL32))
72+
.calculate("Average 3", x -> x.get("orderID") == null || x.get("orderID").getSumValue() == null
73+
|| x.get("orderID").getSumValue().getNumber().isEmpty()
74+
|| x.get("orderID").getSumValue().getNumber().get() == BigDecimal.ZERO
75+
|| x.get("freight") == null || x.get("freight").getSumValue() == null
76+
|| x.get("freight").getSumValue().getNumber().isEmpty()
77+
? "" : x.get("freight").getSumValue().getNumber().get()
78+
.divide(x.get("orderID").getSumValue().getNumber().get(),MathContext.DECIMAL32));
79+
c.add("customer.isVip",Boolean.class);
80+
};
81+
82+
IGridServer<Order> server = new GridServer<Order>(em, Order.class, null, null,
83+
request.getParameterMap(), columns)
84+
.withPaging(10)
85+
.sortable()
86+
.filterable();
87+
88+
var items = server.getItemsToDisplay();
89+
return ResponseEntity.ok(items);
90+
}
91+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package me.agno.demo.filters;
2+
3+
import jakarta.servlet.FilterChain;
4+
import jakarta.servlet.http.HttpServletRequest;
5+
import jakarta.servlet.http.HttpServletResponse;
6+
7+
import java.util.stream.Collectors;
8+
9+
import me.agno.demo.filters.utils.RequestWrapper;
10+
import org.slf4j.LoggerFactory;
11+
import org.springframework.beans.factory.annotation.Value;
12+
import org.springframework.core.Ordered;
13+
import org.springframework.core.annotation.Order;
14+
import org.springframework.util.StreamUtils;
15+
import org.springframework.stereotype.Component;
16+
import org.springframework.web.filter.OncePerRequestFilter;
17+
18+
@Component
19+
@Order(Ordered.HIGHEST_PRECEDENCE)
20+
public class CorsFilter extends OncePerRequestFilter {
21+
22+
@Value("${application.origin}")
23+
private String origin;
24+
25+
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) {
26+
27+
try {
28+
LoggerFactory.getLogger(CorsFilter.class).debug(String.format("CORS Filtering PATH: %s, METHOD: %s", req.getRequestURI(), req.getMethod()));
29+
30+
try {
31+
var parameters =req.getParameterMap();
32+
if(parameters != null && ! parameters.isEmpty()) {
33+
String params = parameters.keySet().stream()
34+
.map(key -> key + "=" + String.join(", ", parameters.get(key)))
35+
.collect(Collectors.joining("; ", "{", "}"));
36+
LoggerFactory.getLogger(CorsFilter.class).debug("\tParameters: " + params);
37+
}
38+
39+
//Wrap the request
40+
RequestWrapper wrapper = new RequestWrapper((HttpServletRequest) req);
41+
42+
//Get the input stream from the wrapper and convert it into byte array
43+
byte[] body = StreamUtils.copyToByteArray(wrapper.getInputStream());
44+
45+
if(body.length > 0) {
46+
LoggerFactory.getLogger(CorsFilter.class).debug("\tBody: " + new String(body));
47+
}
48+
else {
49+
LoggerFactory.getLogger(CorsFilter.class).debug("\tBody: null");
50+
}
51+
52+
// use wrapper as request
53+
req = wrapper;
54+
} catch (Exception e) {
55+
// TODO Auto-generated catch block
56+
e.printStackTrace();
57+
}
58+
59+
res.setHeader("Access-Control-Allow-Origin", origin);
60+
res.setHeader("Access-Control-Allow-Credentials", "true");
61+
res.setHeader("Access-Control-Allow-Methods",
62+
"ACL, CANCELUPLOAD, CHECKIN, CHECKOUT, COPY, DELETE, GET, HEAD, LOCK, MKCALENDAR, MKCOL, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, SEARCH, UNCHECKOUT, UNLOCK, UPDATE, VERSION-CONTROL");
63+
res.setHeader("Access-Control-Max-Age", "3600");
64+
res.setHeader("Access-Control-Allow-Headers",
65+
"Access-Control-Allow-Headers, Origin, X-Requested-With, content-type, Content-Type, Accept, Key, Authorization, x-requested-with, Content-Range, Content-Disposition, Content-Description");
66+
67+
if ("OPTIONS".equals(req.getMethod())) {
68+
res.setStatus(HttpServletResponse.SC_OK);
69+
} else {
70+
chain.doFilter(req, res);
71+
}
72+
73+
} catch (Exception e) {
74+
// TODO Auto-generated catch block
75+
e.printStackTrace();
76+
}
77+
}
78+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package me.agno.demo.filters.utils;
2+
3+
import java.io.IOException;
4+
5+
import jakarta.servlet.ServletInputStream;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletRequestWrapper;
8+
9+
import org.springframework.util.StreamUtils;
10+
11+
public class RequestWrapper extends HttpServletRequestWrapper {
12+
13+
private byte[] body;
14+
15+
public RequestWrapper(HttpServletRequest request) throws IOException {
16+
super(request);
17+
18+
this.body = StreamUtils.copyToByteArray(request.getInputStream());
19+
}
20+
21+
@Override
22+
public ServletInputStream getInputStream() throws IOException {
23+
return new ServletInputStreamWrapper(this.body);
24+
25+
}
26+
27+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package me.agno.demo.filters.utils;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
7+
import jakarta.servlet.ReadListener;
8+
import jakarta.servlet.ServletInputStream;
9+
10+
public class ServletInputStreamWrapper extends ServletInputStream {
11+
12+
private InputStream inputStream;
13+
14+
public ServletInputStreamWrapper(byte[] body) {
15+
16+
this.inputStream = new ByteArrayInputStream(body);
17+
}
18+
19+
@Override
20+
public boolean isFinished() {
21+
22+
try {
23+
24+
return inputStream.available() == 0;
25+
26+
}catch(Exception e) {
27+
28+
return false;
29+
}
30+
}
31+
32+
@Override
33+
public boolean isReady() {
34+
return true;
35+
}
36+
37+
@Override
38+
public void setReadListener(ReadListener listener) {
39+
40+
}
41+
42+
@Override
43+
public int read() throws IOException {
44+
return this.inputStream.read();
45+
}
46+
47+
}

demo/src/main/java/me/agno/demo/model/Category.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.agno.demo.model;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import jakarta.persistence.*;
45
import lombok.Getter;
56
import lombok.Setter;
@@ -30,6 +31,7 @@ public class Category {
3031
@Column(name = "picture")
3132
private byte[] picture;
3233

34+
@JsonIgnore
3335
@OneToMany(mappedBy = "categoryID")
3436
private Set<Product> products = new LinkedHashSet<>();
3537

demo/src/main/java/me/agno/demo/model/Employee.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class Employee {
1818
@Id
1919
@GeneratedValue(strategy = GenerationType.IDENTITY)
2020
@Column(name = "employeeid", nullable = false)
21-
private Integer id;
21+
private Integer employeeID;
2222

2323
@Nationalized
2424
@Column(name = "lastname", nullable = false, length = 20)

demo/src/main/java/me/agno/demo/model/Order.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import lombok.Getter;
66
import lombok.Setter;
77
import org.hibernate.annotations.Nationalized;
8+
import org.hibernate.annotations.OnDelete;
9+
import org.hibernate.annotations.OnDeleteAction;
810

911
import java.math.BigDecimal;
1012
import java.time.Instant;
@@ -21,13 +23,19 @@ public class Order {
2123
@Column(name = "orderid", nullable = false)
2224
private Integer orderID;
2325

24-
@ManyToOne(fetch = FetchType.LAZY)
26+
@Column(name = "customerid", insertable = false, updatable = false, nullable = false)
27+
private String customerID;
28+
29+
@ManyToOne(fetch = FetchType.EAGER)
2530
@JoinColumn(name = "customerid")
26-
private Customer customerID;
31+
private Customer customer;
32+
33+
@Column(name = "employeeid", columnDefinition = "int", insertable = false, updatable = false, nullable = false)
34+
private String employeeID;
2735

28-
@ManyToOne(fetch = FetchType.LAZY)
36+
@ManyToOne(fetch = FetchType.EAGER)
2937
@JoinColumn(name = "employeeid")
30-
private Employee employeeID;
38+
private Employee employee;
3139

3240
@Column(name = "orderdate")
3341
private Instant orderDate;
@@ -38,9 +46,12 @@ public class Order {
3846
@Column(name = "shippeddate")
3947
private Instant shippedDate;
4048

41-
@ManyToOne(fetch = FetchType.LAZY)
42-
@JoinColumn(name = "shipvia")
43-
private Shipper shipVia;
49+
@Column(name = "shipVia", columnDefinition = "int", insertable = false, updatable = false, nullable = false)
50+
private String shipVia;
51+
52+
@ManyToOne(fetch = FetchType.EAGER)
53+
@JoinColumn(name = "shipVia")
54+
private Shipper shipper;
4455

4556
@Column(name = "freight")
4657
private BigDecimal freight;

demo/src/main/java/me/agno/demo/model/OrderDetail.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.agno.demo.model;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import jakarta.persistence.*;
45
import lombok.Getter;
56
import lombok.Setter;
@@ -14,11 +15,13 @@ public class OrderDetail {
1415
@EmbeddedId
1516
private OrderDetailId id;
1617

18+
@JsonIgnore
1719
@MapsId("orderID")
1820
@ManyToOne(fetch = FetchType.LAZY, optional = false)
1921
@JoinColumn(name = "orderid", nullable = false)
2022
private Order orderID;
2123

24+
@JsonIgnore
2225
@MapsId("productID")
2326
@ManyToOne(fetch = FetchType.LAZY, optional = false)
2427
@JoinColumn(name = "productid", nullable = false)

0 commit comments

Comments
 (0)