Skip to content

Commit

Permalink
Refactor project structure for a better development (#3552)
Browse files Browse the repository at this point in the history
#### What type of PR is this?

/kind cleanup
/area core

#### What this PR does / why we need it:

This PR totally refactor project structure for a better plugin development. Now we can maintain and publish api and platform modules at Halo application side, which will be references by plugins.

Currently, we can execute command `./gradlew clean publish` to publish api and platform modules into **local** Maven repository, so that we can refer these dependencies (`run.halo.tools.platform:plugin:2.4.0-SNAPSHOT` and `run.halo.app:api:2.4.0-SNAPSHOT`) in plugin projects. 

I will make another pull request to publish api library and platforms into Maven central repository.

**Modules explanation**:
- API module contains common classes which might be used by plugins.
- Plugin Platform module contains dependency declarations of other plugin API modules.
- Application Platform module contains dependency declarations application module might uses.

If we want to build application only(exclude check and jar), we have to execute the command below:

```bash
./gradlew clean :application:build -x :application:check -x :application:jar
```

The executable Jar will be generated at folder `application/build/libs/`.

If we want to build a Docker image, we could execute the command below:

```bash
docker build -t johnniang/halo:project-structure .

# Test the Docker image
docker run -it --rm -p8090:8090 johnniang/halo:project-structure
```

#### Which issue(s) this PR fixes:

Fixes #2730

#### Special notes for your reviewer:

#### Does this PR introduce a user-facing change?

```release-note
重构项目结构
```
  • Loading branch information
JohnNiang authored Mar 23, 2023
1 parent 7ca5270 commit c400c85
Show file tree
Hide file tree
Showing 715 changed files with 596 additions and 466 deletions.
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
console
.github
.git
12 changes: 6 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ logs/

### Gradle
.gradle
/build/
/out/
build/
out/
!gradle/wrapper/gradle-wrapper.jar
bin/

Expand Down Expand Up @@ -71,7 +71,7 @@ application-local.yaml
application-local.properties

### Zip file for test
!src/test/resources/themes/*.zip
!src/main/resources/themes/*.zip
src/main/resources/console/
src/main/resources/presets/
!application/src/test/resources/themes/*.zip
!application/src/main/resources/themes/*.zip
application/src/main/resources/console/
application/src/main/resources/presets/
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=build/libs/halo-*.jar
ARG JAR_FILE=application/build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

Expand Down
81 changes: 81 additions & 0 deletions api/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
plugins {
id 'java-library'
id 'maven-publish'
id "io.freefair.lombok" version "8.0.0-rc2"
}

group = 'run.halo.app'
description = 'API of halo project, connecting by other projects.'

repositories {
mavenCentral()
}

dependencies {
api platform(project(':platform:application'))

api 'org.springframework.boot:spring-boot-starter-actuator'
api 'org.springframework.boot:spring-boot-starter-data-jpa'
api 'org.springframework.boot:spring-boot-starter-mail'
api 'org.springframework.boot:spring-boot-starter-thymeleaf'
api 'org.springframework.boot:spring-boot-starter-webflux'
api 'org.springframework.boot:spring-boot-starter-validation'
api 'org.springframework.boot:spring-boot-starter-data-r2dbc'

// Spring Security
api 'org.springframework.boot:spring-boot-starter-security'
api 'org.springframework.security:spring-security-oauth2-jose'
api 'org.springframework.security:spring-security-oauth2-client'
api 'org.springframework.security:spring-security-oauth2-resource-server'

api "org.springdoc:springdoc-openapi-starter-webflux-ui"
api 'org.openapi4j:openapi-schema-validator'
api "net.bytebuddy:byte-buddy"

// Apache Lucene
api "org.apache.lucene:lucene-core"
api "org.apache.lucene:lucene-queryparser"
api "org.apache.lucene:lucene-highlighter"
api "org.apache.lucene:lucene-backward-codecs"
api 'cn.shenyanchao.ik-analyzer:ik-analyzer'

api "org.apache.commons:commons-lang3"
api "io.seruco.encoding:base62"
api "org.pf4j:pf4j"
api "com.google.guava:guava"
api "org.jsoup:jsoup"
api "io.github.java-diff-utils:java-diff-utils"
api "org.springframework.integration:spring-integration-core"
api "com.github.java-json-tools:json-patch"
api "org.thymeleaf.extras:thymeleaf-extras-springsecurity6"

runtimeOnly 'io.r2dbc:r2dbc-h2'
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'org.postgresql:r2dbc-postgresql'
runtimeOnly 'org.mariadb:r2dbc-mariadb'
runtimeOnly 'com.github.jasync-sql:jasync-r2dbc-mysql'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'io.projectreactor:reactor-test'
}

java {
withSourcesJar()
withJavadocJar()
}

tasks.named('test') {
useJUnitPlatform()
}

publishing {
publications {
library(MavenPublication) {
from components.java
}
}
repositories {
mavenLocal()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.pf4j.ExtensionPoint;
import reactor.core.publisher.Mono;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.Extension;
import run.halo.app.extension.Ref;

/**
Expand All @@ -11,7 +11,7 @@
* @author guqing
* @since 2.0.0
*/
public interface CommentSubject<T extends AbstractExtension> extends ExtensionPoint {
public interface CommentSubject<T extends Extension> extends ExtensionPoint {

Mono<T> get(String name);

Expand Down
41 changes: 41 additions & 0 deletions api/src/main/java/run/halo/app/core/extension/Counter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package run.halo.app.core.extension;

import lombok.Data;
import lombok.EqualsAndHashCode;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK;
import run.halo.app.extension.Metadata;

/**
* A counter for number of requests by extension resource name.
*
* @author guqing
* @since 2.0.0
*/
@Data
@GVK(group = "metrics.halo.run", version = "v1alpha1", kind = "Counter", plural = "counters",
singular = "counter")
@EqualsAndHashCode(callSuper = true)
public class Counter extends AbstractExtension {

private Integer visit;

private Integer upvote;

private Integer downvote;

private Integer totalComment;

private Integer approvedComment;

public static Counter emptyCounter(String name) {
Counter counter = new Counter();
counter.setMetadata(new Metadata());
counter.getMetadata().setName(name);
counter.setUpvote(0);
counter.setTotalComment(0);
counter.setApprovedComment(0);
counter.setVisit(0);
return counter;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
import lombok.EqualsAndHashCode;
import lombok.ToString;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.ExtensionUtil;
import run.halo.app.extension.GVK;
import run.halo.app.extension.GroupVersionKind;
import run.halo.app.extension.MetadataOperator;
import run.halo.app.extension.MetadataUtil;
import run.halo.app.infra.ConditionList;

/**
Expand Down Expand Up @@ -255,11 +255,6 @@ public Builder published(Boolean published) {
return this;
}

/**
* Build compact post.
*
* @return a compact post
*/
public CompactPost build() {
CompactPost compactPost = new CompactPost();
compactPost.setName(name);
Expand All @@ -271,7 +266,7 @@ public CompactPost build() {
}

public static void changePublishedState(Post post, boolean value) {
Map<String, String> labels = ExtensionUtil.nullSafeLabels(post);
Map<String, String> labels = MetadataUtil.nullSafeLabels(post);
labels.put(PUBLISHED_LABEL, String.valueOf(value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
import lombok.EqualsAndHashCode;
import lombok.ToString;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.ExtensionUtil;
import run.halo.app.extension.GVK;
import run.halo.app.extension.GroupVersionKind;
import run.halo.app.extension.MetadataUtil;

/**
* <p>Single page extension.</p>
Expand Down Expand Up @@ -112,7 +112,7 @@ public static class SinglePageStatus extends Post.PostStatus {
}

public static void changePublishedState(SinglePage page, boolean value) {
Map<String, String> labels = ExtensionUtil.nullSafeLabels(page);
Map<String, String> labels = MetadataUtil.nullSafeLabels(page);
labels.put(PUBLISHED_LABEL, String.valueOf(value));
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
package run.halo.app.core.extension.content;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.Instant;
import java.util.LinkedHashSet;
import java.util.Set;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import run.halo.app.content.ContentWrapper;
import run.halo.app.content.PatchUtils;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK;
import run.halo.app.extension.Ref;
Expand Down Expand Up @@ -69,27 +65,4 @@ public static void addContributor(Snapshot snapshot, String name) {
contributors.add(name);
}

@JsonIgnore
public ContentWrapper applyPatch(Snapshot baseSnapshot) {
Assert.notNull(baseSnapshot, "The baseSnapshot must not be null.");
String baseSnapshotName = baseSnapshot.getMetadata().getName();
if (StringUtils.equals(getMetadata().getName(), baseSnapshotName)) {
return ContentWrapper.builder()
.snapshotName(this.getMetadata().getName())
.raw(this.spec.rawPatch)
.content(this.spec.contentPatch)
.rawType(this.spec.rawType)
.build();
}
String patchedContent =
PatchUtils.applyPatch(baseSnapshot.getSpec().getContentPatch(), this.spec.contentPatch);
String patchedRaw =
PatchUtils.applyPatch(baseSnapshot.getSpec().getRawPatch(), this.spec.rawPatch);
return ContentWrapper.builder()
.snapshotName(this.getMetadata().getName())
.raw(patchedRaw)
.content(patchedContent)
.rawType(this.spec.rawType)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,21 @@
/**
* ExtensionClient is an interface which contains some operations on Extension instead of
* ExtensionStore.
* <br/><br/>
* Please note that this client can only use in non-reactive environment. If you want to
* use Extension client in reactive environment, please use {@link ReactiveExtensionClient} instead.
*
* @author johnniang
* @apiNote Please note that this client can only use in non-reactive environment. If you want to
* use Extension client in reactive environment, please use {@link ReactiveExtensionClient} instead.
*/
public interface ExtensionClient {

/**
* Lists Extensions by Extension type, filter and sorter.
*
* @param type is the class type of Extension.
* @param predicate filters the reEnqueue.
* @param type is the class type of Extension.
* @param predicate filters the reEnqueue.
* @param comparator sorts the reEnqueue.
* @param <E> is Extension type.
* @param <E> is Extension type.
* @return all filtered and sorted Extensions.
*/
<E extends Extension> List<E> list(Class<E> type, Predicate<E> predicate,
Expand All @@ -30,12 +31,12 @@ <E extends Extension> List<E> list(Class<E> type, Predicate<E> predicate,
/**
* Lists Extensions by Extension type, filter, sorter and page info.
*
* @param type is the class type of Extension.
* @param predicate filters the reEnqueue.
* @param type is the class type of Extension.
* @param predicate filters the reEnqueue.
* @param comparator sorts the reEnqueue.
* @param page is page number which starts from 0.
* @param size is page size.
* @param <E> is Extension type.
* @param page is page number which starts from 0.
* @param size is page size.
* @param <E> is Extension type.
* @return a list of Extensions.
*/
<E extends Extension> ListResult<E> list(Class<E> type, Predicate<E> predicate,
Expand All @@ -46,7 +47,7 @@ <E extends Extension> ListResult<E> list(Class<E> type, Predicate<E> predicate,
*
* @param type is Extension type.
* @param name is Extension name.
* @param <E> is Extension type.
* @param <E> is Extension type.
* @return an optional Extension.
*/
<E extends Extension> Optional<E> fetch(Class<E> type, String name);
Expand All @@ -58,26 +59,26 @@ <E extends Extension> ListResult<E> list(Class<E> type, Predicate<E> predicate,
* Creates an Extension.
*
* @param extension is fresh Extension to be created. Please make sure the Extension name does
* not exist.
* @param <E> is Extension type.
* not exist.
* @param <E> is Extension type.
*/
<E extends Extension> void create(E extension);

/**
* Updates an Extension.
*
* @param extension is an Extension to be updated. Please make sure the resource version is
* latest.
* @param <E> is Extension type.
* latest.
* @param <E> is Extension type.
*/
<E extends Extension> void update(E extension);

/**
* Deletes an Extension.
*
* @param extension is an Extension to be deleted. Please make sure the resource version is
* latest.
* @param <E> is Extension type.
* latest.
* @param <E> is Extension type.
*/
<E extends Extension> void delete(E extension);

Expand Down
Loading

0 comments on commit c400c85

Please sign in to comment.