Skip to content

Commit

Permalink
Merge pull request #7 from morteza-nouri/CA2
Browse files Browse the repository at this point in the history
CA2 implement all API's
  • Loading branch information
SM2A authored Mar 17, 2023
2 parents b804d53 + 3f6e149 commit 0d3fc12
Show file tree
Hide file tree
Showing 52 changed files with 1,151 additions and 169 deletions.
20 changes: 20 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,26 @@
</properties>

<dependencies>
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin-rendering</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>io.pebbletemplates</groupId>
<artifactId>pebble</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
Expand Down
56 changes: 30 additions & 26 deletions src/main/java/ir/ut/ece/ie/OnlineShopApplication.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,38 @@
package ir.ut.ece.ie;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import ir.ut.ece.ie.util.Dispatcher;
import ir.ut.ece.ie.util.ResponseModel;
import io.javalin.Javalin;
import ir.ut.ece.ie.javalinhandlers.BuyListHandler;
import ir.ut.ece.ie.javalinhandlers.CommodityHandler;
import ir.ut.ece.ie.javalinhandlers.ProviderHandler;
import ir.ut.ece.ie.javalinhandlers.UserHandler;
import ir.ut.ece.ie.util.DataInitializer;
import ir.ut.ece.ie.util.Path;

import java.util.Scanner;
import java.io.IOException;

