lots of changes

This commit is contained in:
2025-11-26 23:59:04 -05:00
parent 8f9e15f1e7
commit 8120dafd6d
40 changed files with 441 additions and 110 deletions

38
pom.xml
View File

@@ -12,13 +12,22 @@
<artifactId>ballistic</artifactId> <artifactId>ballistic</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>ballistic</name> <name>ballistic</name>
<description>Ballistic Builder</description> <description>Ballistic Builder API</description>
<url/> <url/>
<licenses> <licenses>
<license/> <license/>
</licenses> </licenses>
<developers> <developers>
<developer/> <developer>
<name>Don Strawsburg</name>
<email>don@goforward.group</email>
<organization>Forward Group, LLC</organization>
</developer>
<developer>
<name>Sean Strawsburg</name>
<email>don@goforward.group</email>
<organization>Forward Group, LLC</organization>
</developer>
</developers> </developers>
<scm> <scm>
<connection/> <connection/>
@@ -28,6 +37,8 @@
</scm> </scm>
<properties> <properties>
<java.version>17</java.version> <java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -49,12 +60,23 @@
<scope>runtime</scope> <scope>runtime</scope>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.8.5</version>
</dependency>
<!--<dependency> <!--<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId> <artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
<optional>true</optional> <optional>true</optional>
</dependency>--> </dependency>-->
<!-- Jakarta / validation API is pulled by starters; explicit jakarta persistence if needed -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency> <dependency>
<groupId>org.postgresql</groupId> <groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId> <artifactId>postgresql</artifactId>
@@ -69,6 +91,18 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<compilerArgs>
<arg>--enable-preview</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>

View File

@@ -0,0 +1,70 @@
package group.goforward.ballistic;
import java.time.LocalDateTime;
public class ApiResponse<T> {
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 <T> ApiResponse<T> success(T data, String message) {
String[] msg = {message};
return new ApiResponse<>(API_SUCCESS, msg, data);
}
public static <T> ApiResponse<T> success(T data) {
String[] msg = {};
return new ApiResponse<>(API_SUCCESS, msg, data);
}
public static <T> ApiResponse<T> error(String[] messages) {
return new ApiResponse<>(API_ERROR, messages, null);
}
public static <T> ApiResponse<T> 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;
}
}

View File

@@ -2,7 +2,15 @@ package group.goforward.ballistic;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EntityScan("group.goforward.ballistic.model")
@ComponentScan("group.goforward.ballistic.configuration")
@ComponentScan("group.goforward.ballistic.controllers")
@ComponentScan("group.goforward.ballistic.service")
@SpringBootApplication @SpringBootApplication
public class BallisticApplication { public class BallisticApplication {

View File

@@ -0,0 +1,84 @@
// src/main/java/com/example/config/CorsConfig.java
package group.goforward.ballistic.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://192.168.11.210:8070",
"https://192.168.11.210:8070",
"http://localhost:4200",
"http://citysites.gofwd.group",
"https://citysites.gofwd.group",
"http://citysites.gofwd.group:8070",
"https://citysites.gofwd.group:8070"
));
// 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);
}
}
*/

View File

@@ -0,0 +1,10 @@
package group.goforward.ballistic.configuration;
import org.springframework.context.annotation.Configuration;
//import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
public class JpaConfig {
// Enables @CreatedDate / @LastModifiedDate processing
}

View File

@@ -0,0 +1 @@
package group.goforward.ballistic.configuration;

View File

