diff --git a/src/main/java/com/lambdaschool/bucketlist/SeedData.java b/src/main/java/com/lambdaschool/bucketlist/SeedData.java index f0257e3..e8d4f4e 100644 --- a/src/main/java/com/lambdaschool/bucketlist/SeedData.java +++ b/src/main/java/com/lambdaschool/bucketlist/SeedData.java @@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; - +//// //@Transactional //@Component public class SeedData implements CommandLineRunner diff --git a/src/main/java/com/lambdaschool/bucketlist/controllers/ItemController.java b/src/main/java/com/lambdaschool/bucketlist/controllers/ItemController.java index 7cf0ccc..510cd11 100644 --- a/src/main/java/com/lambdaschool/bucketlist/controllers/ItemController.java +++ b/src/main/java/com/lambdaschool/bucketlist/controllers/ItemController.java @@ -1,9 +1,8 @@ package com.lambdaschool.bucketlist.controllers; -import com.lambdaschool.bucketlist.models.ErrorDetail; -import com.lambdaschool.bucketlist.models.Item; -import com.lambdaschool.bucketlist.models.User; +import com.lambdaschool.bucketlist.models.*; import com.lambdaschool.bucketlist.repository.UserRepository; +import com.lambdaschool.bucketlist.services.FriendService; import com.lambdaschool.bucketlist.services.ItemService; import com.lambdaschool.bucketlist.services.UserService; import io.swagger.annotations.*; @@ -21,6 +20,7 @@ import javax.validation.Valid; import java.net.URI; import java.net.URISyntaxException; +import java.util.HashMap; import java.util.List; @RestController @@ -38,41 +38,42 @@ public class ItemController @Autowired private UserRepository userrepos; - @GetMapping(value = "", - produces = {"application/json"}) - public ResponseEntity listUsersItems(HttpServletRequest request, Authentication authentication) - { + @Autowired + private FriendService friendService; + + @ApiOperation(value = "Returns the users info including userid, username, and items") + @GetMapping(value = "/user", + produces = {"application/json"}) + public ResponseEntity getUser(HttpServletRequest request, Authentication authentication) { logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); - List allItems = itemService.findByUserName(authentication.getName()); - return new ResponseEntity<>(allItems, HttpStatus.OK); + User u = userrepos.findByUsername(authentication.getName()); + u.setRequests(friendService.getMyFriends(u.getUsername())); + u.setFriends(friendService.getAcceptedFriends(u.getUsername())); + + return new ResponseEntity<>(u, HttpStatus.OK); } -// @GetMapping(value = "/{itemid}", -// produces = {"application/json"}) -// public ResponseEntity getItem(HttpServletRequest request, -// @PathVariable -// Long itemid) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// Item q = itemService.findQuoteById(itemid); -// return new ResponseEntity<>(q, HttpStatus.OK); -// } - - -// @GetMapping(value = "/username/{userName}", -// produces = {"application/json"}) -// public ResponseEntity findItemsByUserName(HttpServletRequest request, -// @PathVariable -// String userName) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// List theItems = itemService.findByUserName(userName); -// return new ResponseEntity<>(theItems, HttpStatus.OK); -// } + + @GetMapping(value = "/username/{userName}", + produces = {"application/json"}) + public ResponseEntity findItemsByUserName(HttpServletRequest request, + @PathVariable + String userName) + { + logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); + Response newResponse = new Response(); + + List friendItems = itemService.findItemByUserName(userName.toLowerCase()); + if(friendItems == null){ + newResponse.setError("No Items for that user"); + return new ResponseEntity<>(newResponse, HttpStatus.NOT_FOUND); + } else { + return new ResponseEntity<>(friendItems, HttpStatus.OK); + + } + } // @ApiOperation(value = "Create new Bucket list item") @@ -90,26 +91,61 @@ public ResponseEntity addNewItem(HttpServletRequest request, Authentication authentication) throws URISyntaxException { logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); - itemService.save(item); - - // set the location header for the newly created resource HttpHeaders responseHeaders = new HttpHeaders(); -// URI newQuoteURI = ServletUriComponentsBuilder.fromCurrentRequest().path("/{itemid}").buildAndExpand(newItem.getItemid()).toUri(); -// responseHeaders.setLocation(newQuoteURI); + return new ResponseEntity<>(itemService.findItemById(item.getItemid()), responseHeaders, HttpStatus.CREATED); + } + + @PostMapping(value = "/journal/{itemid}", consumes = {"application/json"}, produces = {"application/json"}) + public ResponseEntity addToJournal(@PathVariable long itemid, + @RequestBody String journalentry){ - return new ResponseEntity<>("Bucket list item created successfully", responseHeaders, HttpStatus.CREATED); + itemService.addToJournal(itemid, journalentry); + return new ResponseEntity<>(itemService.findItemById(itemid), HttpStatus.OK); } + @DeleteMapping(value = "/journal/{journalentryid}") + public ResponseEntity deleteJournalEntryById(HttpServletRequest request, + @PathVariable + long journalentryid) + { + logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); + itemService.deleteFromJournal(journalentryid); + return new ResponseEntity<>(HttpStatus.OK); + } -// @DeleteMapping("/item/{id}") -// public ResponseEntity deleteItemById(HttpServletRequest request, -// @PathVariable -// long id) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// itemService.delete(id); -// return new ResponseEntity<>(HttpStatus.OK); -// } + @DeleteMapping(value = "/item/{id}") + public ResponseEntity deleteItemById(HttpServletRequest request, + @PathVariable + long id) + { + logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); + itemService.delete(id); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping(value = "/item/{id}") + public ResponseEntity UpdateItemById(HttpServletRequest request, + @PathVariable + long id, + @RequestBody Item newItem) { + logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); + itemService.update(id, newItem); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping(value = "/item/{itemid}/journal/{journalid}") + public ResponseEntity UpdateJournalById(HttpServletRequest request, + @PathVariable + long itemid, + @PathVariable + long journalid, + @RequestBody Journal newJournal) { + logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); + Item itemToUpdate = itemService.findItemById(itemid); + newJournal.setItem(itemToUpdate); + + itemService.updateJournal(journalid, newJournal); + return new ResponseEntity<>(itemToUpdate, HttpStatus.OK); + } } diff --git a/src/main/java/com/lambdaschool/bucketlist/controllers/OpenController.java b/src/main/java/com/lambdaschool/bucketlist/controllers/OpenController.java index bda354a..e5ca448 100644 --- a/src/main/java/com/lambdaschool/bucketlist/controllers/OpenController.java +++ b/src/main/java/com/lambdaschool/bucketlist/controllers/OpenController.java @@ -62,6 +62,7 @@ public ResponseEntity addNewUser(HttpServletRequest request, @Valid responseHeaders.setLocation(newRestaurantURI); + return new ResponseEntity<>("User created successfully", responseHeaders, HttpStatus.CREATED); } diff --git a/src/main/java/com/lambdaschool/bucketlist/controllers/UserController.java b/src/main/java/com/lambdaschool/bucketlist/controllers/UserController.java index c4c6b4c..a08b2c9 100644 --- a/src/main/java/com/lambdaschool/bucketlist/controllers/UserController.java +++ b/src/main/java/com/lambdaschool/bucketlist/controllers/UserController.java @@ -1,8 +1,7 @@ package com.lambdaschool.bucketlist.controllers; -import com.lambdaschool.bucketlist.models.ErrorDetail; -import com.lambdaschool.bucketlist.models.Friend; -import com.lambdaschool.bucketlist.models.User; +import com.lambdaschool.bucketlist.models.*; +import com.lambdaschool.bucketlist.repository.UserRepository; import com.lambdaschool.bucketlist.services.FriendService; import com.lambdaschool.bucketlist.services.UserService; import io.swagger.annotations.*; @@ -35,42 +34,17 @@ public class UserController @Autowired private FriendService friendService; -// @PreAuthorize("hasAuthority('ROLE_ADMIN')") -// @GetMapping(value = "/users", -// produces = {"application/json"}) -// public ResponseEntity listAllUsers(HttpServletRequest request) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// List myUsers = userService.findAll(); -// return new ResponseEntity<>(myUsers, HttpStatus.OK); -// } - - - -// @PreAuthorize("hasAuthority('ROLE_ADMIN')") -// @GetMapping(value = "/user/{userId}", -// produces = {"application/json"}) -// public ResponseEntity getUser(HttpServletRequest request, -// @PathVariable -// Long userId) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// User u = userService.findUserById(userId); -// return new ResponseEntity<>(u, HttpStatus.OK); -// } - + @GetMapping(value = "/search/{username}", produces = {"application/json"}) + public ResponseEntity searchUsers(@PathVariable String username){ + List foundUsers = userService.searchUsers(username); + return new ResponseEntity<>(foundUsers, HttpStatus.OK); + } -// @GetMapping(value = "/getusername", -// produces = {"application/json"}) -// @ResponseBody -// public ResponseEntity getCurrentUserName(HttpServletRequest request, Authentication authentication) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// return new ResponseEntity<>(authentication.getPrincipal(), HttpStatus.OK); -// } + @GetMapping(value = "/searchwithlist/{username}", produces = {"application/json"}) + public ResponseEntity searchUsersWithList(@PathVariable String username){ + List foundUsers = userService.searchUsersLike(username); + return new ResponseEntity<>(foundUsers, HttpStatus.OK); + } @ApiOperation(value = "Send friend request") @ApiResponses(value = { @@ -78,14 +52,20 @@ public class UserController @ApiResponse(code = 404, message = "Username not found", response = ErrorDetail.class), @ApiResponse(code = 500, message = "Server error", response = ErrorDetail.class) }) - @PostMapping(value = "add/{username}", consumes = {"application/json"}, produces = {"application/json"}) + @PostMapping(value = "add", consumes = {"application/json"}, produces = {"application/json"}) public ResponseEntity addFriend( @ApiParam(value = "Username", required = true, example = "JaneDoenomo") - @PathVariable + @RequestBody String username, Authentication authentication){ - friendService.sendRequest(username, authentication.getName()); - return new ResponseEntity<>("Friend request sent", HttpStatus.OK); + + Response newResponse = new Response(); + if(friendService.sendRequest(username, authentication.getName()) != null){ + newResponse.setMessage("Friend Request Sent!"); + } else { + newResponse.setError("Request already exists"); + } + return new ResponseEntity<>(newResponse, HttpStatus.OK); } @ApiOperation(value = "Accept friend request") @@ -94,7 +74,7 @@ public ResponseEntity addFriend( @ApiResponse(code = 404, message = "Request Id not found", response = ErrorDetail.class), @ApiResponse(code = 500, message = "Server error", response = ErrorDetail.class) }) - @PutMapping(value = "add/{requestid}", consumes = {"application/json"}, produces = {"application/json"}) + @PutMapping(value = "/add/{requestid}", consumes = {"application/json"}, produces = {"application/json"}) public ResponseEntity acceptRequest( @ApiParam(value = "Request id", required = true, example = "4") @PathVariable long requestid){ @@ -102,41 +82,6 @@ public ResponseEntity acceptRequest( return new ResponseEntity<>(null, HttpStatus.OK); } -// @PreAuthorize("hasAuthority('ROLE_ADMIN')") -// @PostMapping(value = "/user", -// consumes = {"application/json"}, -// produces = {"application/json"}) -// public ResponseEntity addNewUser(HttpServletRequest request, @Valid -// @RequestBody -// User newuser) throws URISyntaxException -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// newuser = userService.save(newuser); -// -// // set the location header for the newly created resource -// HttpHeaders responseHeaders = new HttpHeaders(); -// URI newUserURI = ServletUriComponentsBuilder.fromCurrentRequest().path("/{userid}").buildAndExpand(newuser.getUserid()).toUri(); -// responseHeaders.setLocation(newUserURI); -// -// return new ResponseEntity<>(null, responseHeaders, HttpStatus.CREATED); -// } - - -// @PutMapping(value = "/user/{id}") -// public ResponseEntity updateUser(HttpServletRequest request, -// @RequestBody -// User updateUser, -// @PathVariable -// long id) -// { -// logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); -// -// userService.update(updateUser, id); -// return new ResponseEntity<>(HttpStatus.OK); -// } - - @PreAuthorize("hasAuthority('ROLE_ADMIN')") @DeleteMapping("/user/{id}") public ResponseEntity deleteUserById(HttpServletRequest request, @@ -148,4 +93,14 @@ public ResponseEntity deleteUserById(HttpServletRequest request, userService.delete(id); return new ResponseEntity<>(HttpStatus.OK); } + + @DeleteMapping(value = "/friends/{id}") + public ResponseEntity deleteFriendById(HttpServletRequest request, + @PathVariable + long id) + { + logger.trace(request.getMethod().toUpperCase() + " " + request.getRequestURI() + " accessed"); + friendService.delete(id); + return new ResponseEntity<>(HttpStatus.OK); + } } \ No newline at end of file diff --git a/src/main/java/com/lambdaschool/bucketlist/models/Friend.java b/src/main/java/com/lambdaschool/bucketlist/models/Friend.java index ebad50b..639e190 100644 --- a/src/main/java/com/lambdaschool/bucketlist/models/Friend.java +++ b/src/main/java/com/lambdaschool/bucketlist/models/Friend.java @@ -18,10 +18,18 @@ public class Friend { private boolean accepted; - public Friend(String friendusername, String requester, boolean accepted) { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "userid", + nullable = false) + @JsonIgnoreProperties({"friend", "hibernateLazyInitializer"}) + private User user; + + + public Friend(String friendusername, String requester, boolean accepted, User user) { this.friendusername = friendusername; this.requester = requester; this.accepted = accepted; + this.user = user; } public Friend() { @@ -58,4 +66,12 @@ public boolean isAccepted() { public void setAccepted(boolean accepted) { this.accepted = accepted; } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } } diff --git a/src/main/java/com/lambdaschool/bucketlist/models/Item.java b/src/main/java/com/lambdaschool/bucketlist/models/Item.java index 7101fa8..77d749c 100644 --- a/src/main/java/com/lambdaschool/bucketlist/models/Item.java +++ b/src/main/java/com/lambdaschool/bucketlist/models/Item.java @@ -1,10 +1,14 @@ package com.lambdaschool.bucketlist.models; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import javax.persistence.*; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; @ApiModel(value = "Item", description = "Item object") @Entity @@ -27,11 +31,23 @@ public class Item extends Auditable @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "userid", nullable = false) - @JsonIgnoreProperties({"item", "hibernateLazyInitializer"}) + @JsonIgnoreProperties({"item", "hibernateLazyInitializer", "user"}) + @JsonIgnore private User user; + private String image; + private boolean completed; + private Date created = new Date(); + + @OneToMany(mappedBy = "item", + cascade = CascadeType.ALL, + orphanRemoval = true) + @JsonIgnoreProperties({"item", "hibernateLazyInitializer"}) + private List journal; + + public Item() { } @@ -47,11 +63,19 @@ public Item(String itemtitle, String itemdesc, User user) { this.user = user; } - public Item(String itemtitle, String itemdesc, User user, boolean completed) { + public Item(String itemtitle, String itemdesc, User user, String image) { + this.itemtitle = itemtitle; + this.itemdesc = itemdesc; + this.user = user; + this.image = image; + } + + public Item(String itemtitle, String itemdesc, User user, boolean completed, List journal) { this.itemtitle = itemtitle; this.itemdesc = itemdesc; this.user = user; this.completed = completed; + this.journal = journal; } public long getItemid() { @@ -70,6 +94,14 @@ public void setItemtitle(String itemtitle) { this.itemtitle = itemtitle; } + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + public String getItemdesc() { return itemdesc; } @@ -93,4 +125,24 @@ public boolean isCompleted() { public void setCompleted(boolean completed) { this.completed = completed; } + + public Date getCreated() { + SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyy HH:mm"); +// return sdf.format(created); + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + + + public List getJournal() { + return journal; + } + + public void setJournal(List journal) { + this.journal = journal; + } } \ No newline at end of file diff --git a/src/main/java/com/lambdaschool/bucketlist/models/Journal.java b/src/main/java/com/lambdaschool/bucketlist/models/Journal.java index bebb0c7..b641a44 100644 --- a/src/main/java/com/lambdaschool/bucketlist/models/Journal.java +++ b/src/main/java/com/lambdaschool/bucketlist/models/Journal.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.util.Optional; @Entity @Table(name = "journals") @@ -11,20 +12,30 @@ public class Journal { @GeneratedValue(strategy = GenerationType.AUTO) private long journalentryid; + @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "itemid", - nullable = false) - @JsonIgnoreProperties({"journal", "hibernateLazyInitializer"}) - private User user; + @JoinColumn(name = "itemid", nullable = false) + @JsonIgnoreProperties({"item", "hibernateLazyInitializer"}) + private Item item; + @Column(nullable = false) private String entry; - public Journal(User user, String entry) { - this.user = user; + private String username; + + + public Journal(Item item, String entry) { + this.item = item; this.entry = entry; } + public Journal(Item item, String entry, String username) { + this.item = item; + this.entry = entry; + this.username = username; + } + public Journal() { } @@ -36,12 +47,12 @@ public void setJournalentryid(long journalentryid) { this.journalentryid = journalentryid; } - public User getUser() { - return user; + public Item getItem() { + return item; } - public void setUser(User user) { - this.user = user; + public void setItem(Item item) { + this.item = item; } public String getEntry() { @@ -51,4 +62,12 @@ public String getEntry() { public void setEntry(String entry) { this.entry = entry; } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } } diff --git a/src/main/java/com/lambdaschool/bucketlist/models/Response.java b/src/main/java/com/lambdaschool/bucketlist/models/Response.java new file mode 100644 index 0000000..874608f --- /dev/null +++ b/src/main/java/com/lambdaschool/bucketlist/models/Response.java @@ -0,0 +1,31 @@ +package com.lambdaschool.bucketlist.models; + +public class Response { + private String message; + + private String error; + + public Response(String message, String error) { + this.message = message; + this.error = error; + } + + public Response() { + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } +} diff --git a/src/main/java/com/lambdaschool/bucketlist/models/User.java b/src/main/java/com/lambdaschool/bucketlist/models/User.java index 9ea3b2a..9c0b192 100644 --- a/src/main/java/com/lambdaschool/bucketlist/models/User.java +++ b/src/main/java/com/lambdaschool/bucketlist/models/User.java @@ -1,5 +1,6 @@ package com.lambdaschool.bucketlist.models; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; @@ -37,12 +38,18 @@ public class User extends Auditable @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) @JsonIgnoreProperties("user") + @JsonIgnore private List userRoles = new ArrayList<>(); @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) @JsonIgnoreProperties("user") - private List friends = new ArrayList<>(); + private List requests = new ArrayList<>(); + + @OneToMany(mappedBy = "user", + cascade = CascadeType.ALL) + @JsonIgnoreProperties("user") + private List friends = new ArrayList<>(); @OneToMany(mappedBy = "user", @@ -55,6 +62,10 @@ public User() { } + public User(String username) { + this.username = username; + } + public User(String username, String password, List userRoles) { setUsername(username); @@ -66,6 +77,10 @@ public User(String username, String password, List userRoles) this.userRoles = userRoles; } + public User(String newUsernametest, String password) { + super(); + } + public long getUserid() { return userid; @@ -122,8 +137,10 @@ public void setItems(List items) this.items = items; } + @JsonIgnore public List getAuthority() { + List rtnList = new ArrayList<>(); for (UserRoles r : this.userRoles) @@ -134,4 +151,20 @@ public List getAuthority() return rtnList; } + + public List getFriends() { + return friends; + } + + public void setFriends(List friends) { + this.friends = friends; + } + + public List getRequests() { + return requests; + } + + public void setRequests(List requests) { + this.requests = requests; + } } diff --git a/src/main/java/com/lambdaschool/bucketlist/repository/BucketListRepository.java b/src/main/java/com/lambdaschool/bucketlist/repository/BucketListRepository.java index 475fb88..2a3e293 100644 --- a/src/main/java/com/lambdaschool/bucketlist/repository/BucketListRepository.java +++ b/src/main/java/com/lambdaschool/bucketlist/repository/BucketListRepository.java @@ -1,15 +1,16 @@ package com.lambdaschool.bucketlist.repository; -import com.lambdaschool.bucketlist.models.Item; -import com.lambdaschool.bucketlist.view.BucketList; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; + import com.lambdaschool.bucketlist.models.Item; + import com.lambdaschool.bucketlist.view.BucketList; + import org.springframework.data.jpa.repository.Query; + import org.springframework.data.repository.CrudRepository; + import org.springframework.data.repository.query.Param; -import java.util.List; + import java.util.List; public interface BucketListRepository extends CrudRepository { -// SELECT * FROM ITEMS WHERE userid = 4 -// @Query(value = "SELECT * FROM items WHERE userid = :id", nativeQuery = true) -// List findByUserName(String username); + // SELECT * FROM ITEMS WHERE userid = 4 + @Query(value = "SELECT * FROM items WHERE userid = :id", nativeQuery = true) + List findItemsByUserId(@Param("id") long id); } diff --git a/src/main/java/com/lambdaschool/bucketlist/repository/FriendRepository.java b/src/main/java/com/lambdaschool/bucketlist/repository/FriendRepository.java index 586ff30..eea70d7 100644 --- a/src/main/java/com/lambdaschool/bucketlist/repository/FriendRepository.java +++ b/src/main/java/com/lambdaschool/bucketlist/repository/FriendRepository.java @@ -1,8 +1,22 @@ package com.lambdaschool.bucketlist.repository; import com.lambdaschool.bucketlist.models.Friend; +import com.lambdaschool.bucketlist.view.GetFriends; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface FriendRepository extends CrudRepository { + @Query(value = "SELECT * FROM friends WHERE LOWER(friendusername) = :myfriendslist AND accepted = false", nativeQuery = true) + List getFriendRequests(@Param("myfriendslist") String username); +// List getFriendRequests(); + @Query(value = "SELECT * FROM friends WHERE accepted = true AND LOWER (friendusername) = :username OR LOWER (requester) = :username", nativeQuery = true) + List getAcceptedFriends(@Param("username") String user); + + + @Query(value = "SELECT * FROM friends WHERE LOWER (friendusername) = :username OR LOWER (friendusername) = :requester AND LOWER (requester) = :requester OR LOWER (requester) = :username", nativeQuery = true) + Friend searchIfRequestExists(@Param("requester") String requester, @Param("username") String username); } diff --git a/src/main/java/com/lambdaschool/bucketlist/repository/JournalRepository.java b/src/main/java/com/lambdaschool/bucketlist/repository/JournalRepository.java new file mode 100644 index 0000000..77ddded --- /dev/null +++ b/src/main/java/com/lambdaschool/bucketlist/repository/JournalRepository.java @@ -0,0 +1,7 @@ +package com.lambdaschool.bucketlist.repository; + +import com.lambdaschool.bucketlist.models.Journal; +import org.springframework.data.repository.CrudRepository; + +public interface JournalRepository extends CrudRepository { +} diff --git a/src/main/java/com/lambdaschool/bucketlist/repository/UserRepository.java b/src/main/java/com/lambdaschool/bucketlist/repository/UserRepository.java index 5d88d9d..5141251 100644 --- a/src/main/java/com/lambdaschool/bucketlist/repository/UserRepository.java +++ b/src/main/java/com/lambdaschool/bucketlist/repository/UserRepository.java @@ -1,9 +1,22 @@ package com.lambdaschool.bucketlist.repository; -import com.lambdaschool.bucketlist.models.User; -import org.springframework.data.repository.CrudRepository; + import com.lambdaschool.bucketlist.models.Item; + import com.lambdaschool.bucketlist.models.User; + import org.springframework.data.jpa.repository.Query; + import org.springframework.data.repository.CrudRepository; + import org.springframework.data.repository.query.Param; + + import java.util.List; public interface UserRepository extends CrudRepository { User findByUsername(String username); + + @Query(value = "SELECT u.username, i.* FROM users u JOIN items i ON u.userid = i.userid WHERE u.username = :user", nativeQuery = true) + List findByUsernameLike(@Param("user") String username); + + @Query(value = "SELECT username FROM users WHERE LOWER(username) LIKE %:search%", nativeQuery = true) + List findLikeUsername(@Param("search") String searchname); +// List findLikeUsername(); + } diff --git a/src/main/java/com/lambdaschool/bucketlist/services/FriendService.java b/src/main/java/com/lambdaschool/bucketlist/services/FriendService.java index 6f6cd63..40026d7 100644 --- a/src/main/java/com/lambdaschool/bucketlist/services/FriendService.java +++ b/src/main/java/com/lambdaschool/bucketlist/services/FriendService.java @@ -1,11 +1,23 @@ package com.lambdaschool.bucketlist.services; import com.lambdaschool.bucketlist.models.Friend; +import com.lambdaschool.bucketlist.models.User; + +import java.util.List; +import java.util.Optional; public interface FriendService { Friend sendRequest(String request, String requester); + Optional findRequestById(long id); + Friend save(Friend friend); Friend update(long requestid); + + List getMyFriends(String username); + + List getAcceptedFriends(String username); + + void delete(long id); } diff --git a/src/main/java/com/lambdaschool/bucketlist/services/FriendServiceImpl.java b/src/main/java/com/lambdaschool/bucketlist/services/FriendServiceImpl.java index ea2e60c..f179db9 100644 --- a/src/main/java/com/lambdaschool/bucketlist/services/FriendServiceImpl.java +++ b/src/main/java/com/lambdaschool/bucketlist/services/FriendServiceImpl.java @@ -1,12 +1,19 @@ package com.lambdaschool.bucketlist.services; +import com.lambdaschool.bucketlist.exceptions.ResourceNotFoundException; import com.lambdaschool.bucketlist.models.Friend; +import com.lambdaschool.bucketlist.models.User; import com.lambdaschool.bucketlist.repository.FriendRepository; +import com.lambdaschool.bucketlist.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityNotFoundException; +import java.util.List; +import java.util.Optional; @Service(value = "friendService") @Transactional @@ -14,12 +21,41 @@ public class FriendServiceImpl implements FriendService{ @Autowired private FriendRepository friendrepos; + @Autowired + private UserRepository userrepos; + @Override public Friend sendRequest(String request, String requester) { +// if(friendrepos.searchIfRequestExists(request.toLowerCase(), requester.toLowerCase()) != null){ +// System.out.println("******************************************************************** The request doesn't exist" ); +// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); +// User currentUser = userrepos.findByUsername(authentication.getName()); +// Friend newRequest = new Friend(); +// newRequest.setFriendusername(request); +// newRequest.setRequester(requester); +// newRequest.setUser(currentUser); +// return friendrepos.save(newRequest); +// } else { +// System.out.println("***************************************************** It exists"); +// +// return null; +// } +// + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + User currentUser = userrepos.findByUsername(authentication.getName()); Friend newRequest = new Friend(); newRequest.setFriendusername(request); newRequest.setRequester(requester); + newRequest.setUser(currentUser); +// System.out.println(friendrepos.searchIfRequestExists(request, requester)); return friendrepos.save(newRequest); + + + } + + @Override + public Optional findRequestById(long id) { + return friendrepos.findById(id); } @Override @@ -35,4 +71,26 @@ public Friend update(long requestid) { newFriend.setAccepted(!newFriend.isAccepted()); return friendrepos.save(newFriend); } + + @Override + public List getMyFriends(String username) { + return friendrepos.getFriendRequests(username.toLowerCase()); + } + + @Override + public List getAcceptedFriends(String username) { + return friendrepos.getAcceptedFriends(username.toLowerCase()); + } + + @Override + @Transactional + public void delete(long id) { + if (friendrepos.findById(id).isPresent()) + { + friendrepos.deleteById(id); + } else + { + throw new ResourceNotFoundException(Long.toString(id)); + } + } } diff --git a/src/main/java/com/lambdaschool/bucketlist/services/ItemService.java b/src/main/java/com/lambdaschool/bucketlist/services/ItemService.java index 00c3c9a..7099387 100644 --- a/src/main/java/com/lambdaschool/bucketlist/services/ItemService.java +++ b/src/main/java/com/lambdaschool/bucketlist/services/ItemService.java @@ -1,6 +1,7 @@ package com.lambdaschool.bucketlist.services; import com.lambdaschool.bucketlist.models.Item; +import com.lambdaschool.bucketlist.models.Journal; import com.lambdaschool.bucketlist.view.BucketList; import java.util.List; @@ -9,12 +10,20 @@ public interface ItemService { List findAll(); - Item findQuoteById(long id); + Item findItemById(long id); - List findByUserName(String username); + List findItemByUserName(String username); void delete(long id); Item save(Item item); + Journal addToJournal(long id, String journalEntry); + + void deleteFromJournal(long id); + + Item update(long id, Item item); + + Journal updateJournal(long id, Journal journalEntry); + } diff --git a/src/main/java/com/lambdaschool/bucketlist/services/ItemServiceImpl.java b/src/main/java/com/lambdaschool/bucketlist/services/ItemServiceImpl.java index 748e5b4..89de029 100644 --- a/src/main/java/com/lambdaschool/bucketlist/services/ItemServiceImpl.java +++ b/src/main/java/com/lambdaschool/bucketlist/services/ItemServiceImpl.java @@ -2,8 +2,10 @@ import com.lambdaschool.bucketlist.exceptions.ResourceNotFoundException; import com.lambdaschool.bucketlist.models.Item; +import com.lambdaschool.bucketlist.models.Journal; import com.lambdaschool.bucketlist.models.User; import com.lambdaschool.bucketlist.repository.BucketListRepository; +import com.lambdaschool.bucketlist.repository.JournalRepository; import com.lambdaschool.bucketlist.repository.UserRepository; import com.lambdaschool.bucketlist.view.BucketList; import org.springframework.beans.factory.annotation.Autowired; @@ -12,6 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.persistence.EntityNotFoundException; import java.util.ArrayList; import java.util.List; @@ -24,6 +27,9 @@ public class ItemServiceImpl implements ItemService @Autowired private UserRepository userrepos; + @Autowired + private JournalRepository journalrepos; + @Override public List findAll() { @@ -35,7 +41,7 @@ public List findAll() @Override - public Item findQuoteById(long id) + public Item findItemById(long id) { return listrepos.findById(id).orElseThrow(() -> new ResourceNotFoundException(Long.toString(id))); } @@ -72,12 +78,81 @@ public Item save(Item item) } @Override - public List findByUserName(String username) + public List findItemByUserName(String username) throws ResourceNotFoundException { - List list = new ArrayList<>(); - listrepos.findAll().iterator().forEachRemaining(list::add); + User currentUser = userrepos.findByUsername(username); + return listrepos.findItemsByUserId(currentUser.getUserid()); + } + + @Override + public Journal addToJournal(long id, String journalEntry) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + User currentUser = userrepos.findByUsername(authentication.getName()); + + Journal newEntry = new Journal(); + newEntry.setEntry(journalEntry); + newEntry.setItem(findItemById(id)); + newEntry.setUsername(currentUser.getUsername()); + System.out.println("*********************************" + listrepos.findById(id)); + return journalrepos.save(newEntry); + } + + @Override + public void deleteFromJournal(long id) { + if(journalrepos.findById(id).isPresent()){ + journalrepos.deleteById(id); + } else { + throw new ResourceNotFoundException(Long.toString(id)); + } + } + + @Override + @Transactional + public Item update(long id, Item item) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + User currentUser = userrepos.findByUsername(authentication.getName()); + + Item currentItem = listrepos.findById(id) + .orElseThrow(() -> new EntityNotFoundException(Long.toString(id))); + + currentItem.setItemtitle(item.getItemtitle()); + currentItem.setItemdesc(item.getItemdesc()); + currentItem.setCompleted(item.isCompleted()); + currentItem.setImage(item.getImage()); + currentItem.setItemid(item.getItemid()); + currentItem.setUser(currentUser); + currentItem.setCreated(item.getCreated()); + +// if(item.getJournal().size() > 0){ +// for (Journal j : item.getJournal()) +// { +// currentItem.getJournal().add(new Journal(j.getItem(), j.getEntry())); +// } +// +// } + + +// item.setUser(currentUser); +// item.setItemid(id); + return listrepos.save(currentItem); + } + + @Override + @Transactional + public Journal updateJournal(long id, Journal journalEntry) { + if(journalrepos.findById(id).isPresent()){ + Journal newJournalEntry = new Journal(); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + User currentUser = userrepos.findByUsername(authentication.getName()); + newJournalEntry.setUsername(currentUser.getUsername()); + newJournalEntry.setEntry(journalEntry.getEntry()); + newJournalEntry.setItem(journalEntry.getItem()); + newJournalEntry.setJournalentryid(id); + journalrepos.findById(id); + return journalrepos.save(newJournalEntry); + } else { + throw new ResourceNotFoundException(Long.toString(id)); + } - list.removeIf(q -> !q.getUser().getUsername().equalsIgnoreCase(username)); - return list; } } diff --git a/src/main/java/com/lambdaschool/bucketlist/services/UserService.java b/src/main/java/com/lambdaschool/bucketlist/services/UserService.java index 0245303..4a310ba 100644 --- a/src/main/java/com/lambdaschool/bucketlist/services/UserService.java +++ b/src/main/java/com/lambdaschool/bucketlist/services/UserService.java @@ -1,6 +1,6 @@ package com.lambdaschool.bucketlist.services; -import com.lambdaschool.bucketlist.models.Friend; +import com.lambdaschool.bucketlist.models.Item; import com.lambdaschool.bucketlist.models.User; import java.util.List; @@ -18,4 +18,9 @@ public interface UserService User update(User user, long id); + List searchUsers(String username); + + List searchUsersLike(String username); + + } \ No newline at end of file diff --git a/src/main/java/com/lambdaschool/bucketlist/services/UserServiceImpl.java b/src/main/java/com/lambdaschool/bucketlist/services/UserServiceImpl.java index ca34dbc..a3df1eb 100644 --- a/src/main/java/com/lambdaschool/bucketlist/services/UserServiceImpl.java +++ b/src/main/java/com/lambdaschool/bucketlist/services/UserServiceImpl.java @@ -1,7 +1,6 @@ package com.lambdaschool.bucketlist.services; import com.lambdaschool.bucketlist.exceptions.ResourceNotFoundException; -import com.lambdaschool.bucketlist.models.Friend; import com.lambdaschool.bucketlist.models.Item; import com.lambdaschool.bucketlist.models.User; import com.lambdaschool.bucketlist.models.UserRoles; @@ -148,4 +147,13 @@ public User update(User user, long id) } + @Override + public List searchUsers(String username) { + return userrepos.findLikeUsername(username); + } + + @Override + public List searchUsersLike(String username) { + return userrepos.findByUsernameLike(username.toLowerCase()); + } } diff --git a/src/main/java/com/lambdaschool/bucketlist/view/BucketList.java b/src/main/java/com/lambdaschool/bucketlist/view/BucketList.java index ee6c96a..de87b7c 100644 --- a/src/main/java/com/lambdaschool/bucketlist/view/BucketList.java +++ b/src/main/java/com/lambdaschool/bucketlist/view/BucketList.java @@ -1,8 +1,11 @@ package com.lambdaschool.bucketlist.view; +import java.util.Date; + public interface BucketList { long getItemid(); String getItem(); boolean getCompleted(); long getUserid(); + Date getCreated_date(); } diff --git a/src/main/java/com/lambdaschool/bucketlist/view/GetFriends.java b/src/main/java/com/lambdaschool/bucketlist/view/GetFriends.java new file mode 100644 index 0000000..631a72e --- /dev/null +++ b/src/main/java/com/lambdaschool/bucketlist/view/GetFriends.java @@ -0,0 +1,9 @@ +package com.lambdaschool.bucketlist.view; + +public interface GetFriends { + long getRequestid(); + boolean getAccepted(); + String getFriendusername(); + String getRequester(); + long getUserid(); +} diff --git a/src/main/java/com/lambdaschool/bucketlist/view/UserView.java b/src/main/java/com/lambdaschool/bucketlist/view/UserView.java new file mode 100644 index 0000000..fc7d7f4 --- /dev/null +++ b/src/main/java/com/lambdaschool/bucketlist/view/UserView.java @@ -0,0 +1,7 @@ +package com.lambdaschool.bucketlist.view; + +import com.lambdaschool.bucketlist.models.User; + +public interface UserView { + User getUsername(); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3c4bd9e..2eb8edc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -27,8 +27,8 @@ local.run.db=POSTGRESQL # What do with the schema # drop n create table again, good for testing -#spring.jpa.hibernate.ddl-auto=create -#spring.datasource.initialization-modealways +##spring.jpa.hibernate.ddl-auto=create +#spring.datasource.initialization-modealwasy # Good for production! spring.jpa.hibernate.ddl-auto=update @@ -39,9 +39,9 @@ spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true # Feature that determines what happens when no accessors are found for a type # (and there are no annotations to indicate it is meant to be serialized). +# Turns off Spring Boot automatic exception handling spring.jackson.serialization.fail-on-empty-beans=false -# Turns off Spring Boot automatic exception handling server.error.whitelabel.enabled=false # needed for actuators to work diff --git a/src/test/java/com/lambdaschool/bucketlist/StartHereApplication.java b/src/test/java/com/lambdaschool/bucketlist/BucketListApplicationTest.java similarity index 77% rename from src/test/java/com/lambdaschool/bucketlist/StartHereApplication.java rename to src/test/java/com/lambdaschool/bucketlist/BucketListApplicationTest.java index 3e0aa3c..65c6f95 100644 --- a/src/test/java/com/lambdaschool/bucketlist/StartHereApplication.java +++ b/src/test/java/com/lambdaschool/bucketlist/BucketListApplicationTest.java @@ -1,22 +1,24 @@ package com.lambdaschool.bucketlist; +import org.junit.runner.RunWith; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import springfox.documentation.swagger2.annotations.EnableSwagger2; //@EnableWebMvc -//// @EnableJpaAuditing -//@SpringBootApplication +// @EnableJpaAuditing +@SpringBootApplication //@EnableSwagger2 -public class StartHereApplication +public class BucketListApplicationTest { public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BucketListApplication.class, args); + ApplicationContext ctx = SpringApplication.run(BucketListApplicationTest.class, args); DispatcherServlet dispatcherServlet = (DispatcherServlet) ctx.getBean("dispatcherServlet"); dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); diff --git a/src/test/java/com/lambdaschool/bucketlist/SeedData.java b/src/test/java/com/lambdaschool/bucketlist/SeedData.java new file mode 100644 index 0000000..b6d396b --- /dev/null +++ b/src/test/java/com/lambdaschool/bucketlist/SeedData.java @@ -0,0 +1,81 @@ +package com.lambdaschool.bucketlist; + +import com.lambdaschool.bucketlist.models.Item; +import com.lambdaschool.bucketlist.models.Role; +import com.lambdaschool.bucketlist.models.User; +import com.lambdaschool.bucketlist.models.UserRoles; +import com.lambdaschool.bucketlist.repository.RoleRepository; +import com.lambdaschool.bucketlist.repository.UserRepository; +import com.lambdaschool.bucketlist.services.RoleService; +import com.lambdaschool.bucketlist.services.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; + +//// +//@Transactional +//@Component +public class SeedData implements CommandLineRunner +{ + private UserRepository userrepos; + private RoleRepository rolerepos; + + public SeedData(UserRepository userrepos, RoleRepository rolerepos){ + this.userrepos = userrepos; + this.rolerepos = rolerepos; + } + + + @Override + public void run(String[] args) throws Exception + { + Role r1 = new Role("admin"); + Role r2 = new Role("user"); + Role r3 = new Role("data"); + + rolerepos.save(r1); + rolerepos.save(r2); + rolerepos.save(r3); + + // admin, data, user + ArrayList admins = new ArrayList<>(); + admins.add(new UserRoles(new User(), r1)); + admins.add(new UserRoles(new User(), r2)); + admins.add(new UserRoles(new User(), r3)); + User u1 = new User("Testadmin", "password", admins); + u1.getItems().add(new Item("A creative man is motivated by the desire to achieve, not by the desire to beat others", u1)); + u1.getItems().add(new Item("The question isn't who is going to let me; it's who is going to stop me.", u1)); + userrepos.save(u1); + + // data, user + ArrayList datas = new ArrayList<>(); + datas.add(new UserRoles(new User(), r3)); + datas.add(new UserRoles(new User(), r2)); + User u2 = new User("Testcinnamon", "1234567", datas); + userrepos.save(u2); + + // user + ArrayList users = new ArrayList<>(); + users.add(new UserRoles(new User(), r2)); + User u3 = new User("Testbarnbarn", "ILuvM4th!", users); + u3.getItems().add(new Item("Live long and prosper", u3)); + u3.getItems().add(new Item("The enemy of my enemy is the enemy I kill last", u3)); + u3.getItems().add(new Item("Beam me up", u3)); + userrepos.save(u3); + + users = new ArrayList<>(); + users.add(new UserRoles(new User(), r2)); + User u4 = new User("TestBob", "password", users); + userrepos.save(u4); + + users = new ArrayList<>(); + users.add(new UserRoles(new User(), r2)); + User u5 = new User("TeatJane", "password", users); + userrepos.save(u5); + + + } +} \ No newline at end of file diff --git a/src/test/java/com/lambdaschool/bucketlist/services/UserServiceTest.java b/src/test/java/com/lambdaschool/bucketlist/services/UserServiceTest.java new file mode 100644 index 0000000..4da0fbb --- /dev/null +++ b/src/test/java/com/lambdaschool/bucketlist/services/UserServiceTest.java @@ -0,0 +1,74 @@ +package com.lambdaschool.bucketlist.services; + +import com.lambdaschool.bucketlist.BucketListApplication; +import com.lambdaschool.bucketlist.BucketListApplicationTest; +import com.lambdaschool.bucketlist.models.Role; +import com.lambdaschool.bucketlist.models.User; +import com.lambdaschool.bucketlist.models.UserRoles; +import org.junit.After; +import org.junit.Before; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = BucketListApplicationTest.class) +class UserServiceTest { + @Autowired + private UserService userService; + + @Before + void setUp() { + MockitoAnnotations.initMocks(this); + } + + @After + void tearDown() { + } + + @Test + void findAll() { + assertEquals(5, userService.findAll().size()); + } + + @Test + void findUserById() { + assertEquals("TestBob", userService.findUserById(12).getUsername()); + } + + @Test + void delete() { + } + + @Test + void save() { +// Role r2 = new Role("user"); +// List users = new ArrayList<>(); +// users.add(new UserRoles(new User(), r2)); +// User newUser = new User("NewUserTest", "password", users); + userService.save(new User("NewUsernametest", "password")); + assertEquals(6, userService.findAll().size()); + } + + @Test + void update() { + } + + @Test + void searchUsers() { + } + + @Test + void searchUsersLike() { + } +} \ No newline at end of file diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 4fbffd3..6295a07 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -16,8 +16,6 @@ server.port=${PORT:2019} # Find heroku info # heroku config -a jrmmba-starthere -#postgres://jrnwmxwprjdbyk:1963035ba6d22f0b414b91794dfd33af398f75f60bcb7fed69b53e5dea9396ac@ec2-174-129-18-42.compute-1.amazonaws.com:5432/d8hfsmnh2ucd4h -# postgres://rrwzjxlkniayov:83e8dc9dc5a3c3a30e40dde8fb62941da11030b3953709f5c8f808690e776c71@ec2-54-243-241-62.compute-1.amazonaws.com:5432/d7bl8dlv2l83jj # posgress://username :password @url :5432/dbname # Begin h2 configuration @@ -29,12 +27,13 @@ spring.h2.console.settings.web-allow-others=true # What do with the schema # drop n create table again, good for testing -spring.jpa.hibernate.ddl-auto=create -spring.datasource.initialization-mode=always +# +#spring.jpa.hibernate.ddl-auto=create +#spring.datasource.initialization-modealwasy # Good for production! -#spring.jpa.hibernate.ddl-auto=update -#spring.datasource.initialization-mode=never +spring.jpa.hibernate.ddl-auto=update +spring.datasource.initialization-mode=never # Should we use createBlob from java.sql.connection. PostgreSQL requires it to be true. spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true