package com.example.listmaker.app.client.service;
import com.example.listmaker.app.client.App;
import com.example.listmaker.app.client.domain.Note;
import com.example.listmaker.app.client.domain.NoteList;
import com.example.listmaker.app.client.event.NoteAddedEvent;
import com.example.listmaker.app.client.event.NotesLoadedEvent;
import com.google.gwt.core.client.GWT;
import com.turbomanage.gwt.client.Display;
import com.turbomanage.gwt.client.event.ShowMessageEvent;
import com.turbomanage.gwt.client.rest.ListResponse;
import com.turbomanage.gwt.client.rest.RestApi;
import javax.ws.rs.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class NoteService
{
private static final NoteItemRestService service = GWT.create(NoteItemRestService.class);
@Path("/api/note")
public interface NoteItemRestService extends RestApi<Note> { }
public void addNote(Display display, long listId, Note item)
{
NoteList noteList = App.getNoteListService().getNoteList(listId);
// All are 0-based for consistency with GWT constants
item.listId = listId;
service.save(item, new AppCallback<Note>(display) {
@Override
public void handleSuccess(Note result) {
App.getAppModel().getAllNotes().add(0, result);
App.getEventBus().fireEvent(new ShowMessageEvent("Note saved."));
App.getEventBus().fireEvent(new NotesLoadedEvent(App.getAppModel().getAllNotes()));
App.getEventBus().fireEvent(new NoteAddedEvent(result));
}
});
}
public void editNoteItem(final Display display, long listId, Note item)
{
item.listId = listId;
service.save(item,
new AppCallback<Note>(display) {
@Override
public void handleSuccess(Note result) {
App.getAppModel().setAllNotes(null);
findNotes(display);
App.getEventBus().fireEvent(new ShowMessageEvent("Note updated."));
}
});
}
public void findNotes(Display display) {
List<Note> notes = App.getAppModel().getAllNotes();
if (notes != null) {
App.getEventBus().fireEvent(new NotesLoadedEvent(notes));
return;
}
service.listAll(new AppCallback<ListResponse<Note>>() {
@Override
public void handleSuccess(ListResponse<Note> result) {
List<Note> allNotes = result.list;
App.getAppModel().setAllNotes(allNotes);
App.getEventBus().fireEvent(new NotesLoadedEvent(allNotes));
}
});
}
public void deleteNotes(Display display, final Set<Note> notes)
{
List<Long> noteIds = new ArrayList<Long>();
for (Note note: notes) {
noteIds.add(note.id);
}
service.deleteMany(noteIds, new AppCallback<Integer>(display) {
@Override
public void handleSuccess(Integer result) {
App.getEventBus().fireEvent(new ShowMessageEvent("Notes deleted"));
List<Note> allNotes = App.getAppModel().getAllNotes();
allNotes.removeAll(notes);
App.getEventBus().fireEvent(new NotesLoadedEvent(allNotes));
}
});
}
}