Skip to content

Commit

Permalink
Merge branch 'release/0.7.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
micheljung committed Sep 1, 2017
2 parents 3a8723b + d2a7902 commit 70d5cd7
Show file tree
Hide file tree
Showing 18 changed files with 184 additions and 28 deletions.
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ before_install:
install:
- git clone https://github.com/FAForever/faf-stack.git faf-stack
&& pushd faf-stack
&& git checkout 0b626dd527a8ea71a19cfa65bf855ae663f78d42
&& git checkout 024322dfef9c600f458b91baeb1b4a7326b31580
&& cp -r config.template config
&& popd
- docker-compose -f faf-stack/docker-compose.yml up -d faf-db
Expand All @@ -42,3 +42,4 @@ cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- /home/travis/build/FAForever/faf-java-api/build/cache/
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ apply plugin: 'org.springframework.boot'
apply plugin: 'propdeps'

group = 'faforever'
version = '0.6.4'
version = '0.7.0'

sourceCompatibility = 1.8
targetCompatibility = 1.8
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
import static com.faforever.api.error.ErrorCode.ACHIEVEMENT_NOT_STANDARD;

@Service
public class AchievementsService {
public class AchievementService {

private final AchievementRepository achievementRepository;
private final PlayerAchievementRepository playerAchievementRepository;

@Inject
public AchievementsService(AchievementRepository achievementRepository, PlayerAchievementRepository playerAchievementRepository) {
public AchievementService(AchievementRepository achievementRepository, PlayerAchievementRepository playerAchievementRepository) {
this.achievementRepository = achievementRepository;
this.playerAchievementRepository = playerAchievementRepository;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
package com.faforever.api.achievements;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
class AchievementUpdateRequest {

private int playerId;
private String achievementId;
private Operation operation;
private int steps;

AchievementUpdateRequest(int playerId, String achievementId, Operation operation, int steps) {
this.playerId = playerId;
this.achievementId = achievementId;
this.operation = operation;
this.steps = steps;
}

public enum Operation {
REVEAL, UNLOCK, INCREMENT, SET_STEPS_AT_LEAST
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@
public class AchievementsController {

private static final String JSON_API_MEDIA_TYPE = "application/vnd.api+json";
private final AchievementsService achievementsService;
private final AchievementService achievementService;
private AtomicInteger nextUpdateId;

@Inject
public AchievementsController(AchievementsService achievementsService) {
this.achievementsService = achievementsService;
public AchievementsController(AchievementService achievementService) {
this.achievementService = achievementService;
nextUpdateId = new AtomicInteger();
}

Expand All @@ -43,11 +43,11 @@ public JsonApiDocument update(@RequestBody AchievementUpdateRequest[] updateRequ
case REVEAL:
throw new UnsupportedOperationException("REVEAL is not yet implemented");
case UNLOCK:
return achievementsService.unlock(request.getPlayerId(), request.getAchievementId());
return achievementService.unlock(request.getPlayerId(), request.getAchievementId());
case INCREMENT:
return achievementsService.increment(request.getPlayerId(), request.getAchievementId(), request.getSteps());
return achievementService.increment(request.getPlayerId(), request.getAchievementId(), request.getSteps());
case SET_STEPS_AT_LEAST:
return achievementsService.setStepsAtLeast(request.getPlayerId(), request.getAchievementId(), request.getSteps());
return achievementService.setStepsAtLeast(request.getPlayerId(), request.getAchievementId(), request.getSteps());
default:
throw new ProgrammingError("Uncovered update type: " + request.getOperation());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public final class ApplicationProfile {

public static final String PRODUCTION = "prod";
public static final String DEVELOPMENT = "dev";
public static final String INTEGRATION_TEST = "int";

private ApplicationProfile() {
// Utility class
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/faforever/api/data/domain/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class Event {
private String imageUrl;
private Type type;

// Set by AchievementLocalizationListener
// Set by EventLocalizationListener
private String name;

@Id
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/com/faforever/api/data/domain/PlayerEvent.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.faforever.api.data.domain;

import com.yahoo.elide.annotation.Exclude;
import com.yahoo.elide.annotation.Include;
import lombok.Setter;

Expand All @@ -17,24 +18,31 @@
@Setter
public class PlayerEvent extends AbstractEntity {

private int playerId;
private Player player;
private Event event;
private int count;
private int currentCount;

@OneToOne
@JoinColumn(name = "player_id")
@JoinColumn(name = "player_id", insertable = false, updatable = false)
public Player getPlayer() {
return player;
}

@Exclude
@Column(name = "player_id")
public int getPlayerId() {
return playerId;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "event_id", updatable = false, insertable = false)
public Event getEvent() {
return event;
}

@Column(name = "count")
public int getCount() {
return count;
public int getCurrentCount() {
return currentCount;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.Objects;

@Component
@Profile(ApplicationProfile.PRODUCTION)
@Profile("!" + ApplicationProfile.INTEGRATION_TEST)
public class SchemaVersionVerifier implements PriorityOrdered {

private static final String DB_COMPATIBILITY_VERSION = "43";
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/faforever/api/event/EventRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.faforever.api.event;

import com.faforever.api.data.domain.Event;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EventRepository extends JpaRepository<Event, String> {

}
18 changes: 18 additions & 0 deletions src/main/java/com/faforever/api/event/EventUpdateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.faforever.api.event;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
class EventUpdateRequest {

private int playerId;
private String eventId;
private int count;

}
53 changes: 53 additions & 0 deletions src/main/java/com/faforever/api/event/EventsController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.faforever.api.event;

import com.faforever.api.security.OAuthScope;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
import com.yahoo.elide.jsonapi.models.Data;
import com.yahoo.elide.jsonapi.models.JsonApiDocument;
import com.yahoo.elide.jsonapi.models.Resource;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.inject.Inject;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

@RestController
@RequestMapping(path = "/events")
public class EventsController {

private static final String JSON_API_MEDIA_TYPE = "application/vnd.api+json";
private final EventsService eventsService;
private AtomicInteger nextUpdateId;

@Inject
public EventsController(EventsService eventsService) {
this.eventsService = eventsService;
nextUpdateId = new AtomicInteger();
}

@ApiOperation(value = "Updates the state and progress of one or multiple events.")
@PreAuthorize("#oauth2.hasScope('" + OAuthScope._WRITE_EVENTS + "')")
@RequestMapping(value = "/update", method = RequestMethod.PATCH, produces = JSON_API_MEDIA_TYPE)
public JsonApiDocument update(@RequestBody EventUpdateRequest[] updateRequests) {
return new JsonApiDocument(new Data<>(Arrays.stream(updateRequests)
.map(request -> eventsService.increment(request.getPlayerId(), request.getEventId(), request.getCount()))
.map(this::toResource)
.collect(Collectors.toList())));
}

private Resource toResource(UpdatedEventResponse updatedEventResponse) {
Builder<String, Object> attributesBuilder = ImmutableMap.<String, Object>builder()
.put("eventId", updatedEventResponse.getEventId())
.put("currentCount", updatedEventResponse.getCurrentCount());

return new Resource("updatedEvent", String.valueOf(nextUpdateId.getAndIncrement()),
attributesBuilder.build(), null, null, null);
}
}
44 changes: 44 additions & 0 deletions src/main/java/com/faforever/api/event/EventsService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.faforever.api.event;

import com.faforever.api.data.domain.Event;
import com.faforever.api.data.domain.PlayerEvent;
import com.google.common.base.MoreObjects;
import org.springframework.stereotype.Service;

import javax.inject.Inject;
import java.util.function.BiFunction;

@Service
public class EventsService {

private final EventRepository eventRepository;
private final PlayerEventRepository playerEventRepository;

@Inject
public EventsService(EventRepository eventRepository, PlayerEventRepository playerEventRepository) {
this.eventRepository = eventRepository;
this.playerEventRepository = playerEventRepository;
}

UpdatedEventResponse increment(int playerId, String eventId, int steps) {
BiFunction<Integer, Integer, Integer> stepsFunction = (currentSteps, newSteps) -> currentSteps + newSteps;
Event event = eventRepository.getOne(eventId);

PlayerEvent playerEvent = getOrCreatePlayerEvent(playerId, event);

int currentSteps1 = MoreObjects.firstNonNull(playerEvent.getCurrentCount(), 0);
int newCurrentCount = stepsFunction.apply(currentSteps1, steps);

playerEvent.setCurrentCount(newCurrentCount);
playerEventRepository.save(playerEvent);

return new UpdatedEventResponse(eventId, newCurrentCount);
}

private PlayerEvent getOrCreatePlayerEvent(int playerId, Event event) {
return playerEventRepository.findOneByEventIdAndPlayerId(event.getId(), playerId)
.orElseGet(() -> new PlayerEvent()
.setPlayerId(playerId)
.setEvent(event));
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/faforever/api/event/PlayerEventRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.faforever.api.event;

import com.faforever.api.data.domain.PlayerEvent;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface PlayerEventRepository extends JpaRepository<PlayerEvent, String> {

Optional<PlayerEvent> findOneByEventIdAndPlayerId(String eventId, int playerId);
}
11 changes: 11 additions & 0 deletions src/main/java/com/faforever/api/event/UpdatedEventResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.faforever.api.event;

import lombok.Data;

@Data
class UpdatedEventResponse {

private final String eventId;
private final Integer currentCount;

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class AchievementsServiceTest {
public class EventsServiceTest {

private static final int PLAYER_ID = 1;
@Rule
public ExpectedException expectedException = ExpectedException.none();
private AchievementsService instance;
private AchievementService instance;
@Mock
private AchievementRepository achievementRepository;
@Mock
Expand All @@ -49,7 +49,7 @@ private static PlayerAchievement createPlayerAchievement(Integer currentSteps, A

@Before
public void setUp() throws Exception {
instance = new AchievementsService(achievementRepository, playerAchievementRepository);
instance = new AchievementService(achievementRepository, playerAchievementRepository);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@


@RunWith(MockitoJUnitRunner.class)
public class PlayerAchievementsControllerTest {
public class PlayerEventsControllerTest {

private AchievementsController instance;

@Mock
private AchievementsService achievementService;
private AchievementService achievementService;

@Before
public void setUp() throws Exception {
Expand Down
2 changes: 2 additions & 0 deletions src/test/resources/config/application.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
spring:
profiles:
include: int
datasource:
url: jdbc:h2:mem:faf
username: root
Expand Down

0 comments on commit 70d5cd7

Please sign in to comment.