From e7c19de0e036a21f659ca92e87aa8fe6004e0b75 Mon Sep 17 00:00:00 2001 From: Chase Lennartson Date: Fri, 29 Apr 2022 09:53:34 -0500 Subject: [PATCH 1/2] updated --- .DS_Store | Bin 0 -> 6148 bytes src/.DS_Store | Bin 0 -> 6148 bytes src/main/.DS_Store | Bin 0 -> 6148 bytes src/main/java/.DS_Store | Bin 0 -> 6148 bytes src/main/java/edu/.DS_Store | Bin 0 -> 6148 bytes src/main/java/edu/tcu/.DS_Store | Bin 0 -> 6148 bytes src/main/java/edu/tcu/cs/.DS_Store | Bin 0 -> 6148 bytes .../java/edu/tcu/cs/expensetracker/.DS_Store | Bin 0 -> 6148 bytes .../ExpensetrackerApplication.java | 8 +- .../controller/ExpenseController.java | 48 ++++++ .../tcu/cs/expensetracker/dao/ExpenseDao.java | 7 + .../ExpenseDataInitializer.java | 147 ++++++++++++++++++ .../tcu/cs/expensetracker/domain/Expense.java | 81 ++++++++++ .../tcu/cs/expensetracker/domain/Result.java | 60 +++++++ .../cs/expensetracker/domain/StatusCode.java | 10 ++ .../service/ExpenseService.java | 37 +++++ .../tcu/cs/expensetracker/utils/IdWorker.java | 104 +++++++++++++ 17 files changed, 498 insertions(+), 4 deletions(-) create mode 100644 .DS_Store create mode 100644 src/.DS_Store create mode 100644 src/main/.DS_Store create mode 100644 src/main/java/.DS_Store create mode 100644 src/main/java/edu/.DS_Store create mode 100644 src/main/java/edu/tcu/.DS_Store create mode 100644 src/main/java/edu/tcu/cs/.DS_Store create mode 100644 src/main/java/edu/tcu/cs/expensetracker/.DS_Store create mode 100644 src/main/java/edu/tcu/cs/expensetracker/controller/ExpenseController.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/dao/ExpenseDao.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/datainitializer/ExpenseDataInitializer.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/domain/Result.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/domain/StatusCode.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java create mode 100644 src/main/java/edu/tcu/cs/expensetracker/utils/IdWorker.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9a874b5768f336915163bb88cd434575b859f936 GIT binary patch literal 6148 zcmeH~Jr2S!425ml0g0s}V-^m;4I%_5-~tF3k&vj^b9A16778<}(6eNJu~Vz<8=6`~ zboab&MFtUB!i}=AFfm2m$tVxGT*u4pe81nUlA49C} z?O@64YO)2RT{MRe%{!}2F))pG(Sih~)xkgosK7*lF7m<7{{#Hn{6A@7N(HFEpDCdI z{V4u3`M`g7D#EfOgRk)$PGpaPQV2S&>%r5BKkQx-ySzvsH0W%E!l7ES!;KH zv9ktX>-*^w7y&HlPOLmk%$N_j;tOYdpMH*)!|itQBJHgMp3+B5_H$d10#ZNMM4T9irw zDe%t}uwk>?toc%Twm!X{*Y{cVb)%DUIm54?049DEf6&9YUwlE)m< zk%er^j=Knh3!DIf); zz>E~gV|@8Jqi52iNC7D@4+Z@DQ0UH@Y@PAxV2BZb99RzHI%Wy7c!8|R*2xOZa(b|A zwHQOZ9_?hw>uR!f_I6kfAC`AEpJHg%+hK(X&1yhF3P^#80*juHe*W+1ujcQ^n8@Auu4PPqH)~DC=`aY|^Zges(XZZ6Iz{HQ@6+Mjm#TR5vwoX=P`Vj~j6r{kv GD)0dNyb`AX literal 0 HcmV?d00001 diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8ee47d97bdd6fdb00cdb10572569902931b99818 GIT binary patch literal 6148 zcmeH~Jr2S!425mVfW*>~F$)La1`&c2Z~+8mL+XIob9A16778<}(6eNJu~Vz<8=6`~ zbpIT7BE5*L;6~Y6n3y8(<_Lbudr?Dlk!?i@dk<{|Ns!|4&+&QUNOPXA0=@ za60VqQhBz1yq?w1S+#Y8gMK-}+fM)zJBl}OH|!T%fHm2IsKEFm;4&~!fuAby0>G&e AYXATM literal 0 HcmV?d00001 diff --git a/src/main/java/edu/.DS_Store b/src/main/java/edu/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8e05cd7498b8a012a4e58c33bedcd38877246b2d GIT binary patch literal 6148 zcmeH~Jr2S!425mlp%P0+#w;9w8$<|Bzy%O6A~67aj?VMXLSaS~dY0@jc51bKLsN^0 zZl9Np$S5KM+$d`c6I0}!Jmf6T%l&*k-ELPaxh;}bfR8fS&uxMVPys4H1*iZOn2`c` zkPpilJrf^=3Q&Q0C}7`*0yoxV3;L%6!AAhFN7)T)pC!Oz1+XSt5EYn4D;TZnV~Ewg z9V~fWO}1dPi{|j5d1tjL2By(2T9ClBIvA(`6__Z{MLyd3zlVRD|0gX>sQ?xDGX=EY z9d=v1RGzILuV?jRR&CwjpkI#g_7i}_j^Y*E4g19wU`@6lDlq;CxC{(b;HL__01i_T Ac>n+a literal 0 HcmV?d00001 diff --git a/src/main/java/edu/tcu/.DS_Store b/src/main/java/edu/tcu/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..64347c27f60f9a460d71ddfdbed0cdf70f3e689d GIT binary patch literal 6148 zcmeH~Jr2S!425mzfW*>~F$)La1`&c2Z~;Uakvbsu9G&MM1`0E((6eNJu^X%H8=6`~ zbpN>SM0ycf!Hu%DFfm2GkU{R(`*6FAs{y-cpZ_K{S83Qz$mKn1A4d=$u| ze6^m>Bk@V702P>t0``39EI3<=Oi2dR9MY)z%FT`gVl3p8zCw6mQ^exL#}l)?^E!0^^T>%fLVdeyYF|;dc-- literal 0 HcmV?d00001 diff --git a/src/main/java/edu/tcu/cs/.DS_Store b/src/main/java/edu/tcu/cs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c8993175f913652c5b0a1925dde802a75d096bc9 GIT binary patch literal 6148 zcmeHKJ5EDE3>-s>NJvpi%Dn4CIzH`6p#W^Knk3#K(*BA&Dl5U0x2K`E=>XdJ~X;xFB}r%)4>oU z0CB=}7}qgN5Su56y>LimhGt16Ce>=hu%t8Js;(CfiAjgm@L~02s|m&8>Ab&1Ijkot zN&zWws=#$_=idMC>3_`srzGv9fE2hW1#Gf>ST6WV)muj|=e@SkAL(9mq`Pq)6ozQW k#AwIdcsst0qO5Da=6Nq15`)fs(24pPa9w0l;J+342K$f~U;qFB literal 0 HcmV?d00001 diff --git a/src/main/java/edu/tcu/cs/expensetracker/.DS_Store b/src/main/java/edu/tcu/cs/expensetracker/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5d62efc9cb53d66a08c48a6d70d20ccf20ff2a72 GIT binary patch literal 6148 zcmeHKyH3ME5S%4Jil87R<^2MGaEihg@B@UH!jgrhJQ^x@{5G?XM2;L3_`sm!!N(1yX^V zQb6YGxAlsT6uouwaN27N{hfX?)>=7(wPK>RVqRz~eje2oU30$%4vt1=-sr^q5Kvvx JQi1 all = expenseService.findAll(); + Result result = new Result(true, StatusCode.SUCCESS, "Find All Success", all); + return result; + } + @GetMapping("/{expenseId}") + public Result findById(@PathVariable String expenseId) { + return new Result(true, StatusCode.SUCCESS, "Find One Success", expenseService.findById(expenseId)); + } + + @PostMapping + public Result save(@RequestBody Expense newExpense){ + expenseService.save(newExpense); + return new Result(true, StatusCode.SUCCESS, "Save Success"); + } + @PutMapping("/{expenseId}") + public Result update(@PathVariable String expenseId, @RequestBody Expense updatedExpense) { + expenseService.update(expenseId, updatedExpense); + return new Result(true, StatusCode.SUCCESS, "Update Success"); + } + @DeleteMapping("/{expenseId}") + public Result delete(@PathVariable String expenseId){ + expenseService.delete(expenseId); + return new Result(true, StatusCode.SUCCESS, "Delete Success"); + + } +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/dao/ExpenseDao.java b/src/main/java/edu/tcu/cs/expensetracker/dao/ExpenseDao.java new file mode 100644 index 0000000..814ec8f --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/dao/ExpenseDao.java @@ -0,0 +1,7 @@ +package edu.tcu.cs.expensetracker.dao; + +import edu.tcu.cs.expensetracker.domain.Expense; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ExpenseDao extends JpaRepository { +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/datainitializer/ExpenseDataInitializer.java b/src/main/java/edu/tcu/cs/expensetracker/datainitializer/ExpenseDataInitializer.java new file mode 100644 index 0000000..66ebd4f --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/datainitializer/ExpenseDataInitializer.java @@ -0,0 +1,147 @@ +package edu.tcu.cs.expensetracker.datainitializer; + +import edu.tcu.cs.expensetracker.dao.ExpenseDao; +import edu.tcu.cs.expensetracker.domain.Expense; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class ExpenseDataInitializer implements CommandLineRunner { + + private ExpenseDao expenseDao; + + public ExpenseDataInitializer(ExpenseDao expenseDao) { + this.expenseDao = expenseDao; + } + + @Override + public void run(String... args) throws Exception { + Expense e1 = new Expense(); + e1.setId("1"); + e1.setName("Dining Spending"); + e1.setMoney("247"); + e1.setAccount("Chase Bank"); + e1.setCreateTime("2016-03-02"); + e1.setDescription("Dutch Burger"); + + Expense e2 = new Expense(); + e2.setId("2"); + e2.setName("Salary Income"); + e2.setMoney("3000"); + e2.setAccount("Cash"); + e2.setCreateTime("2016-03-15"); + e2.setDescription("September Salary"); + + Expense e3 = new Expense(); + e3.setId("3"); + e3.setName("Books Spending"); + e3.setMoney("200"); + e3.setAccount("Cash"); + e3.setCreateTime("2016-04-02"); + e3.setDescription("Calculus Book"); + + Expense e4 = new Expense(); + e4.setId("4"); + e4.setName("Dining Spending"); + e4.setMoney("325"); + e4.setAccount("Cash"); + e4.setCreateTime("2016-06-18"); + e4.setDescription("Eat at TCU Cafe"); + + Expense e5 = new Expense(); + e5.setId("5"); + e5.setName("Stock Income"); + e5.setMoney("8000"); + e5.setAccount("WellsFargo Saving Account"); + e5.setCreateTime("2016-10-28"); + e5.setDescription("Apple Stock is great!"); + + Expense e6 = new Expense(); + e6.setId("6"); + e6.setName("Stock Income"); + e6.setMoney("5000"); + e6.setAccount("WellsFargo Saving Account"); + e6.setCreateTime("2016-10-28"); + e6.setDescription("Oracle Stock is great!"); + + Expense e7 = new Expense(); + e7.setId("7"); + e7.setName("Stock Income"); + e7.setMoney("3000"); + e7.setAccount("ChaseBank Saving Account"); + e7.setCreateTime("2016-10-28"); + e7.setDescription("Oct Salary time!"); + + Expense e8 = new Expense(); + e8.setId("8"); + e8.setName("Clothes Spending"); + e8.setMoney("5000"); + e8.setAccount("Cash"); + e8.setCreateTime("2016-10-28"); + e8.setDescription("JCrew again"); + + Expense e9 = new Expense(); + e9.setId("9"); + e9.setName("Other Spending"); + e9.setMoney("20"); + e9.setAccount("Cash"); + e9.setCreateTime("2016-10-29"); + e9.setDescription("Lost 20 bucks in library. :("); + + Expense e10 = new Expense(); + e10.setId("10"); + e10.setName("Gas Spending"); + e10.setMoney("1200"); + e10.setAccount("ChaseBank Credit Card"); + e10.setCreateTime("2016-10-29"); + e10.setDescription("Gas is so expensive"); + + Expense e11 = new Expense(); + e11.setId("11"); + e11.setName("Dining Spending"); + e11.setMoney("1000"); + e11.setAccount("ChaseBank Debit Card"); + e11.setCreateTime("2016-10-29"); + e11.setDescription("Eat eat eat"); + + Expense e12 = new Expense(); + e12.setId("12"); + e12.setName("Salary Income"); + e12.setMoney("3000"); + e12.setAccount("ChaseBank Saving Account"); + e12.setCreateTime("2016-10-30"); + e12.setDescription("Nov salary"); + + Expense e13 = new Expense(); + e13.setId("13"); + e13.setName("Flight Ticket Spending"); + e13.setMoney("500"); + e13.setAccount("ChaseBank Debit Card"); + e13.setCreateTime("2016-10-30"); + e13.setDescription("Fly to LA"); + + Expense e14 = new Expense(); + e14.setId("14"); + e14.setName("Salary Income"); + e14.setMoney("3000"); + e14.setAccount("ChaseBank Saving Account"); + e14.setCreateTime("2016-10-30"); + e14.setDescription("December Salary"); + + expenseDao.save(e1); + expenseDao.save(e2); + expenseDao.save(e3); + expenseDao.save(e4); + expenseDao.save(e5); + expenseDao.save(e6); + expenseDao.save(e7); + expenseDao.save(e8); + expenseDao.save(e9); + expenseDao.save(e10); + expenseDao.save(e11); + expenseDao.save(e12); + expenseDao.save(e13); + expenseDao.save(e14); + } +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java b/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java new file mode 100644 index 0000000..468bf12 --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java @@ -0,0 +1,81 @@ +package edu.tcu.cs.expensetracker.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import java.io.Serializable; +@Entity +public class Expense implements Serializable { + @Id + private String id; + private String name; + private String description; + private String imageUrl; + private String money; + private String account; + private String createTime; + @ManyToOne + @JsonIgnore + private Expense owner; + + public Expense() { + } + + public Expense getOwner() { + return owner; + } + + public void setOwner(Expense owner) { + this.owner = owner; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/domain/Result.java b/src/main/java/edu/tcu/cs/expensetracker/domain/Result.java new file mode 100644 index 0000000..0fd2992 --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/domain/Result.java @@ -0,0 +1,60 @@ +package edu.tcu.cs.expensetracker.domain; + +/* +used to encapsulate data prepared by server side, this object will be serialized to JSON before +sent back to front end + */ +public class Result { + private boolean flag; //true: success, false: not success + private Integer code; //return status code. e.g. 200 + private String message; // message + private Object data; //return the requested data, in this case, a PageBean object + + public Result() { + } + + public Result(boolean flag, Integer code, String message) { + this.flag = flag; + this.code = code; + this.message = message; + } + + public Result(boolean flag, Integer code, String message, Object data) { + this.flag = flag; + this.code = code; + this.message = message; + this.data = data; + } + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/domain/StatusCode.java b/src/main/java/edu/tcu/cs/expensetracker/domain/StatusCode.java new file mode 100644 index 0000000..f87ca6b --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/domain/StatusCode.java @@ -0,0 +1,10 @@ +package edu.tcu.cs.expensetracker.domain; + +public class StatusCode { + public static final int SUCCESS = 200; //Success + public static final int FAILURE = 400; //Failure + public static final int UNAUTHORIZED = 401; //username or password incorrect + public static final int FORBIDDEN = 403; //insufficent rights + public static final int NOT_FOUND = 404; //API not found + public static final int INTERNAL_SERVER_ERROR = 500;//Repetitive ops +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java b/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java new file mode 100644 index 0000000..0e03ad2 --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java @@ -0,0 +1,37 @@ +package edu.tcu.cs.expensetracker.service; + +import edu.tcu.cs.expensetracker.domain.Expense; +import edu.tcu.cs.expensetracker.dao.ExpenseDao; +import org.springframework.stereotype.Service; +import javax.transaction.Transactional; +import java.util.List; + +@Service +@Transactional +public class ExpenseService { + + private ExpenseDao expenseDao; + + // Spring will automatically inject an instance of ArtifactDao and an instance of IdWorker into this class + + public ExpenseService(ExpenseDao expenseDao) { + this.expenseDao = expenseDao; + } + + public List findAll(){ return expenseDao.findAll(); } + + public Expense findById(String expenseId) { return expenseDao.findById(expenseId).get(); } + + public void save(Expense newExpense) { + expenseDao.save(newExpense); + } + + public void update(String expenseId, Expense updatedExpense) { + updatedExpense.setId(expenseId); + expenseDao.save(updatedExpense); + } + + public void delete(String expenseId) { + expenseDao.deleteById(expenseId); + } +} diff --git a/src/main/java/edu/tcu/cs/expensetracker/utils/IdWorker.java b/src/main/java/edu/tcu/cs/expensetracker/utils/IdWorker.java new file mode 100644 index 0000000..bbca243 --- /dev/null +++ b/src/main/java/edu/tcu/cs/expensetracker/utils/IdWorker.java @@ -0,0 +1,104 @@ +package edu.tcu.cs.expensetracker.utils; + +import java.lang.management.ManagementFactory; +import java.net.InetAddress; +import java.net.NetworkInterface; + +public class IdWorker { + private final static long twepoch = 1288834974657L; + private final static long workerIdBits = 5L; + private final static long datacenterIdBits = 5L; + private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); + private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + private final static long sequenceBits = 12L; + private final static long workerIdShift = sequenceBits; + private final static long datacenterIdShift = sequenceBits + workerIdBits; + private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + private final static long sequenceMask = -1L ^ (-1L << sequenceBits); + private static long lastTimestamp = -1L; + private long sequence = 0L; + private final long workerId; + private final long datacenterId; + + public IdWorker() { + this.datacenterId = getDatacenterId(maxDatacenterId); + this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); + } + + public IdWorker(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + public synchronized long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + long nextId = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) | sequence; + + return nextId; + } + + private long tilNextMillis(final long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + return timestamp; + } + + private long timeGen() { + return System.currentTimeMillis(); + } + + protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { + StringBuffer mpid = new StringBuffer(); + mpid.append(datacenterId); + String name = ManagementFactory.getRuntimeMXBean().getName(); + if (!name.isEmpty()) { + /* + * GET jvmPid + */ + mpid.append(name.split("@")[0]); + } + return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); + } + + protected static long getDatacenterId(long maxDatacenterId) { + long id = 0L; + try { + InetAddress ip = InetAddress.getLocalHost(); + NetworkInterface network = NetworkInterface.getByInetAddress(ip); + if (network == null) { + id = 1L; + } else { + byte[] mac = network.getHardwareAddress(); + id = ((0x000000FF & (long) mac[mac.length - 1]) + | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; + id = id % (maxDatacenterId + 1); + } + } catch (Exception e) { + System.out.println(" getDatacenterId: " + e.getMessage()); + } + return id; + } +} From 1d448b00647b502eb2c7e86b8ce8a645b4197b2a Mon Sep 17 00:00:00 2001 From: Chase Lennartson Date: Fri, 29 Apr 2022 14:21:18 -0500 Subject: [PATCH 2/2] finshed version --- .../controller/ExpenseController.java | 9 +++++++++ .../tcu/cs/expensetracker/domain/Expense.java | 9 --------- .../service/ExpenseService.java | 19 ++++++++++++++++++- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/tcu/cs/expensetracker/controller/ExpenseController.java b/src/main/java/edu/tcu/cs/expensetracker/controller/ExpenseController.java index 014540b..55a167e 100644 --- a/src/main/java/edu/tcu/cs/expensetracker/controller/ExpenseController.java +++ b/src/main/java/edu/tcu/cs/expensetracker/controller/ExpenseController.java @@ -4,8 +4,10 @@ import edu.tcu.cs.expensetracker.domain.Result; import edu.tcu.cs.expensetracker.domain.StatusCode; import edu.tcu.cs.expensetracker.service.ExpenseService; + import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; @RestController @@ -29,6 +31,13 @@ public Result findById(@PathVariable String expenseId) { return new Result(true, StatusCode.SUCCESS, "Find One Success", expenseService.findById(expenseId)); } + @GetMapping("/{expenseStart}/{expenseEnd}") + public Result findById(@PathVariable String expenseStart, @PathVariable String expenseEnd) { + LocalDate expenseStartDate = LocalDate.parse(expenseStart); + LocalDate expenseEndDate = LocalDate.parse(expenseEnd); + return new Result(true, StatusCode.SUCCESS, "Find Between Dates Success", expenseService.findBetweenDates(expenseStartDate, expenseEndDate)); + } + @PostMapping public Result save(@RequestBody Expense newExpense){ expenseService.save(newExpense); diff --git a/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java b/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java index 468bf12..9313a77 100644 --- a/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java +++ b/src/main/java/edu/tcu/cs/expensetracker/domain/Expense.java @@ -12,7 +12,6 @@ public class Expense implements Serializable { private String id; private String name; private String description; - private String imageUrl; private String money; private String account; private String createTime; @@ -23,14 +22,6 @@ public class Expense implements Serializable { public Expense() { } - public Expense getOwner() { - return owner; - } - - public void setOwner(Expense owner) { - this.owner = owner; - } - public String getId() { return id; } diff --git a/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java b/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java index 0e03ad2..90b7d47 100644 --- a/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java +++ b/src/main/java/edu/tcu/cs/expensetracker/service/ExpenseService.java @@ -4,7 +4,11 @@ import edu.tcu.cs.expensetracker.dao.ExpenseDao; import org.springframework.stereotype.Service; import javax.transaction.Transactional; + +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service @Transactional @@ -12,7 +16,7 @@ public class ExpenseService { private ExpenseDao expenseDao; - // Spring will automatically inject an instance of ArtifactDao and an instance of IdWorker into this class + // Spring will automatically inject an instance of ExpenseDao public ExpenseService(ExpenseDao expenseDao) { this.expenseDao = expenseDao; @@ -22,6 +26,19 @@ public ExpenseService(ExpenseDao expenseDao) { public Expense findById(String expenseId) { return expenseDao.findById(expenseId).get(); } + public List findBetweenDates(LocalDate startDate, LocalDate endDate) { + List dateList = startDate.datesUntil(endDate).collect(Collectors.toList()); + List startDates = expenseDao.findAll(); + List endDates = new ArrayList<>(); + + for (int i = 0; i < startDates.size(); i++) { + if (dateList.contains(LocalDate.parse(startDates.get(i).getCreateTime()))) { + endDates.add(startDates.get(i)); + } + } + return endDates; + } + public void save(Expense newExpense) { expenseDao.save(newExpense); }