@@ -1,6 +1,6 @@
package group.goforward.ballistic.controllers; package group.goforward.ballistic.controllers;
import group.goforward.ballistic.jpa.Psa; import group.goforward.ballistic.model.Psa;
import group.goforward.ballistic.service.PsaService; import group.goforward.ballistic.service.PsaService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -11,7 +11,7 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@RestController @RestController
@RequestMapping("/psa") @RequestMapping("/api/psa")
public class PsaController { public class PsaController {
private final PsaService psaService; private final PsaService psaService;
@@ -21,12 +21,12 @@ public class PsaController {
this.psaService = psaService; this.psaService = psaService;
} }
@GetMapping("/all") @GetMapping("/api/getAllPsa")
public List<Psa> getAllPsa() { public List<Psa> getAllPsa() {
return psaService.findAll(); return psaService.findAll();
} }
@GetMapping("/{id}") @GetMapping("/api/getPSAById/{id}")
public ResponseEntity<Psa> getPsaById(@PathVariable UUID id) { public ResponseEntity<Psa> getPsaById(@PathVariable UUID id) {
Optional<Psa> psa = psaService.findById(id); Optional<Psa> psa = psaService.findById(id);
return psa.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); return psa.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
@@ -37,7 +37,7 @@ public class PsaController {
return psaService.save(psa); return psaService.save(psa);
} }
@PutMapping("/{id}") @PutMapping("/api/updatePsa/{id}")
public ResponseEntity<Psa> updatePsa(@PathVariable UUID id, @RequestBody Psa psaDetails) { public ResponseEntity<Psa> updatePsa(@PathVariable UUID id, @RequestBody Psa psaDetails) {
Optional<Psa> psa = psaService.findById(id); Optional<Psa> psa = psaService.findById(id);
if (psa.isPresent()) { if (psa.isPresent()) {
@@ -49,7 +49,7 @@ public class PsaController {
} }
} }
@DeleteMapping("/{id}") @DeleteMapping("/api/deletePsa/{id}")
public ResponseEntity<Void> deletePsa(@PathVariable UUID id) { public ResponseEntity<Void> deletePsa(@PathVariable UUID id) {
psaService.deleteById(id); psaService.deleteById(id);
return ResponseEntity.noContent().build(); return ResponseEntity.noContent().build();

View File

@@ -0,0 +1,62 @@
package group.goforward.ballistic.controllers;
import group.goforward.ballistic.ApiResponse;
import group.goforward.ballistic.model.State;
import group.goforward.ballistic.repos.StateRepository;
import group.goforward.ballistic.service.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()
public class StateController {
@Autowired
private StateRepository repo;
@Autowired
private StatesService statesService;
@GetMapping("/api/getAllStates")
public ResponseEntity<List<State>> getAllStates() {
List<State> state = repo.findAll();
return ResponseEntity.ok(state);
}
@GetMapping("/api/getAllStatesTest")
public ApiResponse<List<State>> getAllStatesTest() {
List<State> state = repo.findAll();
return ApiResponse.success(state);
}
@GetMapping("/api/getAllStatesById/{id}")
public ResponseEntity<State> getAllStatesById(@PathVariable Integer id) {
return repo.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@GetMapping("/api/getAllStatesByAbbreviation/{abbreviation}")
public ResponseEntity<State> getAllStatesByAbbreviation(@PathVariable String abbreviation) {
return repo.findByAbbreviation(abbreviation)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping("/api/addState")
public ResponseEntity<State> createState(@RequestBody State item) {
State created = statesService.save(item);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
@DeleteMapping("/api/deleteState/{id}")
public ResponseEntity<Void> deleteItem(@PathVariable Integer id) {
return statesService.findById(id)
.map(item -> {
statesService.deleteById(id);
return ResponseEntity.noContent().<Void>build();
})
.orElse(ResponseEntity.notFound().build());
}
}

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId; import jakarta.persistence.EmbeddedId;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Embeddable; import jakarta.persistence.Embeddable;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
@@ -6,8 +6,6 @@ import jakarta.persistence.Id;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.ColumnDefault;
import java.util.UUID;
@Entity @Entity
@Table(name = "psa") @Table(name = "psa")
public class Psa { public class Psa {

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package group.goforward.ballistic.jpa; package group.goforward.ballistic.model;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;

View File

@@ -1,5 +1,5 @@
package group.goforward.ballistic.repos; package group.goforward.ballistic.repos;
import group.goforward.ballistic.jpa.Psa; import group.goforward.ballistic.model.Psa;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID; import java.util.UUID;

View File

@@ -0,0 +1,10 @@
package group.goforward.ballistic.repos;
import group.goforward.ballistic.model.State;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface StateRepository extends JpaRepository<State, Integer> {
Optional<State> findByAbbreviation(String abbreviation);
}

View File

@@ -1,5 +1,5 @@
package group.goforward.ballistic.service; package group.goforward.ballistic.service;
import group.goforward.ballistic.jpa.Psa; import group.goforward.ballistic.model.Psa;
import group.goforward.ballistic.repos.PsaRepository; import group.goforward.ballistic.repos.PsaRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@@ -0,0 +1,16 @@
package group.goforward.ballistic.service;
import group.goforward.ballistic.model.State;
import java.util.List;
import java.util.Optional;
public interface StatesService {
List<State> findAll();
Optional<State> findById(Integer id);
State save(State item);
void deleteById(Integer id);
}

View File

@@ -0,0 +1,38 @@
package group.goforward.ballistic.service.impl;
import group.goforward.ballistic.model.State;
import group.goforward.ballistic.repos.StateRepository;
import group.goforward.ballistic.service.StatesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class StatesServiceImpl implements StatesService {
@Autowired
private StateRepository repo;
@Override
public List<State> findAll() {
return repo.findAll();
}
@Override
public Optional<State> findById(Integer id) {
return repo.findById(id);
}
@Override
public State save(State item) {
return null;
}
@Override
public void deleteById(Integer id) {
deleteById(id);
}
}