diff --git a/src/main/java/group/goforward/battlbuilder/catalog/query/package-info.java b/src/main/java/group/goforward/battlbuilder/catalog/query/package-info.java new file mode 100644 index 0000000..62afce8 --- /dev/null +++ b/src/main/java/group/goforward/battlbuilder/catalog/query/package-info.java @@ -0,0 +1,4 @@ +/** + * Query projections for the catalog domain. + */ +package group.goforward.battlbuilder.catalog.query; diff --git a/src/main/java/group/goforward/battlbuilder/cli/package-info.java b/src/main/java/group/goforward/battlbuilder/cli/package-info.java new file mode 100644 index 0000000..bbc8575 --- /dev/null +++ b/src/main/java/group/goforward/battlbuilder/cli/package-info.java @@ -0,0 +1,4 @@ +/** + * Command line runners and CLI utilities. + */ +package group.goforward.battlbuilder.cli; diff --git a/src/main/java/group/goforward/battlbuilder/utils/ApiResponse.java b/src/main/java/group/goforward/battlbuilder/common/ApiResponse.java similarity index 96% rename from src/main/java/group/goforward/battlbuilder/utils/ApiResponse.java rename to src/main/java/group/goforward/battlbuilder/common/ApiResponse.java index a97bcb6..1232466 100644 --- a/src/main/java/group/goforward/battlbuilder/utils/ApiResponse.java +++ b/src/main/java/group/goforward/battlbuilder/common/ApiResponse.java @@ -1,74 +1,74 @@ -package group.goforward.battlbuilder.utils; - -import java.time.LocalDateTime; - -/** - * @param - */ -public class ApiResponse { - - private static final String API_SUCCESS = "success"; - private static final String API_FAILURE = "failure"; - private static final String API_ERROR = "error"; - private String[] messages; - private T data; - - - - private String status; - private LocalDateTime timestamp; - private ApiResponse(String status, String[] message, T data) { - this.status = status; - this.messages = message; - this.data = data; - this.timestamp = LocalDateTime.now(); - } - - public static ApiResponse error(String message, T data) { - String[] msg = {message}; // ✅ Include the message - return new ApiResponse<>(API_ERROR, msg, data); - } - - public static ApiResponse success(T data, String emailSentSuccessfully) { - String[] msg = {}; - return new ApiResponse<>(API_SUCCESS, msg, data); - } - - public static ApiResponse error(String[] messages) { - return new ApiResponse<>(API_ERROR, messages, null); - } - public static ApiResponse error(String message) { - String[] msg = {}; - return new ApiResponse<>(API_ERROR, msg, null); - } - - - public String[] getMessages() { - return messages; - } - - public void setMessages(String[] messages) { - this.messages = messages; - } - - public T getData() {return data;} - public void setData(T data) { - this.data = data; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public LocalDateTime getTimestamp() { - return timestamp; - } - - public void setTimestamp(LocalDateTime timestamp) { - this.timestamp = timestamp; - } -} +package group.goforward.battlbuilder.utils; + +import java.time.LocalDateTime; + +/** + * @param + */ +public class ApiResponse { + + private static final String API_SUCCESS = "success"; + private static final String API_FAILURE = "failure"; + private static final String API_ERROR = "error"; + private String[] messages; + private T data; + + + + private String status; + private LocalDateTime timestamp; + private ApiResponse(String status, String[] message, T data) { + this.status = status; + this.messages = message; + this.data = data; + this.timestamp = LocalDateTime.now(); + } + + public static ApiResponse error(String message, T data) { + String[] msg = {message}; // ✅ Include the message + return new ApiResponse<>(API_ERROR, msg, data); + } + + public static ApiResponse success(T data, String emailSentSuccessfully) { + String[] msg = {}; + return new ApiResponse<>(API_SUCCESS, msg, data); + } + + public static ApiResponse error(String[] messages) { + return new ApiResponse<>(API_ERROR, messages, null); + } + public static ApiResponse error(String message) { + String[] msg = {}; + return new ApiResponse<>(API_ERROR, msg, null); + } + + + public String[] getMessages() { + return messages; + } + + public void setMessages(String[] messages) { + this.messages = messages; + } + + public T getData() {return data;} + public void setData(T data) { + this.data = data; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } +} diff --git a/src/main/java/group/goforward/battlbuilder/utils/Counter.java b/src/main/java/group/goforward/battlbuilder/common/Counter.java similarity index 94% rename from src/main/java/group/goforward/battlbuilder/utils/Counter.java rename to src/main/java/group/goforward/battlbuilder/common/Counter.java index 6836ed8..e5b85d5 100644 --- a/src/main/java/group/goforward/battlbuilder/utils/Counter.java +++ b/src/main/java/group/goforward/battlbuilder/common/Counter.java @@ -1,20 +1,20 @@ -package group.goforward.battlbuilder.utils; - -import org.springframework.context.annotation.Bean; - -public class Counter { - - Integer count = 0; - public void addOne() { - count +=1; - } - - public Integer getCount() { - return count; - } - - private void setCount(Integer count) { - this.count = count; - } - -} +package group.goforward.battlbuilder.utils; + +import org.springframework.context.annotation.Bean; + +public class Counter { + + Integer count = 0; + public void addOne() { + count +=1; + } + + public Integer getCount() { + return count; + } + + private void setCount(Integer count) { + this.count = count; + } + +} diff --git a/src/main/java/group/goforward/battlbuilder/utils/package-info.java b/src/main/java/group/goforward/battlbuilder/common/package-info.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/utils/package-info.java rename to src/main/java/group/goforward/battlbuilder/common/package-info.java diff --git a/src/main/java/group/goforward/battlbuilder/configuration/CacheConfig.java b/src/main/java/group/goforward/battlbuilder/config/CacheConfig.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/configuration/CacheConfig.java rename to src/main/java/group/goforward/battlbuilder/config/CacheConfig.java index 770c0ef..c921be2 100644 --- a/src/main/java/group/goforward/battlbuilder/configuration/CacheConfig.java +++ b/src/main/java/group/goforward/battlbuilder/config/CacheConfig.java @@ -1,22 +1,22 @@ -package group.goforward.battlbuilder.configuration; - -import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cache.concurrent.ConcurrentMapCacheManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableCaching -public class CacheConfig { - - @Bean - public CacheManager cacheManager() { - // Must match the @Cacheable value(s) used in controllers/services. - // ProductV1Controller uses: "gunbuilderProductsV1" - return new ConcurrentMapCacheManager( - "gunbuilderProductsV1", - "gunbuilderProducts" // keep if anything else still references it - ); - } +package group.goforward.battlbuilder.configuration; + +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.concurrent.ConcurrentMapCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableCaching +public class CacheConfig { + + @Bean + public CacheManager cacheManager() { + // Must match the @Cacheable value(s) used in controllers/services. + // ProductV1Controller uses: "gunbuilderProductsV1" + return new ConcurrentMapCacheManager( + "gunbuilderProductsV1", + "gunbuilderProducts" // keep if anything else still references it + ); + } } \ No newline at end of file diff --git a/src/main/java/group/goforward/battlbuilder/configuration/CorsConfig.java b/src/main/java/group/goforward/battlbuilder/config/CorsConfig.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/configuration/CorsConfig.java rename to src/main/java/group/goforward/battlbuilder/config/CorsConfig.java index 20ff722..26ebe73 100644 --- a/src/main/java/group/goforward/battlbuilder/configuration/CorsConfig.java +++ b/src/main/java/group/goforward/battlbuilder/config/CorsConfig.java @@ -1,84 +1,84 @@ -// src/main/java/com/example/config/CorsConfig.java -package group.goforward.battlbuilder.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import java.util.Arrays; - -@Configuration -public class CorsConfig { - - @Bean - public CorsFilter corsFilter() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = new CorsConfiguration(); - - // Allow credentials - config.setAllowCredentials(true); - - // Allow Angular development server - config.setAllowedOrigins(Arrays.asList( - "http://localhost:4200", - "http://localhost:4201", - "http://localhost:8070", - "https://localhost:8070", - "http://localhost:8080", - "https://localhost:8080", - "http://localhost:3000", - "https://localhost:3000", - "https://localhost:3000/gunbuilder", - "http://localhost:3000/gunbuilder", - "https://localhost:3000/builder", - "http://localhost:3000/builder" - )); - - // Allow all headers - config.addAllowedHeader("*"); - - // Allow all HTTP methods - config.setAllowedMethods(Arrays.asList( - "GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS" - )); - - // Expose headers - config.setExposedHeaders(Arrays.asList( - "Authorization", - "Content-Type", - "X-Total-Count" - )); - - // Max age for preflight cache (1 hour) - config.setMaxAge(3600L); - - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } -} - - -// Alternative using WebMvcConfigurer: -/* -package group.goforward.citysites.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/api/**") - .allowedOrigins("http://localhost:4200") - .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") - .allowedHeaders("*") - .allowCredentials(true) - .maxAge(3600); - } -} +// src/main/java/com/example/config/CorsConfig.java +package group.goforward.battlbuilder.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.Arrays; + +@Configuration +public class CorsConfig { + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + + // Allow credentials + config.setAllowCredentials(true); + + // Allow Angular development server + config.setAllowedOrigins(Arrays.asList( + "http://localhost:4200", + "http://localhost:4201", + "http://localhost:8070", + "https://localhost:8070", + "http://localhost:8080", + "https://localhost:8080", + "http://localhost:3000", + "https://localhost:3000", + "https://localhost:3000/gunbuilder", + "http://localhost:3000/gunbuilder", + "https://localhost:3000/builder", + "http://localhost:3000/builder" + )); + + // Allow all headers + config.addAllowedHeader("*"); + + // Allow all HTTP methods + config.setAllowedMethods(Arrays.asList( + "GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS" + )); + + // Expose headers + config.setExposedHeaders(Arrays.asList( + "Authorization", + "Content-Type", + "X-Total-Count" + )); + + // Max age for preflight cache (1 hour) + config.setMaxAge(3600L); + + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} + + +// Alternative using WebMvcConfigurer: +/* +package group.goforward.citysites.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") + .allowedOrigins("http://localhost:4200") + .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true) + .maxAge(3600); + } +} */ \ No newline at end of file diff --git a/src/main/java/group/goforward/battlbuilder/configuration/JpaConfig.java b/src/main/java/group/goforward/battlbuilder/config/JpaConfig.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/configuration/JpaConfig.java rename to src/main/java/group/goforward/battlbuilder/config/JpaConfig.java index eca843f..09e6ce4 100644 --- a/src/main/java/group/goforward/battlbuilder/configuration/JpaConfig.java +++ b/src/main/java/group/goforward/battlbuilder/config/JpaConfig.java @@ -1,10 +1,10 @@ -package group.goforward.battlbuilder.configuration; - -import org.springframework.context.annotation.Configuration; -//import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -@Configuration - -public class JpaConfig { - // Enables @CreatedDate / @LastModifiedDate processing +package group.goforward.battlbuilder.configuration; + +import org.springframework.context.annotation.Configuration; +//import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration + +public class JpaConfig { + // Enables @CreatedDate / @LastModifiedDate processing } \ No newline at end of file diff --git a/src/main/java/group/goforward/battlbuilder/configuration/MinioConfig.java b/src/main/java/group/goforward/battlbuilder/config/MinioConfig.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/configuration/MinioConfig.java rename to src/main/java/group/goforward/battlbuilder/config/MinioConfig.java diff --git a/src/main/java/group/goforward/battlbuilder/configuration/PasswordConfig.java b/src/main/java/group/goforward/battlbuilder/config/PasswordConfig.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/configuration/PasswordConfig.java rename to src/main/java/group/goforward/battlbuilder/config/PasswordConfig.java diff --git a/src/main/java/group/goforward/battlbuilder/configuration/SecurityConfig.java b/src/main/java/group/goforward/battlbuilder/config/SecurityConfig.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/configuration/SecurityConfig.java rename to src/main/java/group/goforward/battlbuilder/config/SecurityConfig.java diff --git a/src/main/java/group/goforward/battlbuilder/configuration/package-info.java b/src/main/java/group/goforward/battlbuilder/config/package-info.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/configuration/package-info.java rename to src/main/java/group/goforward/battlbuilder/config/package-info.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/AuthController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/AuthController.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/AuthController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/AuthController.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/api/BrandController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/BrandController.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/controllers/api/BrandController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/BrandController.java index f5ec691..78b4795 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/api/BrandController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/BrandController.java @@ -1,50 +1,50 @@ -package group.goforward.battlbuilder.controllers; - -import group.goforward.battlbuilder.model.Brand; -import group.goforward.battlbuilder.repos.BrandRepository; -import group.goforward.battlbuilder.services.BrandService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - - -@RestController -@RequestMapping({"/api/v1/brands", "/api/brands"}) -public class BrandController { - @Autowired - private BrandRepository repo; - @Autowired - private BrandService brandService; -//@Cacheable(value="getAllStates") - @GetMapping("/all") - public ResponseEntity> getAllBrands() { - List brand = repo.findAll(); - return ResponseEntity.ok(brand); - } - - @GetMapping("/{id}") - public ResponseEntity getAllBrandsById(@PathVariable Integer id) { - return repo.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - } - - @PostMapping("/add") - public ResponseEntity createbrand(@RequestBody Brand item) { - Brand created = brandService.save(item); - return ResponseEntity.status(HttpStatus.CREATED).body(created); - } - - @DeleteMapping("/delete/{id}") - public ResponseEntity deleteItem(@PathVariable Integer id) { - return brandService.findById(id) - .map(item -> { - brandService.deleteById(id); - return ResponseEntity.noContent().build(); - }) - .orElse(ResponseEntity.notFound().build()); - } -} +package group.goforward.battlbuilder.controllers; + +import group.goforward.battlbuilder.model.Brand; +import group.goforward.battlbuilder.repos.BrandRepository; +import group.goforward.battlbuilder.services.BrandService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping({"/api/v1/brands", "/api/brands"}) +public class BrandController { + @Autowired + private BrandRepository repo; + @Autowired + private BrandService brandService; +//@Cacheable(value="getAllStates") + @GetMapping("/all") + public ResponseEntity> getAllBrands() { + List brand = repo.findAll(); + return ResponseEntity.ok(brand); + } + + @GetMapping("/{id}") + public ResponseEntity getAllBrandsById(@PathVariable Integer id) { + return repo.findById(id) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping("/add") + public ResponseEntity createbrand(@RequestBody Brand item) { + Brand created = brandService.save(item); + return ResponseEntity.status(HttpStatus.CREATED).body(created); + } + + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteItem(@PathVariable Integer id) { + return brandService.findById(id) + .map(item -> { + brandService.deleteById(id); + return ResponseEntity.noContent().build(); + }) + .orElse(ResponseEntity.notFound().build()); + } +} diff --git a/src/main/java/group/goforward/battlbuilder/controllers/api/BuildController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuildController.java similarity index 96% rename from src/main/java/group/goforward/battlbuilder/controllers/api/BuildController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuildController.java index 11b3f0b..7beca38 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/api/BuildController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuildController.java @@ -1,34 +1,34 @@ -package group.goforward.battlbuilder.controllers.api; - -import group.goforward.battlbuilder.model.Build; -import group.goforward.battlbuilder.repos.BuildRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - - -@RestController -@RequestMapping("/v1/api/builds") -public class BuildController { - @Autowired - private BuildRepository repo; - @Autowired - // private BuildsService service; -//@Cacheable(value="getAllStates") - @GetMapping("/all") - public ResponseEntity> getAll() { - List builds = repo.findAll(); - return ResponseEntity.ok(builds); - } - - @GetMapping("/{id}") - public ResponseEntity getAllBuildsById(@PathVariable Integer id) { - return repo.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - } - - -} +package group.goforward.battlbuilder.controllers.api; + +import group.goforward.battlbuilder.model.Build; +import group.goforward.battlbuilder.repos.BuildRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping("/v1/api/builds") +public class BuildController { + @Autowired + private BuildRepository repo; + @Autowired + // private BuildsService service; +//@Cacheable(value="getAllStates") + @GetMapping("/all") + public ResponseEntity> getAll() { + List builds = repo.findAll(); + return ResponseEntity.ok(builds); + } + + @GetMapping("/{id}") + public ResponseEntity getAllBuildsById(@PathVariable Integer id) { + return repo.findById(id) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + +} diff --git a/src/main/java/group/goforward/battlbuilder/controllers/BuildV1Controller.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuildV1Controller.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/BuildV1Controller.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuildV1Controller.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/BuilderBootstrapController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuilderBootstrapController.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/BuilderBootstrapController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/BuilderBootstrapController.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/CatalogController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/CatalogController.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/CatalogController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/CatalogController.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/CategoryController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/CategoryController.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/CategoryController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/CategoryController.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/ImportController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/ImportController.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/controllers/ImportController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/ImportController.java index 8dc878e..12e4759 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/ImportController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/ImportController.java @@ -1,40 +1,40 @@ -package group.goforward.battlbuilder.controllers; - -import group.goforward.battlbuilder.services.MerchantFeedImportService; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping({"/api/admin/imports", "/api/v1/admin/imports"}) - -@CrossOrigin(origins = "http://localhost:3000") -public class ImportController { - - private final MerchantFeedImportService merchantFeedImportService; - - public ImportController(MerchantFeedImportService merchantFeedImportService) { - this.merchantFeedImportService = merchantFeedImportService; - } - - /** - * Full product + offer import for a merchant. - * - * POST /admin/imports/{merchantId} - */ - @PostMapping("/{merchantId}") - public ResponseEntity importMerchant(@PathVariable Integer merchantId) { - merchantFeedImportService.importMerchantFeed(merchantId); - return ResponseEntity.noContent().build(); - } - - /** - * Offers-only sync (price/stock) for a merchant. - * - * POST /admin/imports/{merchantId}/offers-only - */ - @PostMapping("/{merchantId}/offers-only") - public ResponseEntity syncOffersOnly(@PathVariable Integer merchantId) { - merchantFeedImportService.syncOffersOnly(merchantId); - return ResponseEntity.noContent().build(); - } +package group.goforward.battlbuilder.controllers; + +import group.goforward.battlbuilder.services.MerchantFeedImportService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping({"/api/admin/imports", "/api/v1/admin/imports"}) + +@CrossOrigin(origins = "http://localhost:3000") +public class ImportController { + + private final MerchantFeedImportService merchantFeedImportService; + + public ImportController(MerchantFeedImportService merchantFeedImportService) { + this.merchantFeedImportService = merchantFeedImportService; + } + + /** + * Full product + offer import for a merchant. + * + * POST /admin/imports/{merchantId} + */ + @PostMapping("/{merchantId}") + public ResponseEntity importMerchant(@PathVariable Integer merchantId) { + merchantFeedImportService.importMerchantFeed(merchantId); + return ResponseEntity.noContent().build(); + } + + /** + * Offers-only sync (price/stock) for a merchant. + * + * POST /admin/imports/{merchantId}/offers-only + */ + @PostMapping("/{merchantId}/offers-only") + public ResponseEntity syncOffersOnly(@PathVariable Integer merchantId) { + merchantFeedImportService.syncOffersOnly(merchantId); + return ResponseEntity.noContent().build(); + } } \ No newline at end of file diff --git a/src/main/java/group/goforward/battlbuilder/controllers/api/MeController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/MeController.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/api/MeController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/MeController.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/MerchantDebugController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/MerchantDebugController.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/controllers/MerchantDebugController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/MerchantDebugController.java index 9461e48..af65d42 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/MerchantDebugController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/MerchantDebugController.java @@ -1,25 +1,25 @@ -package group.goforward.battlbuilder.controllers; - -import group.goforward.battlbuilder.model.Merchant; -import group.goforward.battlbuilder.repos.MerchantRepository; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequestMapping({"/api/admin", "/api/v1/admin"}) -public class MerchantDebugController { - - private final MerchantRepository merchantRepository; - - public MerchantDebugController(MerchantRepository merchantRepository) { - this.merchantRepository = merchantRepository; - } - - @GetMapping("/debug/merchants") - public List listMerchants() { - return merchantRepository.findAll(); - } +package group.goforward.battlbuilder.controllers; + +import group.goforward.battlbuilder.model.Merchant; +import group.goforward.battlbuilder.repos.MerchantRepository; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping({"/api/admin", "/api/v1/admin"}) +public class MerchantDebugController { + + private final MerchantRepository merchantRepository; + + public MerchantDebugController(MerchantRepository merchantRepository) { + this.merchantRepository = merchantRepository; + } + + @GetMapping("/debug/merchants") + public List listMerchants() { + return merchantRepository.findAll(); + } } \ No newline at end of file diff --git a/src/main/java/group/goforward/battlbuilder/controllers/ProductController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/ProductController.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/controllers/ProductController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/ProductController.java index de83357..64e0384 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/ProductController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/ProductController.java @@ -1,56 +1,56 @@ -package group.goforward.battlbuilder.controllers; - -import group.goforward.battlbuilder.web.dto.ProductOfferDto; -import group.goforward.battlbuilder.web.dto.ProductSummaryDto; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * LEGACY CONTROLLER (Deprecated) - * - * Do not add new features here. - * Canonical API lives in ProductV1Controller (/api/v1/products). - * - * This exists only to keep older clients working temporarily. - * Disable by default using: - * app.api.legacy.enabled=false - * - * NOTE: - * Even when disabled, Spring still compiles this class. So it must not reference - * missing services/methods. - */ -@Deprecated -@RestController -@RequestMapping({"/api/products", "/api/v1/products"}) -@CrossOrigin -@ConditionalOnProperty(name = "app.api.legacy.enabled", havingValue = "true", matchIfMissing = false) -public class ProductController { - - private static final String MSG = - "Legacy endpoint disabled. Use /api/v1/products instead."; - - @GetMapping - public ResponseEntity getProducts( - @RequestParam(defaultValue = "AR-15") String platform, - @RequestParam(required = false, name = "partRoles") List partRoles - ) { - // Legacy disabled by design (Option B cleanup) - return ResponseEntity.status(410).body(MSG); - } - - @GetMapping("/{id}/offers") - public ResponseEntity getOffersForProduct(@PathVariable("id") Integer productId) { - return ResponseEntity.status(410).body(MSG); - } - - @GetMapping("/{id}") - public ResponseEntity getProductById(@PathVariable("id") Integer productId) { - return ResponseEntity.status(410).body(MSG); - } - - // If you *really* need typed responses for an old client, we can re-add - // a real service layer once we align on the actual ProductQueryService API. +package group.goforward.battlbuilder.controllers; + +import group.goforward.battlbuilder.web.dto.ProductOfferDto; +import group.goforward.battlbuilder.web.dto.ProductSummaryDto; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * LEGACY CONTROLLER (Deprecated) + * + * Do not add new features here. + * Canonical API lives in ProductV1Controller (/api/v1/products). + * + * This exists only to keep older clients working temporarily. + * Disable by default using: + * app.api.legacy.enabled=false + * + * NOTE: + * Even when disabled, Spring still compiles this class. So it must not reference + * missing services/methods. + */ +@Deprecated +@RestController +@RequestMapping({"/api/products", "/api/v1/products"}) +@CrossOrigin +@ConditionalOnProperty(name = "app.api.legacy.enabled", havingValue = "true", matchIfMissing = false) +public class ProductController { + + private static final String MSG = + "Legacy endpoint disabled. Use /api/v1/products instead."; + + @GetMapping + public ResponseEntity getProducts( + @RequestParam(defaultValue = "AR-15") String platform, + @RequestParam(required = false, name = "partRoles") List partRoles + ) { + // Legacy disabled by design (Option B cleanup) + return ResponseEntity.status(410).body(MSG); + } + + @GetMapping("/{id}/offers") + public ResponseEntity getOffersForProduct(@PathVariable("id") Integer productId) { + return ResponseEntity.status(410).body(MSG); + } + + @GetMapping("/{id}") + public ResponseEntity getProductById(@PathVariable("id") Integer productId) { + return ResponseEntity.status(410).body(MSG); + } + + // If you *really* need typed responses for an old client, we can re-add + // a real service layer once we align on the actual ProductQueryService API. } \ No newline at end of file diff --git a/src/main/java/group/goforward/battlbuilder/controllers/ProductV1Controller.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/ProductV1Controller.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/ProductV1Controller.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/ProductV1Controller.java diff --git a/src/main/java/group/goforward/battlbuilder/controllers/api/StateController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/StateController.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/controllers/api/StateController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/StateController.java index 3d8a6ef..60c66f9 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/api/StateController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/StateController.java @@ -1,55 +1,55 @@ -package group.goforward.battlbuilder.controllers; - -import group.goforward.battlbuilder.model.State; -import group.goforward.battlbuilder.repos.StateRepository; -import group.goforward.battlbuilder.services.admin.StatesService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - - -@RestController -@RequestMapping({"/api/states", "/api/v1/states"}) -public class StateController { - @Autowired - private StateRepository repo; - @Autowired - private StatesService statesService; -//@Cacheable(value="getAllStates") - @GetMapping("/all") - public ResponseEntity> getAllStates() { - List state = repo.findAll(); - return ResponseEntity.ok(state); - } - - @GetMapping("/{id}") - public ResponseEntity getAllStatesById(@PathVariable Integer id) { - return repo.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - } - @GetMapping("/byAbbrev/{abbreviation}") - public ResponseEntity getAllStatesByAbbreviation(@PathVariable String abbreviation) { - return repo.findByAbbreviation(abbreviation) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - } - @PostMapping("/addState") - public ResponseEntity createState(@RequestBody State item) { - State created = statesService.save(item); - return ResponseEntity.status(HttpStatus.CREATED).body(created); - } - - @DeleteMapping("/deleteState/{id}") - public ResponseEntity deleteItem(@PathVariable Integer id) { - return statesService.findById(id) - .map(item -> { - statesService.deleteById(id); - return ResponseEntity.noContent().build(); - }) - .orElse(ResponseEntity.notFound().build()); - } -} +package group.goforward.battlbuilder.controllers; + +import group.goforward.battlbuilder.model.State; +import group.goforward.battlbuilder.repos.StateRepository; +import group.goforward.battlbuilder.services.admin.StatesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping({"/api/states", "/api/v1/states"}) +public class StateController { + @Autowired + private StateRepository repo; + @Autowired + private StatesService statesService; +//@Cacheable(value="getAllStates") + @GetMapping("/all") + public ResponseEntity> getAllStates() { + List state = repo.findAll(); + return ResponseEntity.ok(state); + } + + @GetMapping("/{id}") + public ResponseEntity getAllStatesById(@PathVariable Integer id) { + return repo.findById(id) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + @GetMapping("/byAbbrev/{abbreviation}") + public ResponseEntity getAllStatesByAbbreviation(@PathVariable String abbreviation) { + return repo.findByAbbreviation(abbreviation) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + @PostMapping("/addState") + public ResponseEntity createState(@RequestBody State item) { + State created = statesService.save(item); + return ResponseEntity.status(HttpStatus.CREATED).body(created); + } + + @DeleteMapping("/deleteState/{id}") + public ResponseEntity deleteItem(@PathVariable Integer id) { + return statesService.findById(id) + .map(item -> { + statesService.deleteById(id); + return ResponseEntity.noContent().build(); + }) + .orElse(ResponseEntity.notFound().build()); + } +} diff --git a/src/main/java/group/goforward/battlbuilder/controllers/api/UserController.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/UserController.java similarity index 97% rename from src/main/java/group/goforward/battlbuilder/controllers/api/UserController.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/UserController.java index 6088209..e8932df 100644 --- a/src/main/java/group/goforward/battlbuilder/controllers/api/UserController.java +++ b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/UserController.java @@ -1,52 +1,52 @@ -package group.goforward.battlbuilder.controllers; - -import group.goforward.battlbuilder.model.User; -import group.goforward.battlbuilder.repos.UserRepository; -import group.goforward.battlbuilder.services.admin.UsersService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - - -@RestController -@RequestMapping({"/api/user", "/api/v1/user"}) -public class UserController { - private final UserRepository repo; - private final UsersService usersService; - - public UserController(UserRepository repo, UsersService usersService) { - this.repo = repo; - this.usersService = usersService; - } - - @GetMapping("/all") - public ResponseEntity> getAllUsers() { - List data = repo.findAll(); - return ResponseEntity.ok(data); - } - - - @GetMapping("/byId/{id}") - public ResponseEntity getAllStatesById(@PathVariable Integer id) { - return repo.findById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - } - @PostMapping("/addUser") - public ResponseEntity createUser(@RequestBody User item) { - User created = usersService.save(item); - return ResponseEntity.status(HttpStatus.CREATED).body(created); - } - - @DeleteMapping("/deleteUser/{id}") - public ResponseEntity deleteItem(@PathVariable Integer id) { - return usersService.findById(id) - .map(item -> { - usersService.deleteById(id); - return ResponseEntity.noContent().build(); - }) - .orElse(ResponseEntity.notFound().build()); - } -} +package group.goforward.battlbuilder.controllers; + +import group.goforward.battlbuilder.model.User; +import group.goforward.battlbuilder.repos.UserRepository; +import group.goforward.battlbuilder.services.admin.UsersService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@RestController +@RequestMapping({"/api/user", "/api/v1/user"}) +public class UserController { + private final UserRepository repo; + private final UsersService usersService; + + public UserController(UserRepository repo, UsersService usersService) { + this.repo = repo; + this.usersService = usersService; + } + + @GetMapping("/all") + public ResponseEntity> getAllUsers() { + List data = repo.findAll(); + return ResponseEntity.ok(data); + } + + + @GetMapping("/byId/{id}") + public ResponseEntity getAllStatesById(@PathVariable Integer id) { + return repo.findById(id) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + @PostMapping("/addUser") + public ResponseEntity createUser(@RequestBody User item) { + User created = usersService.save(item); + return ResponseEntity.status(HttpStatus.CREATED).body(created); + } + + @DeleteMapping("/deleteUser/{id}") + public ResponseEntity deleteItem(@PathVariable Integer id) { + return usersService.findById(id) + .map(item -> { + usersService.deleteById(id); + return ResponseEntity.noContent().build(); + }) + .orElse(ResponseEntity.notFound().build()); + } +} diff --git a/src/main/java/group/goforward/battlbuilder/controllers/api/package-info.java b/src/main/java/group/goforward/battlbuilder/controllers/api/v1/package-info.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/controllers/api/package-info.java rename to src/main/java/group/goforward/battlbuilder/controllers/api/v1/package-info.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/AdminEnrichmentController.java b/src/main/java/group/goforward/battlbuilder/enrichment/controller/AdminEnrichmentController.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/AdminEnrichmentController.java rename to src/main/java/group/goforward/battlbuilder/enrichment/controller/AdminEnrichmentController.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/EnrichmentSource.java b/src/main/java/group/goforward/battlbuilder/enrichment/enums/EnrichmentSource.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/EnrichmentSource.java rename to src/main/java/group/goforward/battlbuilder/enrichment/enums/EnrichmentSource.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/EnrichmentStatus.java b/src/main/java/group/goforward/battlbuilder/enrichment/enums/EnrichmentStatus.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/EnrichmentStatus.java rename to src/main/java/group/goforward/battlbuilder/enrichment/enums/EnrichmentStatus.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/EnrichmentType.java b/src/main/java/group/goforward/battlbuilder/enrichment/enums/EnrichmentType.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/EnrichmentType.java rename to src/main/java/group/goforward/battlbuilder/enrichment/enums/EnrichmentType.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/ProductEnrichment.java b/src/main/java/group/goforward/battlbuilder/enrichment/model/ProductEnrichment.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/ProductEnrichment.java rename to src/main/java/group/goforward/battlbuilder/enrichment/model/ProductEnrichment.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/ProductEnrichmentRepository.java b/src/main/java/group/goforward/battlbuilder/enrichment/repo/ProductEnrichmentRepository.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/ProductEnrichmentRepository.java rename to src/main/java/group/goforward/battlbuilder/enrichment/repo/ProductEnrichmentRepository.java diff --git a/src/main/java/group/goforward/battlbuilder/enrichment/CaliberEnrichmentService.java b/src/main/java/group/goforward/battlbuilder/enrichment/service/CaliberEnrichmentService.java similarity index 100% rename from src/main/java/group/goforward/battlbuilder/enrichment/CaliberEnrichmentService.java rename to src/main/java/group/goforward/battlbuilder/enrichment/service/CaliberEnrichmentService.java