diff --git a/build.gradle b/build.gradle index 3d91a94..297866c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.2.5' - id 'io.spring.dependency-management' version '1.1.4' + id 'org.springframework.boot' version '2.6.7' + id 'io.spring.dependency-management' version '1.1.0' id 'war' } @@ -9,7 +9,7 @@ version = '0.0.1-SNAPSHOT' java { - sourceCompatibility = '21' + sourceCompatibility = '17' } repositories { diff --git a/src/main/java/org/ntlab/citrusserver/repositories/AccountManager.java b/src/main/java/org/ntlab/citrusserver/repositories/AccountManager.java index 3580f3c..e2a9ca0 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/AccountManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/AccountManager.java @@ -1,6 +1,7 @@ package org.ntlab.citrusserver.repositories; import org.ntlab.citrusserver.entities.Account; +import org.ntlab.citrusserver.entities.Book; import org.springframework.stereotype.Repository; import java.util.*; @@ -12,10 +13,17 @@ private final HashMap accountToken = new HashMap<>(); //keyがaccountId,valueがtoken + private final List iAccountListeners = new ArrayList<>(); + public AccountManager() { dummyAccount(); } + public void addListener(IAccountListener iAccountListener) + { + iAccountListeners.add(iAccountListener); + } + public void dummyAccount() { //ダミーアカウントの作成 String accountId = "fish"; String password = "abc"; @@ -67,7 +75,8 @@ // アカウント情報を全削除する(DELETE) public void deleteAccount(String accountId, String token, String password) { if(accountToken.get(accountId).equals(token)) { //token比較 - if(accounts.get(accountId).getPassword().equals(password)) { //password比較 + if(accounts.get(accountId).getPassword().equals(password)) {//password比較 + notifyDeletedListener(getAccount(accountId)); accounts.remove(accountId); } } @@ -106,4 +115,12 @@ return null; } + private void notifyDeletedListener(Account account) + { + for(IAccountListener iAccountListener : iAccountListeners) + { + iAccountListener.accountDeleted(account); + } + } + } diff --git a/src/main/java/org/ntlab/citrusserver/repositories/BookManager.java b/src/main/java/org/ntlab/citrusserver/repositories/BookManager.java index 7bbe584..a8ca3df 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/BookManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/BookManager.java @@ -14,7 +14,7 @@ import java.util.Objects; @Repository -public class BookManager { +public class BookManager implements IAccountListener { private final HashMap> booksMap = new HashMap<>(); private final AccountManager accountManager; //仮 @@ -24,6 +24,7 @@ public BookManager(AccountManager accountManager) { this.accountManager = accountManager; + accountManager.addListener(this); createBook("fish","Aさんのダミ本","#B2A9F0", false);//ダミーの本 createBook("bird","Bさんのダミ本","#C1F8E5", false);//ダミーの本 } @@ -120,6 +121,15 @@ booksMap.get(accountId).get(bookId).setColor(color); } + @Override + public void accountDeleted(Account account) { + for(Book book : booksMap.get(account.getId()).values()){ + notifyDeletedListener(account, book); + + } + deleteAllBooks(account.getId()); + } + //--------------------------------------------------------------------------------- // private //--------------------------------------------------------------------------------- @@ -150,4 +160,6 @@ return dtf1.format(nowDate); } + + } diff --git a/src/main/java/org/ntlab/citrusserver/repositories/FavoriteManager.java b/src/main/java/org/ntlab/citrusserver/repositories/FavoriteManager.java index 0a87c00..1d95766 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/FavoriteManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/FavoriteManager.java @@ -65,8 +65,6 @@ } - //favorites - //get //いいねした人の一覧を返す: accountIdの本(bookId)にいいねしたotherAccountIdとその本の一覧 public HashMap> getFavorites(String accountId) { //otherAccountIDといいねしたbookIdの集合(本はaccountIdのもの限定) @@ -103,19 +101,26 @@ } - // accountを削除したいとき +// accountを削除したいとき public void removeFavoriteById(String accountId) { // accountIdはamika1107 - favoritedMap.remove(accountId); // tedのアカウントから下全部消す - for (String otherAccountId : favoritesMap.get(accountId).keySet()) { - favoritesMap.get(accountId).remove(otherAccountId); // tesのotherから下全部 + //birdのアカウントを消した時 + if (favoritedMap.containsKey(accountId)) { + for (Integer bookId : favoritedMap.get(accountId).keySet()) { + for (String fanAccountId : favoritedMap.get(accountId).get(bookId)) { + favoritesMap.get(fanAccountId).remove(accountId); // tesのotherから下全部 + } + } + favoritedMap.remove(accountId); // tedのアカウントから下全部消す } - for (Integer bookId : favoritedMap.get(accountId).keySet()) { - for (String otherAccountId : favoritedMap.get(accountId).get(bookId)) { - favoritedMap.get(accountId).get(bookId).remove(otherAccountId); + if(favoritesMap.containsKey(accountId)) { + for (String starAccountId : favoritesMap.get(accountId).keySet()) { + for (Integer bookId : favoritesMap.get(accountId).get(starAccountId)) { + favoritedMap.get(starAccountId).get(bookId).remove(accountId); + } } + favoritesMap.remove(accountId); } - favoritesMap.remove(accountId); } // bookIdを削除したいとき diff --git a/src/main/java/org/ntlab/citrusserver/repositories/IAccountListener.java b/src/main/java/org/ntlab/citrusserver/repositories/IAccountListener.java new file mode 100644 index 0000000..4d0dd58 --- /dev/null +++ b/src/main/java/org/ntlab/citrusserver/repositories/IAccountListener.java @@ -0,0 +1,7 @@ +package org.ntlab.citrusserver.repositories; + +import org.ntlab.citrusserver.entities.Account; + +public interface IAccountListener { + void accountDeleted(Account account); +} diff --git a/src/main/java/org/ntlab/citrusserver/repositories/PublicBookManager.java b/src/main/java/org/ntlab/citrusserver/repositories/PublicBookManager.java index 907e5ee..bde074a 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/PublicBookManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/PublicBookManager.java @@ -11,7 +11,8 @@ @Repository public class PublicBookManager implements IBookListener{ - private final HashMap> publicBooks = new HashMap<>(); + private final HashMap> publicBooks = new HashMap<>(); private final FavoriteManager favoriteManager; @@ -28,6 +29,8 @@ return books; } + + public ArrayList getAllPublicBooks(int sortBy){ return sort(getAllPublicBooks(), sortBy); } @@ -97,7 +100,9 @@ @Override public void bookDeleted(Account account, Book book) { - + if(publicBooks.containsKey(account.getId())){ + publicBooks.get(account.getId()).remove(book); + } } private ArrayList sort(ArrayList books, int sortMode){ diff --git a/src/main/java/org/ntlab/citrusserver/repositories/ScheduleManager.java b/src/main/java/org/ntlab/citrusserver/repositories/ScheduleManager.java index 7f6718d..d3d9330 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/ScheduleManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/ScheduleManager.java @@ -9,16 +9,17 @@ import java.util.HashMap; @Repository -public class ScheduleManager implements IBookListener { +public class ScheduleManager implements IAccountListener, IBookListener{ private final BookManager bookManager; private final HashMap nextScheduleId = new HashMap<>(); @Autowired - public ScheduleManager(BookManager bookManager) { + public ScheduleManager(AccountManager accountManager, BookManager bookManager) { this.bookManager = bookManager; this.bookManager.addListener(this); + accountManager.addListener(this); this.addSchedule("fish", 2024, 5, 28, "cinema", "10;00", "12:00", 0); this.addSchedule("fish", 2024, 5, 28, "test", "15;00", "18:00", 1); this.addSchedule("bird", 2024, 5, 28, "cinema", "10;00", "12:00", 0); @@ -155,4 +156,9 @@ } } } + + @Override + public void accountDeleted(Account account) { + deleteSchedules(account.getId()); + } } diff --git a/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java b/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java index db1a1df..a2918e0 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java @@ -1,5 +1,6 @@ package org.ntlab.citrusserver.repositories; +import org.ntlab.citrusserver.entities.Account; import org.ntlab.citrusserver.entities.Todo; import org.springframework.stereotype.Repository; @@ -7,7 +8,7 @@ @Repository -public class TodoManager { +public class TodoManager implements IAccountListener { /** * todoをすべて管理します @@ -27,8 +28,9 @@ private final BookManager bookManager; - public TodoManager(BookManager bookManager) { + public TodoManager(AccountManager accountManager, BookManager bookManager) { this.bookManager = bookManager; + accountManager.addListener(this); String[][] accounts = {{"fish", "abc", "def"}, {"bird", "abc", "xyz"}}; createTodo(accounts[0][0], 1, 2024, 5, 28, "ダミーtodo1"); createTodo(accounts[1][0], 1, 2024, 5, 28, "ダミーtodo2"); @@ -358,4 +360,9 @@ todos.remove(accountId); } + @Override + public void accountDeleted(Account account) { + deleteAllTodosByAccountId(account.getId()); + } + } diff --git a/src/main/java/org/ntlab/citrusserver/resources/AccountsRest.java b/src/main/java/org/ntlab/citrusserver/resources/AccountsRest.java index 6eae3f8..df14b1b 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/AccountsRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/AccountsRest.java @@ -1,7 +1,7 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import org.ntlab.citrusserver.entities.Account; import org.ntlab.citrusserver.repositories.*; import org.springframework.beans.factory.annotation.Autowired; @@ -17,17 +17,11 @@ public class AccountsRest { private final AccountManager accountManager; //finalは書き換えられない - private final BookManager bookManager; - private final TodoManager todoManager; - private final ScheduleManager scheduleManager; private final FavoriteManager favoriteManager; @Autowired//springbootの決まり - public AccountsRest(AccountManager am, BookManager bm, TodoManager tm, ScheduleManager sm, FavoriteManager favoriteManager) { + public AccountsRest(AccountManager am, FavoriteManager favoriteManager) { accountManager = am; - bookManager = bm; - todoManager = tm; - scheduleManager = sm; this.favoriteManager = favoriteManager; } @@ -77,11 +71,8 @@ @QueryParam("token") String token, @QueryParam("password")String password) { if(accountManager.checkToken(accountId, token)) { - bookManager.deleteAllBooks(accountId); - todoManager.deleteAllTodosByAccountId(accountId); - scheduleManager.deleteSchedules(accountId); - favoriteManager.removeFavoriteById(accountId); accountManager.deleteAccount(accountId, token, password); + favoriteManager.removeFavoriteById(accountId); return; } //404 @@ -95,7 +86,6 @@ } - //指定されたIDのパスワードを変更する (PUT) @Path("/{account_id}/password") @PUT diff --git a/src/main/java/org/ntlab/citrusserver/resources/BooksRest.java b/src/main/java/org/ntlab/citrusserver/resources/BooksRest.java index 27ef254..2fd6a5c 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/BooksRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/BooksRest.java @@ -1,8 +1,8 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import org.ntlab.citrusserver.entities.Book; import org.ntlab.citrusserver.repositories.AccountManager; import org.ntlab.citrusserver.repositories.BookManager; @@ -67,7 +67,9 @@ public Book getBook(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @QueryParam("token") String token){ accountCheck(account_id); - tokenCheck(account_id, token); + if (!bookManager.getPublicity(account_id, book_id)){ + tokenCheck(account_id, token); + } return bookManager.getBook(account_id, book_id); } /// 本の削除 diff --git a/src/main/java/org/ntlab/citrusserver/resources/FavoritedRest.java b/src/main/java/org/ntlab/citrusserver/resources/FavoritedRest.java index 9c5714c..28428b3 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/FavoritedRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/FavoritedRest.java @@ -1,9 +1,11 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + import org.ntlab.citrusserver.repositories.AccountManager; +import org.ntlab.citrusserver.repositories.BookManager; import org.ntlab.citrusserver.repositories.FavoriteManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -14,13 +16,16 @@ @Component public class FavoritedRest { + private final BookManager bookManager; private FavoriteManager favoriteManager; private final AccountManager accountManager; + @Autowired - public FavoritedRest(FavoriteManager favoriteManager, AccountManager accountManager){ + public FavoritedRest(FavoriteManager favoriteManager, AccountManager accountManager, BookManager bookManager){ this.favoriteManager = favoriteManager; this.accountManager = accountManager; + this.bookManager = bookManager; } @Path("/{account_id}/books/{book_id}/favorited") @GET @@ -36,25 +41,38 @@ @PUT @Produces(MediaType.APPLICATION_FORM_URLENCODED) public void putFavorited(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("other_account_id") String other_account_id, @FormParam("token") String token){ - if(accountManager.checkToken(other_account_id,token)) { - favoriteManager.putFavorited(account_id, book_id, other_account_id); - favoriteManager.putFavorites(other_account_id, account_id, book_id);//変更点(要検討) - }else{ - var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗"); - throw new WebApplicationException(response.build()); + if(accountManager.getAccount(account_id) != null) { + if(accountManager.getAccount(other_account_id) != null){ + if (accountManager.checkToken(other_account_id, token)) { + if (bookManager.getBook(account_id, book_id) != null) { + favoriteManager.putFavorited(account_id, book_id, other_account_id); + favoriteManager.putFavorites(other_account_id, account_id, book_id);//変更点(要検討) + } else { + var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗"); + throw new WebApplicationException(response.build()); + } + } + } } + } @Path("/{account_id}/books/{book_id}/favorited/{other_account_id}") @DELETE @Produces(MediaType.APPLICATION_FORM_URLENCODED) public void removeFavorited(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("other_account_id") String other_account_id, @QueryParam("token") String token){ - if(accountManager.checkToken(other_account_id,token)) { - favoriteManager.removeFavorited(account_id, book_id, other_account_id); - favoriteManager.removeFavorites(other_account_id, account_id, book_id);//変更点(要検討) - }else{ - var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗"); - throw new WebApplicationException(response.build()); + if(accountManager.getAccount(account_id) != null){ + if(accountManager.getAccount(other_account_id) != null){ + if(accountManager.checkToken(other_account_id,token)) { + if(bookManager.getBook(account_id,book_id) != null){ + favoriteManager.removeFavorited(account_id, book_id, other_account_id); + favoriteManager.removeFavorites(other_account_id, account_id, book_id);//変更点(要検討) + }else{ + var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗"); + throw new WebApplicationException(response.build()); + } + } + } } } } diff --git a/src/main/java/org/ntlab/citrusserver/resources/FavoritesRest.java b/src/main/java/org/ntlab/citrusserver/resources/FavoritesRest.java index c90074a..43d30db 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/FavoritesRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/FavoritesRest.java @@ -1,9 +1,9 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import org.ntlab.citrusserver.repositories.AccountManager; import org.ntlab.citrusserver.repositories.FavoriteManager; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/ntlab/citrusserver/resources/HelloWorldRest.java b/src/main/java/org/ntlab/citrusserver/resources/HelloWorldRest.java index d612750..2e97c7f 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/HelloWorldRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/HelloWorldRest.java @@ -1,7 +1,7 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import org.springframework.stereotype.Component; @Path("/helloworld") diff --git a/src/main/java/org/ntlab/citrusserver/resources/PublicBooksRest.java b/src/main/java/org/ntlab/citrusserver/resources/PublicBooksRest.java index 192022f..4820154 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/PublicBooksRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/PublicBooksRest.java @@ -1,7 +1,7 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import org.ntlab.citrusserver.entities.Book; import org.ntlab.citrusserver.repositories.PublicBookManager; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/ntlab/citrusserver/resources/ScheduleRest.java b/src/main/java/org/ntlab/citrusserver/resources/ScheduleRest.java index 5d08c8d..f880c8a 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/ScheduleRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/ScheduleRest.java @@ -1,11 +1,11 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.core.Response; +import javax.ws.rs.core.Response; import org.ntlab.citrusserver.entities.Schedule; import org.ntlab.citrusserver.repositories.AccountManager; import org.ntlab.citrusserver.repositories.ScheduleManager; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/src/main/java/org/ntlab/citrusserver/resources/TodoRest.java b/src/main/java/org/ntlab/citrusserver/resources/TodoRest.java index 22c1f7d..50bdee9 100644 --- a/src/main/java/org/ntlab/citrusserver/resources/TodoRest.java +++ b/src/main/java/org/ntlab/citrusserver/resources/TodoRest.java @@ -1,11 +1,12 @@ package org.ntlab.citrusserver.resources; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import org.apache.coyote.http11.upgrade.UpgradeServletOutputStream; import org.ntlab.citrusserver.entities.Todo; import org.ntlab.citrusserver.repositories.AccountManager; +import org.ntlab.citrusserver.repositories.BookManager; import org.ntlab.citrusserver.repositories.TodoManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -18,11 +19,13 @@ private final TodoManager todoManager; private final AccountManager accountManager; + private final BookManager bookManager; @Autowired - public TodoRest(TodoManager todoManager, AccountManager accountManager) { + public TodoRest(TodoManager todoManager, AccountManager accountManager, BookManager bookManager) { this.todoManager = todoManager; this.accountManager = accountManager; + this.bookManager = bookManager; } //test用 @@ -39,7 +42,7 @@ @GET @Produces(MediaType.APPLICATION_JSON) public HashMap>>> getAllTodos(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @QueryParam("token") String token) { - if (accountManager.checkToken(account_id, token)) { + if (accountManager.checkToken(account_id, token) || bookManager.getPublicity(account_id, book_id)) { return todoManager.getAllTodos(account_id, book_id); } return null; @@ -50,7 +53,7 @@ @GET @Produces(MediaType.APPLICATION_JSON) public HashMap> getTodosByMonth(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @QueryParam("token") String token) { - if (accountManager.checkToken(account_id, token)) { + if (accountManager.checkToken(account_id, token) || bookManager.getPublicity(account_id, book_id)) { return todoManager.getTodosByMonth(account_id, book_id, year, month); } return null; @@ -61,7 +64,7 @@ @GET @Produces(MediaType.APPLICATION_JSON) public HashMap getTodosByDay(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @QueryParam("token") String token) { - if (accountManager.checkToken(account_id, token)) { + if (accountManager.checkToken(account_id, token) || bookManager.getPublicity(account_id, book_id)) { return todoManager.getTodosByDay(account_id, book_id, year, month, day); } return null; @@ -72,7 +75,7 @@ @GET @Produces(MediaType.APPLICATION_JSON) public Todo getTodoById(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @PathParam("todo_id") Integer todo_id, @QueryParam("token") String token) { - if (accountManager.checkToken(account_id, token)) { + if (accountManager.checkToken(account_id, token) || bookManager.getPublicity(account_id, book_id)) { Todo todo = todoManager.getTodoById(account_id, book_id, year, month, day, todo_id); return todo; }