Coke DTO components, unified response

Cola DTO component, unified response

Response content

1. Response failed
2.Single piece of data
3.Multiple pieces of data
4. Paging data

Domain Model

@Getter
@AllArgsConstructor
public enum CatType {<!-- -->
    CHINA("Chinese Pastoral Cat"),
    PERSIAN("Persian cat"),
    TOMCAT("Tom Cat");

    private final String desc;
}
@Entity
@Table(name = "tbl_cat")
@Data
@Accessors(chain = true)
@FieldNameConstants
public class Cat {<!-- -->
    @Id
    private Long id;
    
    @Enumerated(EnumType.STRING)
    private CatType type;

    private String name;

    private Long sellerId;
}
@Entity
@Table(name = "tbl_seller")
@Data
@Accessors(chain = true)
@FieldNameConstants
public class Seller {<!-- -->
    @Id
    private Long id;
    private String name;
    private String address;
}

Warehouse

@Repository
public interface CatRepository extends JpaRepository<Cat, Long>, QuerydslPredicateExecutor<Cat> {<!-- -->
}
@Repository
public interface SellerRepository extends JpaRepository<Seller, Long>, QuerydslPredicateExecutor<Seller> {<!-- -->
}

Service

@Slf4j
@Service
@RequiredArgsConstructor
public class CatService {<!-- -->
    private final CatRepository catRepository;

    public Cat saveCat(Cat cat) {<!-- -->
        return catRepository.save(cat);
    }

    public List<Cat> saveAll(List<Cat> cats) {<!-- -->
        return catRepository.saveAll(cats);
    }
}
@Service
@Slf4j
@RequiredArgsConstructor
public class SellerService {<!-- -->
    private final SellerRepository sellerRepository;

    public Seller saveSeller(Seller seller) {<!-- -->
        return sellerRepository.save(seller);
    }

    public List<Seller> findSellers() {<!-- -->
        return sellerRepository.findAll();
    }
}

Appearance

@Service
@Slf4j
@RequiredArgsConstructor
public class SellCatFacade {<!-- -->
    private final CatService catService;
    private final SellerService sellerService;

    @PostConstruct
    public void initData() {<!-- -->
        PodamFactory podam = new PodamFactoryImpl();

        Seller seller1 = podam.manufacturePojo(Seller.class);
        Seller seller2 = podam.manufacturePojo(Seller.class);

        sellerService.saveSeller(seller1);
        sellerService.saveSeller(seller2);
        log.info("Random initialization of 2 seller data completed");

        List<Cat> catList = new ArrayList<>();
        for (int i = 0; i < 100; i + + ) {<!-- -->
            Cat cat = podam.manufacturePojo(Cat.class);
            Long sellerId = i % 2 == 0 ? seller1.getId() : seller2.getId();
            cat.setSellerId(sellerId);
            catList.add(cat);
        }
        catService.saveAll(catList);
        log.info("Random initialization of 100 cat data completed");
    }

    public Page<List<Map<Expression<?>, ?>>> findCats(CatQry catQry, Pageable pageable) {<!-- -->
        QSeller seller = QSeller.seller;
        QCat cat = QCat.cat;

        BooleanBuilder where = new BooleanBuilder();
        Optional.ofNullable(catQry).map(CatQry::getType).ifPresent(v -> where.and(cat.type.eq(v)));

        BlazeJPAQuery<Map<Expression<?>, ?>> blazeJPAQuery = DomainFactory.create(BlazeJPAQuery.class);
        blazeJPAQuery = blazeJPAQuery
                .select(Projections.map(cat, seller))
                .from(cat)
                .leftJoin(seller).on(cat.sellerId.eq(seller.id))
                .where(where)
                .orderBy(cat.id.desc());

        long fetchCount = blazeJPAQuery.fetchCount();

        blazeJPAQuery.offset(pageable.getOffset()).limit(pageable.getPageSize());
        List<Map<Expression<?>, ?>> fetchList = blazeJPAQuery.fetch();

        return new PageImpl(fetchList, pageable, fetchCount);
    }
}

DTO

@Data
public class CatQry extends Query {<!-- -->
    private CatType type;
}

Configuration class

@Configuration
public class QueryDSLConfig {<!-- -->

