diff --git a/src/main/java/io/pakland/mdas/githubstats/GithubStatsApplication.java b/src/main/java/io/pakland/mdas/githubstats/GithubStatsApplication.java index 28d44199..a0f2073c 100644 --- a/src/main/java/io/pakland/mdas/githubstats/GithubStatsApplication.java +++ b/src/main/java/io/pakland/mdas/githubstats/GithubStatsApplication.java @@ -2,8 +2,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication +@EnableJpaRepositories(basePackages = {"io.pakland.mdas.githubstats.domain.repository", "io.pakland.mdas.githubstats.infrastructure.postgres.repository"}) public class GithubStatsApplication { public static void main(String[] args) { SpringApplication.run(GithubStatsApplication.class, args); diff --git a/src/main/java/io/pakland/mdas/githubstats/application/CheckMetricsFromUserByRange.java b/src/main/java/io/pakland/mdas/githubstats/application/CheckMetricsFromUserByRange.java new file mode 100644 index 00000000..f1ca7cb8 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/application/CheckMetricsFromUserByRange.java @@ -0,0 +1,20 @@ +package io.pakland.mdas.githubstats.application; + +import io.pakland.mdas.githubstats.domain.repository.MetricRepository; +import io.pakland.mdas.githubstats.infrastructure.postgres.model.PostgresOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; +import org.springframework.stereotype.Service; + +@Service +public class CheckMetricsFromUserByRange { + private final MetricRepository metricRepository; + + protected CheckMetricsFromUserByRange(MetricRepository metricRepository) { + this.metricRepository = metricRepository; + } + + public Boolean execute(PostgresOptionRequest req) { + return metricRepository.countAggregatesFromOption(req).longValueExact() > 0; + } + +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/application/GetMetricsFromUserByRange.java b/src/main/java/io/pakland/mdas/githubstats/application/GetMetricsFromUserByRange.java new file mode 100644 index 00000000..9ef197a4 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/application/GetMetricsFromUserByRange.java @@ -0,0 +1,23 @@ +package io.pakland.mdas.githubstats.application; + +import io.pakland.mdas.githubstats.domain.Metric; +import io.pakland.mdas.githubstats.domain.repository.MetricRepository; +import io.pakland.mdas.githubstats.infrastructure.postgres.model.PostgresOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class GetMetricsFromUserByRange { + + private final MetricRepository metricRepository; + + public GetMetricsFromUserByRange(MetricRepository metricRepository) { + this.metricRepository = metricRepository; + } + + public List execute(PostgresOptionRequest request) { + return metricRepository.getAggregatesFromOption(request); + } +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/application/SaveMetrics.java b/src/main/java/io/pakland/mdas/githubstats/application/SaveMetrics.java new file mode 100644 index 00000000..63e1063b --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/application/SaveMetrics.java @@ -0,0 +1,33 @@ +package io.pakland.mdas.githubstats.application; + +import io.pakland.mdas.githubstats.domain.Metric; +import io.pakland.mdas.githubstats.domain.repository.MetricRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Service +public class SaveMetrics { + + private final MetricRepository metricRepository; + + public SaveMetrics(MetricRepository metricRepository) { + this.metricRepository = metricRepository; + } + + @Transactional + public void execute(List metrics) { + List persistedMetrics = new ArrayList<>(); + + metrics.forEach(metric-> { + Optional alreadyStoredMetric = metricRepository.getMetricUsingUniqueConstraint(metric); + alreadyStoredMetric.ifPresent(persistedMetrics::add); + }); + + metricRepository.deleteAll(persistedMetrics); + metricRepository.saveAll(metrics); + } +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/Metric.java b/src/main/java/io/pakland/mdas/githubstats/domain/Metric.java index b25221b4..844f19b3 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/Metric.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/Metric.java @@ -60,7 +60,7 @@ public class Metric { private Integer linesRemoved; @Column( - name = "to", + name = "\"to\"", columnDefinition = "date", nullable = false ) @@ -70,7 +70,7 @@ public class Metric { private YearMonth to; @Column( - name = "from", + name = "\"from\"", columnDefinition = "date", nullable = false ) diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/OptionType.java b/src/main/java/io/pakland/mdas/githubstats/domain/OptionType.java index a998d734..dfafd964 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/OptionType.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/OptionType.java @@ -1,7 +1,13 @@ package io.pakland.mdas.githubstats.domain; public enum OptionType { - ORGANIZATION, - TEAM, - USER + ORGANIZATION("organization"), + TEAM("team_slug"), + USER("user_name"); + + private final String options; + OptionType(String options) { + this.options = options; + } + public String getOption() {return options;} } diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepository.java b/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepository.java index d674c880..b0f1c618 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepository.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepository.java @@ -5,5 +5,5 @@ import org.springframework.stereotype.Repository; @Repository -public interface MetricRepository extends JpaRepository { -} \ No newline at end of file +public interface MetricRepository extends JpaRepository, MetricRepositoryCustom { +} diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepositoryCustom.java b/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepositoryCustom.java new file mode 100644 index 00000000..f290e463 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/domain/repository/MetricRepositoryCustom.java @@ -0,0 +1,18 @@ +package io.pakland.mdas.githubstats.domain.repository; + +import io.pakland.mdas.githubstats.domain.Metric; +import io.pakland.mdas.githubstats.infrastructure.postgres.model.PostgresOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; + +import java.math.BigInteger; +import java.util.List; +import java.util.Optional; + +public interface MetricRepositoryCustom { + Optional getMetricUsingUniqueConstraint(Metric metric); + + BigInteger countAggregatesFromOption(PostgresOptionRequest req); + + List getAggregatesFromOption(PostgresOptionRequest req); + +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/repository/impl/MetricRepositoryCustomImpl.java b/src/main/java/io/pakland/mdas/githubstats/domain/repository/impl/MetricRepositoryCustomImpl.java new file mode 100644 index 00000000..1bc1676d --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/domain/repository/impl/MetricRepositoryCustomImpl.java @@ -0,0 +1,73 @@ +package io.pakland.mdas.githubstats.domain.repository.impl; + +import io.pakland.mdas.githubstats.domain.Metric; +import io.pakland.mdas.githubstats.domain.repository.MetricRepositoryCustom; +import io.pakland.mdas.githubstats.infrastructure.postgres.model.PostgresOptionRequest; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.math.BigInteger; +import java.util.List; +import java.util.Optional; + +@Transactional(readOnly=true) +public class MetricRepositoryCustomImpl implements MetricRepositoryCustom { + + @PersistenceContext + EntityManager entityManager; + + @Override + @SuppressWarnings("unchecked") + public Optional getMetricUsingUniqueConstraint(Metric metric) { + return (Optional) entityManager.createNativeQuery(""" + SELECT * + FROM metric + WHERE organization = :organization + AND team_slug = :team_slug + AND user_name = :user_name + AND "from" = to_date(:from, 'YYYY-MM') + AND "to" = to_date(:to, 'YYYY-MM') + """, Metric.class) + .setParameter("organization", metric.getOrganization() ) + .setParameter("team_slug", metric.getTeamSlug() ) + .setParameter("user_name", metric.getUserName() ) + .setParameter("from", metric.getFrom().toString() ) + .setParameter("to", metric.getTo().toString() ) + .getResultStream().findFirst(); + } + + @Override + public BigInteger countAggregatesFromOption(PostgresOptionRequest req) { + + return (BigInteger) entityManager.createNativeQuery(String.format(""" + SELECT COUNT(*) + FROM metric + WHERE %s = :name + AND "from" = to_date(:from, 'YYYY-MM') + AND "to" = to_date(:to, 'YYYY-MM') + """,req.getType().getOption())) + .setParameter("name", req.getName() ) + .setParameter("from", req.getFrom().toString() ) + .setParameter("to", req.getTo().toString() ) + .getSingleResult(); + } + + @Override + @SuppressWarnings("unchecked") + public List getAggregatesFromOption(PostgresOptionRequest req) { + + return (List) entityManager.createNativeQuery(String.format(""" + SELECT * + FROM metric + WHERE %s = :name + AND "from" = to_date(:from, 'YYYY-MM') + AND "to" = to_date(:to, 'YYYY-MM') + """, req.getType().getOption()), Metric.class) + .setParameter("name", req.getName() ) + .setParameter("from", req.getFrom().toString() ) + .setParameter("to", req.getTo().toString() ) + .getResultList(); + } + +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/MainController.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/MainController.java index 21b857da..f11b88c9 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/MainController.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/MainController.java @@ -1,21 +1,20 @@ package io.pakland.mdas.githubstats.infrastructure.controller; import io.pakland.mdas.githubstats.infrastructure.github.controller.GitHubMiddleware; -import io.pakland.mdas.githubstats.infrastructure.postgres.PostgresMiddleware; +import io.pakland.mdas.githubstats.infrastructure.postgres.controller.PostgresMiddleware; import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; +import org.springframework.stereotype.Controller; +@Controller public class MainController { private final Middleware middleware; - public MainController(ShellRequest request) { - middleware = Middleware.link( - new PostgresMiddleware(request), - new GitHubMiddleware(request) - ); + public MainController(PostgresMiddleware postgresMiddleware, GitHubMiddleware gitHubMiddleware) { + middleware = Middleware.link( postgresMiddleware, gitHubMiddleware); } - public String execute() { - return middleware.execute(); + public void execute(ShellRequest request) { + middleware.execute(request); } } diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/Middleware.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/Middleware.java index 23010ee6..4bd9a4a5 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/Middleware.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/controller/Middleware.java @@ -4,14 +4,8 @@ public abstract class Middleware { - protected final ShellRequest request; - private Middleware next; - protected Middleware(ShellRequest request) { - this.request = request; - } - public static Middleware link(Middleware first, Middleware... chain) { Middleware head = first; for (Middleware nextInChain: chain) { @@ -21,12 +15,13 @@ public static Middleware link(Middleware first, Middleware... chain) { return first; } - public abstract String execute(); + public abstract String execute(ShellRequest request); + + protected void checkNext(ShellRequest request) { - protected String checkNext() { if (next == null) { - return "unknow middleware"; + return; } - return next.execute(); + next.execute(request); } -} +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubController.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubController.java index e89bc123..1e65334a 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubController.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubController.java @@ -10,13 +10,16 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; -import lombok.NoArgsConstructor; -import org.springframework.stereotype.Component; -@Component -@NoArgsConstructor +import org.springframework.stereotype.Controller; + +import javax.annotation.PostConstruct; + +@Controller public class GitHubController { + private final SaveMetrics saveMetrics; + private GitHubOptionRequest userOptionRequest; private OrganizationExternalRepository organizationRepository; private TeamExternalRepository teamRepository; @@ -26,9 +29,13 @@ public class GitHubController { private ReviewExternalRepository reviewRepository; private CommentExternalRepository commentRepository; - public GitHubController(GitHubOptionRequest userOptionRequest) { + public GitHubController(SaveMetrics saveMetrics) { + this.saveMetrics = saveMetrics; + } + + private void githubInit(GitHubOptionRequest userOptionRequest) { WebClientConfiguration webClientConfiguration = new WebClientConfiguration( - "https://api.github.com", userOptionRequest.getApiKey()); + "https://api.github.com", userOptionRequest.getApiKey()); this.userOptionRequest = userOptionRequest; this.organizationRepository = new OrganizationGitHubRepository(webClientConfiguration); @@ -50,7 +57,9 @@ private void logIfNotSilenced(String text) { } } - public void execute() { + public void execute(GitHubOptionRequest userOptionRequest) { + githubInit(userOptionRequest); + logIfNotSilenced("- Fetching organizations"); try { @@ -69,6 +78,9 @@ public void execute() { this.fetchTeamsFromOrganization(organization)); }); + logIfNotSilenced("- Saving data to database..."); + saveMetrics.execute(resultMetrics); + logIfNotSilenced("- Preparing CSV..."); // Finally export the results new ExportMetricsToFile(new GitHubMetricCsvExporter()) diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubMiddleware.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubMiddleware.java index 5adf2341..3a6b7fa8 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubMiddleware.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/controller/GitHubMiddleware.java @@ -3,27 +3,29 @@ import io.pakland.mdas.githubstats.infrastructure.controller.Middleware; import io.pakland.mdas.githubstats.infrastructure.github.model.GitHubOptionRequest; import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; +import org.springframework.stereotype.Controller; +@Controller public class GitHubMiddleware extends Middleware { - public GitHubMiddleware(ShellRequest request) { - super(request); + private final GitHubController gitHubController; + + public GitHubMiddleware(GitHubController gitHubController) { + this.gitHubController = gitHubController; } @Override - public String execute() { - GitHubController gitHubController = new GitHubController( - GitHubOptionRequest.builder() - .name(super.request.getName()) - .apiKey(super.request.getApiKey()) - .type(super.request.getEntityType()) - .from(super.request.transformYearMonthToDate(request.getDateFrom())) - .to(super.request.transformYearMonthToDate(request.getDateTo())) - .filePath(super.request.getFilePath()) - .silenced(super.request.isSilence()) - .build()); - gitHubController.execute(); + public String execute(ShellRequest request) { + gitHubController.execute(GitHubOptionRequest.builder() + .name(request.getName()) + .apiKey(request.getApiKey()) + .type(request.getOptionType()) + .filePath(request.getFilePath()) + .silenced(request.isSilence()) + .from(request.transformYearMonthToDate(request.getDateFrom())) + .to(request.transformYearMonthToDate(request.getDateTo())) + .build()); - return String.format("- Generated results in %s", super.request.getFilePath()); + return String.format("- Generated results in %s", request.getFilePath()); } } diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/PostgresMiddleware.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/PostgresMiddleware.java deleted file mode 100644 index 5aae76e2..00000000 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/PostgresMiddleware.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.pakland.mdas.githubstats.infrastructure.postgres; - -import io.pakland.mdas.githubstats.domain.OptionType; -import io.pakland.mdas.githubstats.infrastructure.controller.Middleware; -import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; - -public class PostgresMiddleware extends Middleware { - - public PostgresMiddleware(ShellRequest request) { - super(request); - } - - @Override - public String execute() { - if (super.request.getEntityType().equals(OptionType.USER) && - super.request.getName().equals("plozanol")) { - return "csv from db"; - } - - return super.checkNext(); - } -} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/controller/PostgresController.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/controller/PostgresController.java new file mode 100644 index 00000000..dd9228fd --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/controller/PostgresController.java @@ -0,0 +1,65 @@ +package io.pakland.mdas.githubstats.infrastructure.postgres.controller; + +import io.pakland.mdas.githubstats.application.CheckMetricsFromUserByRange; +import io.pakland.mdas.githubstats.application.ExportMetricsToFile; +import io.pakland.mdas.githubstats.application.GetMetricsFromUserByRange; +import io.pakland.mdas.githubstats.domain.Metric; +import io.pakland.mdas.githubstats.domain.OptionType; +import io.pakland.mdas.githubstats.infrastructure.github.model.GitHubOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.github.repository.GitHubMetricCsvExporter; +import io.pakland.mdas.githubstats.infrastructure.postgres.model.PostgresOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; +import org.springframework.stereotype.Controller; + +import java.io.IOException; +import java.util.List; + +@Controller +public class PostgresController { + + private PostgresOptionRequest postgresOptionRequest = null; + + private final CheckMetricsFromUserByRange checkMetricsFromUserByRange; + + private final GetMetricsFromUserByRange getMetricsFromUser; + + public PostgresController(CheckMetricsFromUserByRange checkMetricsFromUserByRange, GetMetricsFromUserByRange getMetricsFromUser) { + this.checkMetricsFromUserByRange = checkMetricsFromUserByRange; + this.getMetricsFromUser = getMetricsFromUser; + } + + public Boolean execute(PostgresOptionRequest request) { + this.postgresOptionRequest = request; + + if (checkMetricsFromUserByRange.execute(request)) { + logIfNotSilenced("- Stats are already stored at database..."); + logIfNotSilenced("- Retrieving data from database..."); + List metrics = getMetricsFromUser.execute(request); + + logIfNotSilenced("- " +metrics.size()+" rows were read from database"); + + try { + logIfNotSilenced("- Preparing CSV..."); + new ExportMetricsToFile(new GitHubMetricCsvExporter()) + .execute(metrics, request.getFilePath()); + logIfNotSilenced("- File "+request.getFilePath()+" saved successfully "); + } catch (IOException e) { + System.out.println("Error writing "+request.getFilePath()+" file"); + } + return true; + } + + return false; + } + + private boolean isLoggerSilenced() { + return this.postgresOptionRequest.isSilenced(); + } + + private void logIfNotSilenced(String text) { + if (!isLoggerSilenced()) { + System.out.println(text); + } + } + +} diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/controller/PostgresMiddleware.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/controller/PostgresMiddleware.java new file mode 100644 index 00000000..e03b83ce --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/controller/PostgresMiddleware.java @@ -0,0 +1,37 @@ +package io.pakland.mdas.githubstats.infrastructure.postgres.controller; + +import io.pakland.mdas.githubstats.infrastructure.controller.Middleware; +import io.pakland.mdas.githubstats.infrastructure.github.model.GitHubOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.postgres.model.PostgresOptionRequest; +import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; +import org.springframework.stereotype.Controller; + +@Controller +public class PostgresMiddleware extends Middleware { + + private final PostgresController postgresController; + + public PostgresMiddleware(PostgresController postgresController) { + this.postgresController = postgresController; + } + + @Override + public String execute(ShellRequest request) { + + PostgresOptionRequest postgresOptionRequest = PostgresOptionRequest.builder() + .name(request.getName()) + .apiKey(request.getApiKey()) + .type(request.getOptionType()) + .filePath(request.getFilePath()) + .silenced(request.isSilence()) + .from(request.getDateFrom()) + .to(request.getDateTo()) + .build(); + + if (!postgresController.execute(postgresOptionRequest)) { + super.checkNext(request); + } + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/model/PostgresOptionRequest.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/model/PostgresOptionRequest.java new file mode 100644 index 00000000..b0174130 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/postgres/model/PostgresOptionRequest.java @@ -0,0 +1,35 @@ +package io.pakland.mdas.githubstats.infrastructure.postgres.model; + +import io.pakland.mdas.githubstats.domain.OptionType; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; + +import java.time.YearMonth; +import java.util.Date; + +@Data +@Getter +@Builder +public class PostgresOptionRequest { + + private String name; + private String apiKey; + private OptionType type; + private YearMonth from; + private YearMonth to; + private String filePath; + private boolean silenced; + + public boolean isOrganizationType() { + return type.equals(OptionType.ORGANIZATION); + } + + public boolean isTeamType() { + return type.equals(OptionType.TEAM); + } + + public boolean isUserType() { + return type.equals(OptionType.USER); + } +} \ No newline at end of file diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellComponent.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellComponent.java index 0e2a2b8b..6716b8bb 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellComponent.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellComponent.java @@ -6,14 +6,21 @@ import io.pakland.mdas.githubstats.infrastructure.shell.model.ShellRequest; import io.pakland.mdas.githubstats.infrastructure.shell.validation.NameValidator; import io.pakland.mdas.githubstats.infrastructure.shell.validation.YearMonthValidator; +import org.springframework.shell.standard.ShellOption; + import java.time.YearMonth; import java.util.Objects; -import org.springframework.shell.standard.ShellOption; @org.springframework.shell.standard.ShellComponent public abstract class ShellComponent { - private boolean run( + private final MainController mainController; + + protected ShellComponent(MainController mainController) { + this.mainController = mainController; + } + + private void run( @ShellOption(value = {"n"}) String userName, @ShellOption(value = {"key"}) String apiKey, @ShellOption(value = {"from"}) String fromDate, @@ -30,14 +37,14 @@ private boolean run( nameValidator.validate(userName); if (!isInputValid) { - return false; + return; } YearMonth dateFrom = YearMonth.parse(fromDate, yearMonthValidator.getFormatter()); YearMonth dateTo = YearMonth.parse(toDate, yearMonthValidator.getFormatter()); ShellRequest shellRequest = ShellRequest.builder() - .entityType(getType()) + .optionType(getType()) .name(userName) .apiKey(apiKey) .dateFrom(dateFrom) @@ -46,11 +53,8 @@ private boolean run( .silence(Objects.equals(silence, "true")) .build(); - MainController main = new MainController(shellRequest); - String serializedOutput = main.execute(); - System.out.println(serializedOutput); + mainController.execute(shellRequest); - return true; } abstract OptionType getType(); diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellOrganizationComponent.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellOrganizationComponent.java index c5cead8c..395adf22 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellOrganizationComponent.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellOrganizationComponent.java @@ -1,8 +1,16 @@ package io.pakland.mdas.githubstats.infrastructure.shell.components; import io.pakland.mdas.githubstats.domain.OptionType; +import io.pakland.mdas.githubstats.infrastructure.controller.MainController; +import org.springframework.stereotype.Component; +@Component public class ShellOrganizationComponent extends ShellComponent { + + public ShellOrganizationComponent(MainController mainController) { + super(mainController); + } + @Override public OptionType getType() { return OptionType.ORGANIZATION; diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellTeamComponent.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellTeamComponent.java index f032b2c4..c44aaf63 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellTeamComponent.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellTeamComponent.java @@ -1,8 +1,16 @@ package io.pakland.mdas.githubstats.infrastructure.shell.components; import io.pakland.mdas.githubstats.domain.OptionType; +import io.pakland.mdas.githubstats.infrastructure.controller.MainController; +import org.springframework.stereotype.Component; +@Component public class ShellTeamComponent extends ShellComponent { + + public ShellTeamComponent(MainController mainController) { + super(mainController); + } + @Override public OptionType getType() { return OptionType.TEAM; diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellUserComponent.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellUserComponent.java index 01afe0b3..80a703ad 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellUserComponent.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/components/ShellUserComponent.java @@ -1,8 +1,16 @@ package io.pakland.mdas.githubstats.infrastructure.shell.components; import io.pakland.mdas.githubstats.domain.OptionType; +import io.pakland.mdas.githubstats.infrastructure.controller.MainController; +import org.springframework.stereotype.Component; +@Component public class ShellUserComponent extends ShellComponent { + + public ShellUserComponent(MainController mainController) { + super(mainController); + } + @Override public OptionType getType() { return OptionType.USER; diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/configuration/CommandConfiguration.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/configuration/CommandConfiguration.java index 9d5d060e..ccebc37f 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/configuration/CommandConfiguration.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/configuration/CommandConfiguration.java @@ -1,5 +1,6 @@ package io.pakland.mdas.githubstats.infrastructure.shell.configuration; +import io.pakland.mdas.githubstats.infrastructure.controller.MainController; import io.pakland.mdas.githubstats.infrastructure.shell.components.ShellOrganizationComponent; import io.pakland.mdas.githubstats.infrastructure.shell.components.ShellTeamComponent; import io.pakland.mdas.githubstats.infrastructure.shell.components.ShellUserComponent; @@ -11,10 +12,16 @@ @Configuration public class CommandConfiguration { + private final MainController mainController; + + public CommandConfiguration(MainController mainController) { + this.mainController = mainController; + } + @Bean public CommandRegistration buildUserCommand() { CommandRegistrationBuilder builder = new BaseCommandRegistration( - new ShellUserComponent(), + new ShellUserComponent(mainController), "user", "Load data from the specified user", "" @@ -31,7 +38,7 @@ public CommandRegistration buildUserCommand() { @Bean public CommandRegistration buildTeamCommand() { CommandRegistrationBuilder builder = new BaseCommandRegistration( - new ShellTeamComponent(), + new ShellTeamComponent(mainController), "team", "Load data from all users of the specified team", "" @@ -48,7 +55,7 @@ public CommandRegistration buildTeamCommand() { @Bean public CommandRegistration buildOrganizationCommand() { CommandRegistrationBuilder builder = new BaseCommandRegistration( - new ShellOrganizationComponent(), + new ShellOrganizationComponent(mainController), "organization", "Load data from all users of the specified organization, grouped by their team", "" diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/model/ShellRequest.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/model/ShellRequest.java index bbfbeafa..b8e814f1 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/model/ShellRequest.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/shell/model/ShellRequest.java @@ -1,6 +1,8 @@ package io.pakland.mdas.githubstats.infrastructure.shell.model; import io.pakland.mdas.githubstats.domain.OptionType; + +import java.time.Instant; import java.time.YearMonth; import java.time.ZoneId; import java.util.Date; @@ -13,7 +15,7 @@ public class ShellRequest { private String apiKey; - private OptionType entityType; + private OptionType optionType; private String name; @@ -26,8 +28,6 @@ public class ShellRequest { private boolean silence; public Date transformYearMonthToDate(YearMonth yearMonth) { - System.out.format("%s, %s\n", yearMonth.toString(), - yearMonth.atDay(1).atStartOfDay(ZoneId.systemDefault()).toInstant().toString()); - return Date.from(yearMonth.atDay(1).atStartOfDay(ZoneId.systemDefault()).toInstant()); + return Date.from(Instant.from(yearMonth.atDay(1).atStartOfDay(ZoneId.of("UTC")).toInstant())); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f0f5af96..b278cb01 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -16,15 +16,14 @@ spring: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect default_schema: public - jdbc: - time_zone: UTC liquibase: enabled: true change-log: classpath:db/changelog/changelog-master.yaml profiles: - active: dev + active: prod + file: + name: console_output.log + logging: level: - root: INFO - file: - name: console_output.log \ No newline at end of file + root: INFO \ No newline at end of file