public class OnlineShopApplication {
public static void main(String[] args) {
run();
}
public static void main(String[] args) throws IOException, InterruptedException {
DataInitializer.loadData("http://5.253.25.110:5000");

Javalin app = Javalin.create().start(8000);

// Commodity
app.get(Path.Web.COMMODITIES, CommodityHandler.getAllCommodities);
app.get(Path.Web.COMMODITY, CommodityHandler.getCommodityById);
app.get(Path.Web.COMMODITIES_IN_PRICE_RANGE, CommodityHandler.getAllCommoditiesInPriceRange);
app.get(Path.Web.COMMODITIES_IN_CATEGORY, CommodityHandler.getAllCommoditiesInCategory);
app.post(Path.Web.RATE_COMMODITY, CommodityHandler.rateCommodity);
app.post(Path.Web.VOTE_COMMENT, CommodityHandler.voteComment);

// Provider
app.get(Path.Web.PROVIDER, ProviderHandler.getProvider);

// User
app.get(Path.Web.USER, UserHandler.getUser);
app.get(Path.Web.ADD_CREDIT, UserHandler.addCredit);

public static void run() {
Dispatcher dispatcher = new Dispatcher();
Scanner scanner = new Scanner(System.in);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();

ResponseModel responseModel = new ResponseModel();
while (scanner.hasNextLine()) {
String request = scanner.nextLine();
try {
responseModel.setData(dispatcher.dispatch(request));
responseModel.setSuccess(true);
} catch (Exception e) {
responseModel.setData(e.getMessage());
responseModel.setSuccess(false);
}
System.out.println(gson.toJson(responseModel));
}
// Buy List
app.post(Path.Web.ADD_TO_BUYLIST, BuyListHandler.addToBuyList);
app.post(Path.Web.REMOVE_FROM_BUYLIST, BuyListHandler.removeFromBuyList);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package ir.ut.ece.ie.controller.buylist;

import ir.ut.ece.ie.domain.buylist.BuyList;
import ir.ut.ece.ie.domain.commodity.Commodity;
import ir.ut.ece.ie.service.buylist.BuyListService;

import java.util.ArrayList;
import java.util.List;

public class BuyListController {
Expand All @@ -17,7 +19,8 @@ public Commodity addToBuyList(String username, Long commodityId) {
}

public List<Commodity> getBuyList(String username) {
return buyListService.getBuyList(username).getCommodities();
BuyList buyList = buyListService.getBuyList(username).orElse(new BuyList(username, new ArrayList<>()));
return buyList.getCommodities();
}

public void removeFromBuyList(String username, Long commodityId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ir.ut.ece.ie.controller.commodity;

import ir.ut.ece.ie.domain.commodity.Comment;
import ir.ut.ece.ie.service.commodity.CommentService;
import ir.ut.ece.ie.service.commodity.VoteService;

import java.util.List;

public class CommentController {
private final CommentService commentService;
private final VoteService voteService;

public CommentController(CommentService commentService, VoteService voteService) {
this.commentService = commentService;
this.voteService = voteService;
}

public List<Comment> getCommentsOfCommodity(Long commodityId) {
return commentService.getCommentsOfCommodity(commodityId).stream().map(comment -> {
comment.setLikes(voteService.getNumberOfLikesOfComment(comment.getId()));
comment.setDislikes(voteService.getNumberOfDislikesOfComment(comment.getId()));
return comment;
}).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import ir.ut.ece.ie.service.commodity.CommodityService;

import java.util.List;
import java.util.Optional;

public class CommodityController {
private final CommodityService commodityService;
Expand All @@ -20,18 +19,25 @@ public Commodity addCommodity(Commodity commodity) {
}

public Commodity getCommodityById(Long id) {
return Optional.ofNullable(commodityService.getCommodityById(id))
.orElseThrow(() -> new OnlineShopException("commodity not found"));
return commodityService.getCommodityById(id).orElseThrow(() -> new OnlineShopException("commodity not found"));
}

public List<Commodity> getCommodities() {
return commodityService.getCommodities();
}

public List<Commodity> getCommoditiesByProviderId(Integer id) {
return commodityService.getCommoditiesByProviderId(id);
}

public List<Commodity> getCommoditiesByCategory(String category) {
return commodityService.getCommoditiesByCategory(category);
}

public List<Commodity> getCommoditiesInPriceRange(Long from, Long to) {
return commodityService.getCommoditiesInPriceRange(from, to);
}

public Commodity rateCommodity(Score score) {
return commodityService.rateCommodity(score);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ir.ut.ece.ie.controller.commodity;

import ir.ut.ece.ie.domain.commodity.Vote;
import ir.ut.ece.ie.domain.user.User;
import ir.ut.ece.ie.exception.OnlineShopException;
import ir.ut.ece.ie.service.commodity.VoteService;
import ir.ut.ece.ie.service.user.UserService;

import java.util.Optional;

public class VoteController {
private final VoteService voteService;
private final UserService userService;

public VoteController(VoteService voteService, UserService userService) {
this.voteService = voteService;
this.userService = userService;
}

public Vote addVote(Vote vote) {
Optional<User> user = userService.getUser(vote.getUsername());
if (user.isEmpty())
throw new OnlineShopException("User not found");
if (voteService.findByUsernameAndCommentId(vote.getUsername(), vote.getCommentId()).isPresent())
voteService.deleteByUsernameAndCommentId(vote.getUsername(), vote.getCommentId());
return voteService.save(vote);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ir.ut.ece.ie.controller.provider;

import ir.ut.ece.ie.domain.provider.Provider;
import ir.ut.ece.ie.exception.OnlineShopException;
import ir.ut.ece.ie.service.provider.ProviderService;

public class ProviderController {
Expand All @@ -13,4 +14,8 @@ public ProviderController(ProviderService service) {
public Provider addProvider(Provider provider) {
return providerService.addProvider(provider);
}

public Provider getProviderById(Integer id) {
return providerService.getProvider(id).orElseThrow(() -> new OnlineShopException("Provider not found!"));
}
}
11 changes: 11 additions & 0 deletions src/main/java/ir/ut/ece/ie/controller/user/UserController.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ir.ut.ece.ie.controller.user;

import ir.ut.ece.ie.domain.user.User;
import ir.ut.ece.ie.exception.OnlineShopException;
import ir.ut.ece.ie.service.user.UserService;

public class UserController {
Expand All @@ -13,4 +14,14 @@ public UserController(UserService service) {
public User addUser(User user) {
return userService.addUser(user);
}

public User getUser(String username) {
return userService.getUser(username).orElseThrow(() -> new OnlineShopException("User not found!"));
}

public void addCredit(String username, Long credit) {
User user = getUser(username);
if (credit <= 0) throw new OnlineShopException("Invalid credit");
user.setCredit(user.getCredit() + credit);
}
}
14 changes: 14 additions & 0 deletions src/main/java/ir/ut/ece/ie/domain/commodity/Comment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ir.ut.ece.ie.domain.commodity;

import lombok.Data;

@Data
public class Comment {
private Long id;
private Long commodityId;
private String userEmail;
private String text;
private String date;
private Integer likes;
private Integer dislikes;
}
46 changes: 46 additions & 0 deletions src/main/java/ir/ut/ece/ie/domain/commodity/Vote.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package ir.ut.ece.ie.domain.commodity;

import lombok.Data;

import java.util.Objects;

@Data
public class Vote {
private String username;
private Long commentId;
private Status vote;

public Vote(String username, Long commentId) {
this.username = username;
this.commentId = commentId;
}

public Vote(String username, Long commentId, Status vote) {
this.username = username;
this.commentId = commentId;
this.vote = vote;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Vote vote = (Vote) o;
return commentId.equals(vote.commentId) && Objects.equals(username, vote.username);
}

public enum Status {
LIKE(1), DISLIKE(-1);

public final Integer value;

Status(Integer value) {
this.value = value;
}

public static Status enumOf(int value) {
return value == 1 ? LIKE : DISLIKE;
}
}

}
26 changes: 26 additions & 0 deletions src/main/java/ir/ut/ece/ie/javalinhandlers/BuyListHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ir.ut.ece.ie.javalinhandlers;

import io.javalin.http.Handler;
import ir.ut.ece.ie.controller.buylist.BuyListController;
import ir.ut.ece.ie.util.Factory;
import ir.ut.ece.ie.util.Path;

public class BuyListHandler {
private static final BuyListController buyListController = Factory.getBuyListController();
public static Handler addToBuyList = ctx -> {
try {
buyListController.addToBuyList(ctx.pathParam("username"), Long.valueOf(ctx.pathParam("commodityId")));
ctx.render(Path.Template.SUCCESS);
} catch (Exception e) {
ctx.result(e.getMessage());
}
};
public static Handler removeFromBuyList = ctx -> {
try {
buyListController.removeFromBuyList(ctx.pathParam("username"), Long.valueOf(ctx.pathParam("commodityId")));
ctx.render(Path.Template.SUCCESS);
} catch (Exception e) {
ctx.result(e.getMessage());
}
};
}
65 changes: 65 additions & 0 deletions src/main/java/ir/ut/ece/ie/javalinhandlers/CommodityHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package ir.ut.ece.ie.javalinhandlers;

import io.javalin.http.Handler;
import ir.ut.ece.ie.controller.commodity.CommentController;
import ir.ut.ece.ie.controller.commodity.CommodityController;
import ir.ut.ece.ie.controller.commodity.VoteController;
import ir.ut.ece.ie.domain.commodity.Score;
import ir.ut.ece.ie.domain.commodity.Vote;
import ir.ut.ece.ie.domain.user.User;
import ir.ut.ece.ie.util.Factory;
import ir.ut.ece.ie.util.Path;

import java.util.Collections;
import java.util.Map;

public class CommodityHandler {
private static final CommodityController commodityController = Factory.getCommodityController();
private static final CommentController commentController = Factory.getCommentController();
private static final VoteController voteController = Factory.getVoteController();

public static Handler getAllCommodities = ctx ->
ctx.render(
Path.Template.COMMODITIES,
Collections.singletonMap("commodities", commodityController.getCommodities()));

public static Handler getCommodityById = ctx ->
ctx.render(
Path.Template.ONE_COMMODITY, Map.of(
"commodity", commodityController.getCommodityById(Long.valueOf(ctx.pathParam("commodity_id"))),
"comments", commentController.getCommentsOfCommodity(Long.valueOf(ctx.pathParam("commodity_id"))))
);
public static Handler getAllCommoditiesInPriceRange = ctx ->
ctx.render(Path.Template.COMMODITIES, Collections.singletonMap("commodities",
commodityController.getCommoditiesInPriceRange(
Long.valueOf(ctx.pathParam("start_price")),
Long.valueOf(ctx.pathParam("end_price")))));

public static Handler getAllCommoditiesInCategory = ctx ->
ctx.render(Path.Template.COMMODITIES, Collections.singletonMap("commodities",
commodityController.getCommoditiesByCategory(ctx.pathParam("category"))));

public static Handler rateCommodity = ctx -> {
try {
String username = ctx.pathParam("username");
String commodityId = ctx.pathParam("commodityId");
String rate = ctx.pathParam("rate");
commodityController.rateCommodity(new Score(username, Long.valueOf(commodityId), Integer.valueOf(rate)));
ctx.render(Path.Template.SUCCESS);
} catch (Exception e) {
ctx.result(e.getMessage());
}
};

public static Handler voteComment = ctx -> {
try {
String username = ctx.pathParam("username");
String commodityId = ctx.pathParam("commodityId");
int vote = Integer.parseInt(ctx.pathParam("vote"));
voteController.addVote(new Vote(username, Long.parseLong(commodityId), Vote.Status.enumOf(vote)));
ctx.render(Path.Template.SUCCESS);
} catch (Exception e) {
ctx.result(e.getMessage());
}
};
}
Loading

0 comments on commit 0d3fc12

Please sign in to comment.