    @Bean
    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {<!-- -->
        return new JPAQueryFactory(entityManager);
    }

    @Bean
    public CriteriaBuilderFactory createCriteriaBuilderFactory(EntityManagerFactory entityManagerFactory) {<!-- -->
        return Criteria.getDefault().createCriteriaBuilderFactory(entityManagerFactory);
    }

    @Bean
    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public BlazeJPAQuery<Map<Expression<?>, ?>> blazeJPAQuery(EntityManager entityManager, CriteriaBuilderFactory createCriteriaBuilderFactory) {<!-- -->
        return new BlazeJPAQuery<>(entityManager, createCriteriaBuilderFactory);
    }
}

Controller

@RestController
@RequiredArgsConstructor
public class SellCatController {<!-- -->

    private final SellCatFacade sellCatFacade;
    private final SellerService sellerService;

    @GetMapping("fail")
    public Response fail() {<!-- -->
        return SingleResponse.buildFailure("500", "Error response");
    }

    @GetMapping("findSellers")
    public Response findSellers() {<!-- -->
        List<Seller> sellers = sellerService.findSellers();
        return MultiResponse.of(sellers);
    }

    @GetMapping("getOneSeller")
    public Response getOneSeller() {<!-- -->
        Optional<Seller> any = sellerService.findSellers().stream().findAny();
        return SingleResponse.of(any);
    }

    @PostMapping("findCats")
    public Response findCats(@RequestBody CatQry catQry, @PageableDefault Pageable pageable) {<!-- -->
        Page<List<Map<Expression<?>, ?>>>> listPage = sellCatFacade.findCats(catQry, pageable);
        return PageResponse.of(listPage.getContent(), (int) listPage.getTotalElements(), listPage.getSize(), listPage.getNumber());
    }
}

Configuration file

server.port: 80
spring.application.name: colo-dto

---
spring:
  datasource:
    url: jdbc:h2:mem:test
    driver-class-name: org.h2.Driver
    username: sa
    password: Aa123456
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update

---
knife4j:
  enable: true
  openapi:
    title: COLA component
    description: "`Test`,**COLA Unified Response**"
    email: [email protected]
    Concat: Jazz
    url: https://docs.lab.com
    version: v4.0
    license: Apache 2.0
    license-url: https://docs.lab.com
    terms-of-service-url: https://docs.lab.com
    group:
      test1:
        group-name: group name
        api-rule: package
        api-rule-resources:
          - com.lab

Build files

plugins {<!-- -->
    id 'java'
    id 'org.springframework.boot' version '2.6.13'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.lab'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {<!-- -->
    compileOnly {<!-- -->
        extendsFrom annotationProcessor
    }
}

repositories {<!-- -->
    mavenLocal()
    maven {<!-- --> url 'https://maven.aliyun.com/repository/public' }
    maven {<!-- --> url 'https://maven.aliyun.com/repository/spring' }
    mavenCentral()
}

dependencies {<!-- -->
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.alibaba.cola:cola-component-domain-starter:4.3.1'
    implementation 'com.alibaba.cola:cola-component-extension-starter:4.3.1'
    implementation 'uk.co.jemos.podam:podam:7.2.11.RELEASE'

    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'com.h2database:h2:2.1.214'

    implementation 'com.querydsl:querydsl-jpa'
    annotationProcessor(
            "com.querydsl:querydsl-apt:5.0.0:jpa"
            ,"jakarta.persistence:jakarta.persistence-api",
    )
    implementation 'com.blazebit:blaze-persistence-integration-querydsl-expressions:1.6.8'
    implementation 'com.blazebit:blaze-persistence-integration-hibernate-5.6:1.6.8'
    runtimeOnly 'com.blazebit:blaze-persistence-core-impl:1.6.8'

    implementation 'com.github.xiaoymin:knife4j-openapi2-spring-boot-starter:4.1.0'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

sourceSets.main.java.srcDirs + = ['src/main/generated']

compileJava {<!-- -->
    options.annotationProcessorGeneratedSourcesDirectory(file('src/main/generated/'))
}

clean {<!-- -->
    delete '/src/main/generated'
}

tasks.named('test') {<!-- -->
    useJUnitPlatform()
}