Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
a4fc343
Add `EnrichmentNotFoundException`
alexanderkarpetc Apr 17, 2018
95ff835
Add `EventEnrichments`
alexanderkarpetc Apr 17, 2018
3d9e07e
Add util class `Projections`
alexanderkarpetc Apr 17, 2018
54a69b8
Rework proto files according to UI conception
alexanderkarpetc Apr 18, 2018
b096317
Create structure for projections
alexanderkarpetc Apr 18, 2018
5f57ade
Handle some events in projections
alexanderkarpetc Apr 18, 2018
fd23889
Add subscriber for calendar view
alexanderkarpetc Apr 18, 2018
6e30e6b
Add handling for addition and removing dish from order
alexanderkarpetc Apr 18, 2018
029cec1
Add handling for addition and updating vendors
alexanderkarpetc Apr 19, 2018
624709f
Remove unnecessary subscribers in projections
alexanderkarpetc Apr 19, 2018
4f6b5e2
Add subscribers for PO details
alexanderkarpetc Apr 19, 2018
b0a2418
Add subscribers for `PurchaseOrderDetailsByUserViewProjection`
alexanderkarpetc Apr 19, 2018
a0c0854
Set structure for Enrichments
alexanderkarpetc Apr 19, 2018
95a7e01
Change menu now holds dates with a status instead of a date range
alexanderkarpetc Apr 19, 2018
b0a7e38
Extract methods that work with dates to projections
alexanderkarpetc Apr 19, 2018
aa62e76
Rework subscriber on `MenuImported` event
alexanderkarpetc Apr 19, 2018
09c61ae
Add `Projections` class test
alexanderkarpetc Apr 20, 2018
a3b865b
Add event factory for projection tests
alexanderkarpetc Apr 20, 2018
ab549b4
Add tests for `POListView`
alexanderkarpetc Apr 20, 2018
0d1a803
Add enrichments.proto for purchase order
alexanderkarpetc Apr 20, 2018
8738683
Add context and enrichment in monthly spendings
alexanderkarpetc Apr 20, 2018
8da61d1
Use new java 8 approach to get dates from a date range
alexanderkarpetc Apr 20, 2018
c542924
Add tests for order by user projection
alexanderkarpetc Apr 20, 2018
154d7e3
Refactor PO by user view
alexanderkarpetc Apr 20, 2018
8bce763
Add identifiers for singletons
alexanderkarpetc Apr 23, 2018
e825c1e
Rework monthly spendings -> now has list of pending orders
alexanderkarpetc Apr 23, 2018
3974c75
Delete enrichments
alexanderkarpetc Apr 23, 2018
e71107c
Add projections IDs to java classes
alexanderkarpetc Apr 23, 2018
75e7e72
Add subscribes for the MonthlySpendingsReportView projection
PaulAgeyev Apr 23, 2018
70c4012
Add subscribers for `MenuListViewProjection`
alexanderkarpetc Apr 23, 2018
a42f217
Add subscriber handlers
PaulAgeyev Apr 23, 2018
917d7e1
Merge remote-tracking branch 'origin/projections' into projections
PaulAgeyev Apr 23, 2018
253c51a
Add tests for `PurchaseOrderDetailsByDishViewProjection` projection
alexanderkarpetc Apr 23, 2018
2a76551
Refactor proto model
alexanderkarpetc Apr 23, 2018
f06c373
Add tests for the `MonthlySpendingsReportViewProjection` projection
PaulAgeyev Apr 23, 2018
d8a8c1c
Merge remote-tracking branch 'origin/projections' into projections
PaulAgeyev Apr 23, 2018
252040d
Simplify event subscribers
PaulAgeyev Apr 23, 2018
923a2de
Refactor required options in model
alexanderkarpetc Apr 24, 2018
900229d
Fix required fields in proto model
alexanderkarpetc Apr 24, 2018
1470510
Rework `OrderListViewProjection` and test
alexanderkarpetc Apr 24, 2018
132754e
Add tests for `VendorListViewProjection`
alexanderkarpetc Apr 24, 2018
920dabf
Add more use cases for `PurchaseOrderByUserView`
alexanderkarpetc Apr 24, 2018
d791242
Date to disable menu now is taken from event ID
alexanderkarpetc Apr 25, 2018
8bb1b5c
Delete util methods that worked with dates
alexanderkarpetc Apr 25, 2018
59c0bf1
Add for event instances for tests
alexanderkarpetc Apr 25, 2018
e4c2668
Invalid PO now sets separate records invalid
alexanderkarpetc Apr 25, 2018
29c8072
Add `DishRemoved` event instance for tests
alexanderkarpetc Apr 25, 2018
f82c14b
Add `DishRemoved` test
alexanderkarpetc Apr 25, 2018
3feeb21
Refactor finding dish logic in `OrderListViewProjection`
alexanderkarpetc Apr 25, 2018
f05f5c6
Add tests for `DishProcessed` and `RemoveOrder`
alexanderkarpetc Apr 25, 2018
997cd24
Delete `Enricher` from `BoundedContext`
alexanderkarpetc Apr 25, 2018
a857686
Delete `MealOrderEnrichments` file`
alexanderkarpetc Apr 25, 2018
397b86e
Add tests for `PurchaseOrderDetailsByUserViewProjection`
alexanderkarpetc Apr 25, 2018
6df2cf7
Add tests for `PurchaseOrderValidationFailed` event
alexanderkarpetc Apr 25, 2018
21dcb1e
Add test for `Projections` ctor
alexanderkarpetc Apr 25, 2018
439d065
Rework subscribers and tests for monthly report
alexanderkarpetc Apr 26, 2018
1cdc943
Refactor model according to UI needs
alexanderkarpetc Apr 26, 2018
87cabf8
Reformat code
alexanderkarpetc Apr 26, 2018
98f8fc1
Add repositories and routing for projections
alexanderkarpetc Apr 27, 2018
9366214
Register all repositories in `BoundedContexts`
alexanderkarpetc Apr 27, 2018
d8b3645
Add integration tests for `FullMenuView`
alexanderkarpetc Apr 27, 2018
162f6d3
Change test values for tests
alexanderkarpetc Apr 27, 2018
26534d6
Add integration tests for projections
alexanderkarpetc May 2, 2018
e68870b
Add tests to cover invalid order
alexanderkarpetc May 2, 2018
dedfc26
Use guava iterables to search an index
alexanderkarpetc May 2, 2018
c07d099
Merge branch 'master' into projections
alexanderkarpetc May 4, 2018
de8b7f7
Set all subscribers public scope
alexanderkarpetc May 7, 2018
bce037b
Set `Projections` methods public scope
alexanderkarpetc May 7, 2018
4429a95
Set id -> required for all non-singleton projections
alexanderkarpetc May 7, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,15 @@
import javaclasses.mealorder.c.order.OrderRepository;
import javaclasses.mealorder.c.po.PurchaseOrderRepository;
import javaclasses.mealorder.c.vendor.VendorRepository;
import javaclasses.mealorder.q.repository.FullMenuViewRepository;
import javaclasses.mealorder.q.repository.MenuCalendarViewRepository;
import javaclasses.mealorder.q.repository.MenuListViewRepository;
import javaclasses.mealorder.q.repository.MonthlySpendingsReportViewRepository;
import javaclasses.mealorder.q.repository.OrderListViewRepository;
import javaclasses.mealorder.q.repository.PurchaseOrderDetailsByDishViewRepository;
import javaclasses.mealorder.q.repository.PurchaseOrderDetailsByUserViewRepository;
import javaclasses.mealorder.q.repository.PurchaseOrderItemViewRepository;
import javaclasses.mealorder.q.repository.VendorListViewRepository;

import static com.google.common.base.Preconditions.checkNotNull;

Expand DownExpand Up@@ -71,16 +80,36 @@ public static BoundedContext create() {
*/
public static BoundedContext create(StorageFactory storageFactory) {
checkNotNull(storageFactory);
final VendorRepository vendorRepository = VendorRepository.getRepository();

final VendorRepository vendorRepository = VendorRepository.createRepository();
final OrderRepository orderRepository = new OrderRepository();
final PurchaseOrderRepository purchaseOrderRepository = new PurchaseOrderRepository();

final FullMenuViewRepository fullMenuViewRepository = new FullMenuViewRepository();
final MenuCalendarViewRepository menuCalendarViewRepository = new MenuCalendarViewRepository();
final MenuListViewRepository menuListViewRepository = new MenuListViewRepository();
final MonthlySpendingsReportViewRepository monthlySpendingsReportViewRepository = new MonthlySpendingsReportViewRepository();
final OrderListViewRepository orderListViewRepository = new OrderListViewRepository();
final PurchaseOrderDetailsByDishViewRepository poDetailsByDishViewRepository = new PurchaseOrderDetailsByDishViewRepository();
final PurchaseOrderDetailsByUserViewRepository poDetailsByUserViewRepository = new PurchaseOrderDetailsByUserViewRepository();
final PurchaseOrderItemViewRepository poItemViewRepository = new PurchaseOrderItemViewRepository();
final VendorListViewRepository vendorListViewRepository = new VendorListViewRepository();

final BoundedContext boundedContext = createBoundedContext(storageFactory);

boundedContext.register(vendorRepository);
boundedContext.register(orderRepository);
boundedContext.register(purchaseOrderRepository);

boundedContext.register(fullMenuViewRepository);
boundedContext.register(menuCalendarViewRepository);
boundedContext.register(menuListViewRepository);
boundedContext.register(monthlySpendingsReportViewRepository);
boundedContext.register(orderListViewRepository);
boundedContext.register(poDetailsByDishViewRepository);
boundedContext.register(poDetailsByUserViewRepository);
boundedContext.register(poItemViewRepository);
boundedContext.register(vendorListViewRepository);

return boundedContext;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,6 +99,7 @@ OrderCreated handle(CreateOrder cmd) throws OrderAlreadyExists, MenuNotAvailable
final OrderCreated result = OrderCreated.newBuilder()
.setOrderId(orderId)
.setMenuId(menuId)
.setWhenCreated(getCurrentTime())
.build();
return result;
}
Expand All@@ -125,6 +126,7 @@ DishAddedToOrder handle(AddDishToOrder cmd) throws DishVendorMismatch,
final DishAddedToOrder result = DishAddedToOrder.newBuilder()
.setOrderId(orderId)
.setDish(dish)
.setWhenAdded(getCurrentTime())
.build();
return result;
}
Expand All@@ -145,6 +147,7 @@ DishRemovedFromOrder handle(RemoveDishFromOrder cmd) throws CannotRemoveMissingD
DishRemovedFromOrder result = DishRemovedFromOrder.newBuilder()
.setOrderId(orderId)
.setDish(dish)
.setWhenRemoved(getCurrentTime())
.build();
return result;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -221,7 +221,7 @@ void purchaseOrderCanceled(PurchaseOrderCanceled event) {
}

@Apply
void purchaseOrderCanceled(PurchaseOrderDelivered event) {
void purchaseOrderDelivered(PurchaseOrderDelivered event) {
getBuilder().setStatus(DELIVERED);
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -221,7 +221,7 @@ static PurchaseOrderDelivered createPOMarkedAsDeliveredEvent(MarkPurchaseOrderAs
.newBuilder()
.setId(id)
.setWhoMarkedAsDelivered(whoMarksAsDelivered)
.setWhenDelievered(getCurrentTime())
.setWhenDelivered(getCurrentTime())
.build();

return result;
Expand DownExpand Up@@ -277,6 +277,7 @@ static PurchaseOrderSent createPOSentEvent(PurchaseOrder purchaseOrder,
.setPurchaseOrder(purchaseOrder)
.setSenderEmail(senderEmail)
.setVendorEmail(vendorEmail)
.setWhenSent(getCurrentTime())
.build();
return result;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,26 +25,20 @@
import io.spine.server.command.Assign;
import javaclasses.mealorder.Menu;
import javaclasses.mealorder.MenuDateRange;
import javaclasses.mealorder.MenuId;
import javaclasses.mealorder.Vendor;
import javaclasses.mealorder.VendorChange;
import javaclasses.mealorder.VendorId;
import javaclasses.mealorder.VendorName;
import javaclasses.mealorder.VendorVBuilder;
import javaclasses.mealorder.c.command.AddVendor;
import javaclasses.mealorder.c.command.ImportMenu;
import javaclasses.mealorder.c.command.SetDateRangeForMenu;
import javaclasses.mealorder.c.command.UpdateVendor;
import javaclasses.mealorder.c.event.DateRangeForMenuSet;
import javaclasses.mealorder.c.event.MenuImported;
import javaclasses.mealorder.c.event.VendorAdded;
import javaclasses.mealorder.c.event.VendorUpdated;
import javaclasses.mealorder.c.rejection.CannotSetDateRange;
import javaclasses.mealorder.c.rejection.VendorAlreadyExists;

import java.util.List;
import java.util.stream.IntStream;

import static io.spine.time.Time.getCurrentTime;
import static javaclasses.mealorder.c.vendor.VendorAggregateRejections.cannotSetDateRange;
import static javaclasses.mealorder.c.vendor.VendorAggregateRejections.vendorAlreadyExists;
Expand DownExpand Up@@ -79,6 +73,7 @@ VendorAdded handle(AddVendor cmd) throws VendorAlreadyExists {
.setEmail(cmd.getEmail())
.addAllPhoneNumber(cmd.getPhoneNumberList())
.setPoDailyDeadline(cmd.getPoDailyDeadline())
.setWhenAdded(getCurrentTime())
.build();
return vendorAdded;
}
Expand All@@ -95,36 +90,23 @@ VendorUpdated handle(UpdateVendor cmd) {
}

@Assign
MenuImported handle(ImportMenu cmd) {
MenuImported handle(ImportMenu cmd) throws CannotSetDateRange {
final MenuDateRange range = cmd.getMenuDateRange();
final Vendor vendor = getState();
if (!isValidDateRange(range) || isThereMenuForThisDateRange(vendor, range)) {
throw cannotSetDateRange(cmd);
}
final MenuImported menuImported = MenuImported.newBuilder()
.setVendorId(cmd.getVendorId())
.setMenuId(cmd.getMenuId())
.setWhoImported(cmd.getUserId())
.setWhenImported(getCurrentTime())
.addAllDish(cmd.getDishList())
.setMenuDateRange(cmd.getMenuDateRange())
.build();
return menuImported;
}

@Assign
DateRangeForMenuSet handle(SetDateRangeForMenu cmd) throws CannotSetDateRange {
final MenuDateRange range = cmd.getMenuDateRange();
final Vendor vendor = getState();

if (!isValidDateRange(range) || isThereMenuForThisDateRange(vendor, range)) {
throw cannotSetDateRange(cmd);
}
final DateRangeForMenuSet dateRangeForMenuSet =
DateRangeForMenuSet.newBuilder()
.setVendorId(cmd.getVendorId())
.setMenuId(cmd.getMenuId())
.setWhoSet(cmd.getUserId())
.setWhenSet(getCurrentTime())
.setMenuDateRange(cmd.getMenuDateRange())
.build();
return dateRangeForMenuSet;
}

@Apply
void vendorAdded(VendorAdded event) {
getBuilder().setId(event.getVendorId())
Expand All@@ -149,24 +131,7 @@ void menuImported(MenuImported event) {
getBuilder().addMenu(Menu.newBuilder()
.setId(event.getMenuId())
.addAllDish(event.getDishList())
.setMenuDateRange(event.getMenuDateRange())
.build());
}

@Apply
void dateRangeForMenuSet(DateRangeForMenuSet event) {
final List<Menu> menus = getBuilder().getMenu();
final MenuId menuId = event.getMenuId();

final int index = IntStream.range(0, menus.size())
.filter(i -> menus.get(i)
.getId()
.equals(menuId))
.findFirst()
.getAsInt();

final Menu menu = menus.get(index);
getBuilder().setMenu(index, Menu.newBuilder(menu)
.setMenuDateRange(event.getMenuDateRange())
.build());
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@
package javaclasses.mealorder.c.vendor;

import javaclasses.mealorder.c.command.AddVendor;
import javaclasses.mealorder.c.command.SetDateRangeForMenu;
import javaclasses.mealorder.c.command.ImportMenu;
import javaclasses.mealorder.c.rejection.CannotSetDateRange;
import javaclasses.mealorder.c.rejection.VendorAlreadyExists;

Expand DownExpand Up@@ -62,7 +62,7 @@ static VendorAlreadyExists vendorAlreadyExists(AddVendor cmd) throws
* @param cmd the {@code SetDateRangeForMenu} command which thrown the rejection
* @throws CannotSetDateRange the rejection to throw
*/
static CannotSetDateRange cannotSetDateRange(SetDateRangeForMenu cmd) throws
static CannotSetDateRange cannotSetDateRange(ImportMenu cmd) throws
CannotSetDateRange {
checkNotNull(cmd);
final CannotSetDateRange cannotSetDateRange = new CannotSetDateRange(cmd.getVendorId(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,8 +40,12 @@ public static VendorRepository getRepository() {
return VendorRepositorySingleton.INSTANCE.value;
}

public static VendorRepository createRepository() {
VendorRepositorySingleton.INSTANCE.value = new VendorRepository();
return VendorRepositorySingleton.INSTANCE.value;
}
private enum VendorRepositorySingleton {
INSTANCE;
public final VendorRepository value = new VendorRepository();
public VendorRepository value = new VendorRepository();
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2018, TeamDev Ltd. All rights reserved.
*
* Redistribution and use in source and/or binary forms, with or without
* modification, must retain the above copyright notice and the following
* disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package javaclasses.mealorder.q;

import io.spine.core.Subscribe;
import io.spine.server.projection.Projection;
import javaclasses.mealorder.MenuId;
import javaclasses.mealorder.VendorName;
import javaclasses.mealorder.c.event.MenuImported;
import javaclasses.mealorder.q.projection.FullMenuView;
import javaclasses.mealorder.q.projection.FullMenuViewVBuilder;

import java.util.List;

import static javaclasses.mealorder.q.Projections.getAllDishesByCategories;

public class FullMenuViewProjection extends Projection<MenuId, FullMenuView, FullMenuViewVBuilder> {

/**
* Creates a new instance.
*
* @param id the ID for the new instance
* @throws IllegalArgumentException if the ID is not of one of the supported types
*/
public FullMenuViewProjection(MenuId id) {
super(id);
}

@Subscribe
public void on(MenuImported event) {
final VendorName vendorName = VendorName.newBuilder()
.setValue(event.getVendorId()
.getValue())
.build();

final List<DishesByCategory> allDishesByCategories = getAllDishesByCategories(
event.getDishList());

getBuilder().addAllDishesByCategory(allDishesByCategories);
getBuilder().setVendorName(vendorName);
getBuilder().setMenuId(event.getMenuId());
getBuilder().setMenuDateRange(event.getMenuDateRange());
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
/*
* Copyright 2018, TeamDev Ltd. All rights reserved.
*
* Redistribution and use in source and/or binary forms, with or without
* modification, must retain the above copyright notice and the following
* disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package javaclasses.mealorder.q;

import io.spine.core.Subscribe;
import io.spine.server.projection.Projection;
import javaclasses.mealorder.MenuCalendarId;
import javaclasses.mealorder.c.event.MenuImported;
import javaclasses.mealorder.q.projection.MenuCalendarView;
import javaclasses.mealorder.q.projection.MenuCalendarViewVBuilder;

import java.time.LocalDate;
import java.util.List;

import static javaclasses.mealorder.q.Projections.getDatesBetween;
import static javaclasses.mealorder.q.Projections.toLocalDate;

public class MenuCalendarViewProjection extends Projection<MenuCalendarId, MenuCalendarView, MenuCalendarViewVBuilder> {

/**
* {@link MenuCalendarViewProjection} is a singleton.
*
* <p>The {@code ID} value should be the same for all JVMs
* to support work with the same projection from execution to execution.
*/
public static final MenuCalendarId ID = MenuCalendarId.newBuilder()
.setValue(
"MenuCalendarViewProjectionSingleton")
.build();

/**
* Creates a new instance.
*
* @param id the ID for the new instance
* @throws IllegalArgumentException if the ID is not of one of the supported types
*/
public MenuCalendarViewProjection(MenuCalendarId id) {
super(id);
}

@Subscribe
public void on(MenuImported event) {
final List<LocalDate> datesBetween = getDatesBetween(event.getMenuDateRange()
.getRangeStart(),
event.getMenuDateRange()
.getRangeEnd());

datesBetween.forEach(date -> {
getBuilder().addCalendarItem(MenuCalendarItem.newBuilder()
.setDate(toLocalDate(date))
.setHasMenu(true)
.build());
});
}
}
Loading