Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
13 changes: 11 additions & 2 deletions .github/workflows/develop-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ on:
push:
branches:
- main
- 'feat/**'
- 'fix/**'
pull_request:
types: [ opened, reopened, edited, synchronize ]
jobs:
Expand Down Expand Up @@ -34,6 +32,17 @@ jobs:
echo "${{ secrets.ENV_DEV }}" > .env.test
shell: bash

- name: touch dev data.sql
run: |
touch src/main/resources/sql/data.sql
echo "${{ secrets.DATA_SQL }}" > src/main/resources/sql/data.sql
shell: bash
- name: touch test data.sql
run: |
touch src/test/resources/sql/data.sql
echo "${{ secrets.TEST_DATA_SQL }}" > src/test/resources/sql/data.sql
shell: bash

- name: Build and analyze
run: ./gradlew build

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
@RequiredArgsConstructor
public class OidcNonceService {

private final static String NONCE_CLAIM_KEY = "nonce";
private static final String NONCE_CLAIM_KEY = "nonce";
private final OAuthTokenRepository oAuthTokenRepository;

public void checkNonceAndSave(final SocialProvider provider, final DecodedJWT decodedJWT) {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/runimo/runimo/common/scale/Distance.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@ public class Distance implements Serializable {
public Distance(Long amount) {
this.amount = amount;
}

public Long getAmount() {
return amount;
}
}
2 changes: 2 additions & 0 deletions src/main/java/org/runimo/runimo/common/scale/Pace.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.runimo.runimo.common.scale;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
Expand All @@ -12,6 +13,7 @@
public class Pace implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Column(name = "pace_in_milli_seconds")
private Long paceInMilliSeconds;

public Pace(Long paceInMilliSeconds) {
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/org/runimo/runimo/item/domain/Egg.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.runimo.runimo.item.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Egg extends Item {
@Column(name = "egg_type")
@Enumerated(EnumType.STRING)
private EggType eggType;
@Column(name = "hatch_require_amount")
private Long hatchRequireAmount;

@Builder
public Egg(String itemCode, String name, String description, String imgUrl, EggType eggType, Long hatchRequireAmount) {
super(itemCode, name, description, imgUrl, ItemType.USABLE);
this.eggType = eggType;
this.hatchRequireAmount = hatchRequireAmount;
}
}
30 changes: 30 additions & 0 deletions src/main/java/org/runimo/runimo/item/domain/EggType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.runimo.runimo.item.domain;

import lombok.Getter;

import java.util.Arrays;
import java.util.List;

@Getter
public enum EggType {
MADANG("A100", "마당", 0L),
FOREST("A101", "숲", 30000L),
GRASSLAND("A102", "초원", 50000L);

private final String code;
private final String name;
private final Long requiredDistanceInMeters;


EggType(String code, String name, Long requiredDistanceInMeters) {
this.code = code;
this.name = name;
this.requiredDistanceInMeters = requiredDistanceInMeters;
}

public static List<EggType> getUnLockedEggTypes(final Long distance) {
return Arrays.stream(EggType.values())
.filter(type -> type.requiredDistanceInMeters < distance)
.toList();
}
}
21 changes: 13 additions & 8 deletions src/main/java/org/runimo/runimo/item/domain/Item.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
package org.runimo.runimo.item.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.NaturalId;
import org.runimo.runimo.common.BaseEntity;

@Table(name = "items")
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item extends BaseEntity {
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter
public abstract class Item extends BaseEntity {

@Column(name = "item_code", nullable = false, unique = true)
@NaturalId
private String itemCode;

@Column(name = "name", nullable = false)
private String name;

@Column(name = "description")
private String description;

@Column(name = "img_url")
private String imgUrl;

@Column(name = "item_type", nullable = false)
@Enumerated(EnumType.STRING)
private ItemType itemType;

@Builder
public Item(String itemCode, String name, String description, String imgUrl, ItemType itemType) {
protected Item(String itemCode, String name, String description, String imgUrl, ItemType itemType) {
this.itemCode = itemCode;
this.name = name;
this.description = description;
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/runimo/runimo/item/domain/ItemActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.runimo.runimo.common.BaseEntity;

// append only entity
@Table(name = "item_activity")
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package org.runimo.runimo.item.repository;

import org.runimo.runimo.item.domain.Egg;
import org.runimo.runimo.item.domain.EggType;
import org.runimo.runimo.item.domain.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {

@Query("select i.id from Item i")
List<Long> findAllItemIds();

@Query("select e from Egg e where e.eggType = :eggtype")
Optional<Egg> findByEggType(EggType eggtype);
}
31 changes: 31 additions & 0 deletions src/main/java/org/runimo/runimo/item/service/EggFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.runimo.runimo.item.service;

import lombok.RequiredArgsConstructor;
import org.runimo.runimo.item.domain.Egg;
import org.runimo.runimo.item.domain.EggType;
import org.springframework.stereotype.Component;

import java.util.List;

/*
* 리워드로 지급되는 알의 생성을 담당하는 클래스
* */
@Component
@RequiredArgsConstructor
public class EggFactory {

private final ItemFinder itemFinder;
private final EggTypeRandomGenerator eggTypeRandomGenerator;

public Egg createGreetingEgg() {
return itemFinder.findEggByEggType(EggType.MADANG)
.orElseThrow(RuntimeException::new);
}

// 0 ~ 1 사이의 난수를 생성하여 그에 따라 알을 생성
public Egg createEggRandomly(List<EggType> unLockedEggTypes) {
EggType selectedType = eggTypeRandomGenerator.generateRandomEggType(unLockedEggTypes);
return itemFinder.findEggByEggType(selectedType)
.orElseThrow(RuntimeException::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.runimo.runimo.item.service;

import org.runimo.runimo.item.domain.EggType;
import org.springframework.stereotype.Component;

import java.security.SecureRandom;
import java.util.List;

@Component
public class EggTypeRandomGenerator {

private final SecureRandom secureRandom = new SecureRandom();

public EggType generateRandomEggType(List<EggType> unLockedEggTypes) {
double eachEggTypeProbability = 1.0 / unLockedEggTypes.size();
double cumulatedProbability = 0.0;
double randomValue = secureRandom.nextDouble();
for (EggType eggType : unLockedEggTypes) {
cumulatedProbability += eachEggTypeProbability;
if (randomValue < cumulatedProbability) {
return eggType;
}
}
return unLockedEggTypes.getLast();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.runimo.runimo.item.service;

import lombok.RequiredArgsConstructor;
import org.runimo.runimo.item.repository.ItemActivityRepository;
import org.runimo.runimo.item.domain.ItemActivity;
import org.runimo.runimo.item.repository.ItemActivityRepository;
import org.runimo.runimo.item.service.dtos.CreateActivityCommand;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/runimo/runimo/item/service/ItemFinder.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
package org.runimo.runimo.item.service;

import lombok.RequiredArgsConstructor;
import org.runimo.runimo.item.domain.Egg;
import org.runimo.runimo.item.domain.EggType;
import org.runimo.runimo.item.domain.Item;
import org.runimo.runimo.item.repository.ItemRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Component
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ItemFinder {

private final ItemRepository itemRepository;
Expand All @@ -17,6 +21,10 @@ public Optional<Item> findById(Long itemId) {
return itemRepository.findById(itemId);
}

public Optional<Egg> findEggByEggType(EggType eggtype) {
return itemRepository.findByEggType(eggtype);
}

public Boolean isItemExist(Long itemId) {
return itemRepository.existsById(itemId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import org.runimo.runimo.item.domain.ActivityType;

public record CreateActivityCommand(
Long itemId,
Long userId,
Long quantity,
ActivityType activityType
Long itemId,
Long userId,
Long quantity,
ActivityType activityType
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.runimo.runimo.records.controller.model.RecordSaveRequest;
import org.runimo.runimo.records.controller.model.RecordUpdateRequest;
import org.runimo.runimo.records.controller.requests.RecordSaveRequest;
import org.runimo.runimo.records.controller.requests.RecordUpdateRequest;
import org.runimo.runimo.records.service.usecases.RecordCreateUsecase;
import org.runimo.runimo.records.service.usecases.RecordQueryUsecase;
import org.runimo.runimo.records.service.usecases.RecordUpdateUsecase;
import org.runimo.runimo.records.service.usecases.model.RecordCreateCommand;
import org.runimo.runimo.records.service.usecases.model.RecordDetailViewResponse;
import org.runimo.runimo.records.service.usecases.model.RecordSaveResponse;
import org.runimo.runimo.records.service.usecases.dtos.RecordCreateCommand;
import org.runimo.runimo.records.service.usecases.dtos.RecordDetailViewResponse;
import org.runimo.runimo.records.service.usecases.dtos.RecordSaveResponse;
import org.runimo.runimo.user.controller.UserId;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.runimo.runimo.records.controller.model;
package org.runimo.runimo.records.controller.requests;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.runimo.runimo.records.controller.model;
package org.runimo.runimo.records.controller.requests;


import io.swagger.v3.oas.annotations.media.Schema;
import org.runimo.runimo.records.service.usecases.model.RecordUpdateCommand;
import org.runimo.runimo.records.service.usecases.dtos.RecordUpdateCommand;

import java.time.LocalDateTime;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package org.runimo.runimo.records.domain;


import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -15,6 +14,7 @@
import java.util.Objects;
import java.util.UUID;

@Table(name = "running_records")
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
Expand All @@ -25,6 +25,7 @@ public class RunningRecord extends BaseEntity {
private LocalDateTime startedAt;
private LocalDateTime endAt;
@Embedded
@AttributeOverride(name = "amount", column = @Column(name = "total_distance"))
private Distance totalDistance;
@Embedded
private Pace averagePace;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
import org.runimo.runimo.common.scale.Pace;
import org.runimo.runimo.records.domain.RunningRecord;
import org.runimo.runimo.records.repository.RecordRepository;
import org.runimo.runimo.records.service.usecases.model.RecordCreateCommand;
import org.runimo.runimo.records.service.usecases.model.RecordSaveResponse;
import org.runimo.runimo.records.service.usecases.model.RecordUpdateCommand;
import org.runimo.runimo.records.service.usecases.dtos.RecordCreateCommand;
import org.runimo.runimo.records.service.usecases.dtos.RecordSaveResponse;
import org.runimo.runimo.records.service.usecases.dtos.RecordUpdateCommand;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

Expand Down
Loading