initial commit this project for test architecture

This commit is contained in:
esmailian
2025-04-27 10:05:22 +03:30
commit c952a566b7
14 changed files with 416 additions and 0 deletions

145
pom.xml Executable file
View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.mmad.testapp</groupId>
<artifactId>testMicroservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>microservice-a</name>
<description>microservice-a</description>
<properties>
<java.version>17</java.version>
<org.projectlombok.version>1.18.20</org.projectlombok.version>
<org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version> 4.29.2</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- <optional>true</optional>-->
<!-- </dependency>-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<scope>test</scope>
<version>4.5.14</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-amqp</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.1</version> <!-- Or latest compatible version -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.9.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,15 @@
package com.example.mmad.testapp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class TestAAppApplication {
public static void main(String[] args) {
SpringApplication.run(TestAAppApplication.class, args);
}
}

View File

@ -0,0 +1,50 @@
package com.example.mmad.testapp.controller;
import com.example.mmad.testapp.model.PersonModel;
import com.example.mmad.testapp.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/person")
public class PersonController {
private PersonService personService;
@Autowired
public void setPersonService(PersonService personService) {
this.personService = personService;
}
@PostMapping("/list")
@ResponseStatus(HttpStatus.OK)
public String listPosts() {
return "aaa";
}
@CrossOrigin(origins = "http://localhost:3001")
@PostMapping("/create")
public ResponseEntity<?> create(@Valid @RequestBody PersonModel person) {
return ResponseEntity.ok(personService.createPerson(person));
}
@PostMapping("/update")
public ResponseEntity<?> update(@Valid @RequestBody PersonModel person) {
return ResponseEntity.ok(personService.updatePerson(person));
}
@PostMapping("/get/{id}")
public ResponseEntity<?> getPerson(@PathVariable Long id) {
return ResponseEntity.ok(personService.getPerson(id));
}
@PostMapping("/delete/{id}")
public ResponseEntity<?> deletePerson(@PathVariable Long id) {
personService.deletePerson(id);
return ResponseEntity.ok("ok");
}
}

View File

@ -0,0 +1,25 @@
package com.example.mmad.testapp.entity;
import jakarta.persistence.*;
import lombok.*;
import static jakarta.persistence.GenerationType.SEQUENCE;
@Entity
@Getter
@Setter
@Table(schema = "testapp", name = "person")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonEntity {
@Id
@SequenceGenerator(name = "seqTest", sequenceName = "testapp.person_seq", allocationSize = 1)
@GeneratedValue(strategy = SEQUENCE, generator = "seqTest")
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
}

View File

@ -0,0 +1,26 @@
package com.example.mmad.testapp.mapper;
import com.example.mmad.testapp.entity.PersonEntity;
import com.example.mmad.testapp.model.PersonModel;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueMappingStrategy;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL
, componentModel = "spring"
)
public interface PersonMapper {
static PersonMapper get() {
return Mappers.getMapper(PersonMapper.class);
}
PersonModel entityToModel(PersonEntity entity);
PersonEntity modelToEntity(PersonModel model);
List<PersonModel> entitiesToModels(List<PersonEntity> entityList);
}

View File

@ -0,0 +1,12 @@
package com.example.mmad.testapp.model;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PersonModel {
private Long id;
private String firstName;
private String lastName;
}

View File

@ -0,0 +1,22 @@
package com.example.mmad.testapp.repository;
import com.example.mmad.testapp.entity.PersonEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonRepository extends JpaRepository<PersonEntity, Long> {
@Query(value = "select id,first_name,last_name from mmaddb.testapp.person where id =:id", nativeQuery = true)
PersonEntity gerPersonById(Long id);
@Modifying
@Query(value = "delete from mmaddb.testapp.person where id=:id", nativeQuery = true)
void deleteById(Long id);
@Modifying
@Query(value = "update mmaddb.testapp.person set first_name=:firstName, last_name=:lastName where id = :id",nativeQuery = true)
void updatePersonById(String firstName,String lastName,Long id);
}

View File

@ -0,0 +1,41 @@
package com.example.mmad.testapp.service;
import com.example.mmad.testapp.entity.PersonEntity;
import com.example.mmad.testapp.mapper.PersonMapper;
import com.example.mmad.testapp.model.PersonModel;
import com.example.mmad.testapp.repository.PersonRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class PersonService {
private final PersonRepository personRepository;
public PersonService(PersonRepository personRepository) {
this.personRepository = personRepository;
}
@Transactional(rollbackFor = Exception.class)
public PersonModel createPerson(PersonModel person) {
PersonEntity entity = PersonMapper.get().modelToEntity(person);
personRepository.save(entity);
return PersonMapper.get().entityToModel(entity);
}
@Transactional(readOnly = true)
public PersonModel getPerson(Long id) {
return PersonMapper.get().entityToModel(personRepository.gerPersonById(id));
}
@Transactional(rollbackFor = Exception.class)
public void deletePerson(Long id) {
personRepository.deleteById(id);
}
@Transactional(rollbackFor = Exception.class)
public PersonModel updatePerson(PersonModel model) {
personRepository.updatePersonById(model.getFirstName(), model.getLastName(), model.getId());
return PersonMapper.get().entityToModel(personRepository.gerPersonById(model.getId()));
}
}

12
src/main/java/seq-query Executable file
View File

@ -0,0 +1,12 @@
CREATE SEQUENCE testapp.person_seq
as bigint
INCREMENT 1
START 2
MINVALUE 2
MAXVALUE 2800
OWNED BY testapp.person.id;
ALTER SEQUENCE testapp.person_seq
OWNER TO mmad;

View File

@ -0,0 +1,5 @@
spring.application.name=service-b
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
spring.config.import=configserver:http://localhost:8888/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<property name="now" value="sysdate" dbms="oracle"/>
<property name="now" value="now()" dbms="postgresql"/>
<changeSet id="1.1-1-mmad" author="mmad">
<insert schemaName="testapp" tableName="person">
<column name="id" value="1"/>
<column name="first_name" value="mohammad"/>
<column name="last_name" value="Reza"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<property name="now" value="sysdate" dbms="oracle"/>
<property name="now" value="now()" dbms="postgresql"/>
<changeSet id="1.2-1-mmad" author="mmad">
<createTable schemaName="testapp" tableName="person" remarks="اشخاص">
<column name="id" type="bigint" remarks="شناسه اشخاص ">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_person_id"/>
</column>
<column name="first_name" type="VARCHAR(255)" remarks="نام"/>
<column name="last_name" type="VARCHAR(255)" remarks="نام خانوادگی"/>
</createTable>
</changeSet>
</databaseChangeLog>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<include file="changes/liquibase-1.2.xml" relativeToChangelogFile="true"/>
<include file="changes/liquibase-1.1.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@ -0,0 +1,13 @@
package com.example.mmad.testapp;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TestAppApplicationTests {
@Test
void contextLoads() {
}
}