Skip to content

Commit

Permalink
Adapt AList basically (#2)
Browse files Browse the repository at this point in the history
完成项目基本功能,后续进行代码重构和测试

```release-note
None
```
  • Loading branch information
Roozenlz authored Jul 31, 2024
1 parent 62d3f4a commit 126f895
Show file tree
Hide file tree
Showing 29 changed files with 2,956 additions and 1,932 deletions.
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,30 @@

AList 存储库插件,支持创建 AList 类型的存储库

## 使用方式

首先[部署一个 AList 服务](https://alist.nn.ci/zh/guide/install/docker.html),进入后台管理,创建存储库
![](docs/img/1.png)
根据文档填写相关信息,注意这里的挂载路径
![](docs/img/2.png)
安装并启用此插件后,在 Halo 后台新建存储策略
![](docs/img/3.png)
选择 AList 存储
![](docs/img/4.png)
根据提示填写以下信息
![](docs/img/5.png)
![](docs/img/6.png)
![](docs/img/7.png)

## 注意事项
1. 插件需要依赖 AList 服务,请确保 AList 服务已经启动并配置正确
2. 如果存储验证成功但是`大文件`上传失败,可能是反向代理的配置有问题,对于 nginx 将下方配置加入你的nginx配置中
```
client_body_buffer_size 512k;
proxy_read_timeout 86400s;
client_max_body_size 0;
```
![](docs/img/8.png)
## 开发环境
插件开发的详细文档请查阅:<https://docs.halo.run/developer-guide/plugin/introduction>
Expand Down
Binary file added docs/img/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/img/8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
version=1.0.0-SNAPSHOT
version=1.0.0
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package run.halo.starter;
package run.halo.alist;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import run.halo.app.plugin.BasePlugin;
import run.halo.app.plugin.PluginContext;
Expand All @@ -9,9 +10,11 @@
* <p>This class must be public and have a public constructor.</p>
* <p>Only one main class extending {@link BasePlugin} is allowed per plugin.</p>
*
* @author guqing
* @since 1.0.0
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/3
*/
@Slf4j
@Component
public class AListPlugin extends BasePlugin {

Expand All @@ -21,16 +24,16 @@ public AListPlugin(PluginContext pluginContext) {

@Override
public void start() {
System.out.println("插件启动成功!");
log.info("AList 插件启动成功!");
}

@Override
public void stop() {
System.out.println("插件停止!");
log.info("AList 插件停止!");
}

@Override
public void delete() {
System.out.println("插件被删除!");
log.info("AList 插件被删除!");
}
}
41 changes: 41 additions & 0 deletions src/main/java/run/halo/alist/config/AListProperties.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package run.halo.alist.config;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* AList 存储策略配置
*
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/8
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AListProperties {
/**
* AList 站点地址.
*/
private String site;
/**
* AList 挂载路径.
*/
private String path;
/**
* Secret name.
*/
private String secretName;

/**
* 获取 token key.
*
* @return token key
*/
public String getTokenKey() {
return site + secretName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package run.halo.alist.controller;

import java.util.Objects;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import run.halo.alist.endpoint.AListAttachmentHandler;
import run.halo.alist.config.AListProperties;
import run.halo.alist.dto.AListResult;
import run.halo.alist.dto.response.AListStorageListRes;
import run.halo.alist.exception.AListIllegalArgumentException;
import run.halo.app.plugin.ApiVersion;

/**
* 存储策略验证控制器
*
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/10
*/
@ApiVersion("alist.storage.halo.run/v1alpha1")
@RestController
@RequiredArgsConstructor
@Slf4j
public class PolicyConfigValidationController {
private final AListAttachmentHandler handler;

@PostMapping("/configs/-/verify")
public Mono<Void> validatePolicyConfig(@RequestBody AListProperties properties) {
return handler.removeTokenCache(properties)
.then(
handler.auth(properties)
.flatMap(token -> handler.getWebClients()
.get(properties.getSite())
.get()
.uri("/api/admin/storage/list")
.header("Authorization", token)
.retrieve()
.bodyToMono(
new ParameterizedTypeReference<AListResult<AListStorageListRes>>() {
})
.flatMap(response -> {
if (response.getCode().equals("200")) {
return Flux.fromIterable(response.getData().getContent())
.filter(volume -> Objects.equals(volume.getMountPath(),
properties.getPath()))
.switchIfEmpty(Mono.error(new AListIllegalArgumentException(
"The mount path does not exist")))
.all(volume -> !volume.isDisabled())
.filter(isValid -> isValid)
.switchIfEmpty(Mono.error(new AListIllegalArgumentException(
"The storage is disabled")))
.then();
}
return Mono.error(new AListIllegalArgumentException(
"Wrong Username Or Password"));
}))
);
}
}

22 changes: 22 additions & 0 deletions src/main/java/run/halo/alist/dto/AListResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package run.halo.alist.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* AList 接口返回结果
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/8
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AListResult <T>{
private String code;
private String message;
private T data;
}
23 changes: 23 additions & 0 deletions src/main/java/run/halo/alist/dto/request/AListGetFileInfoReq.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package run.halo.alist.dto.request;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/10
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AListGetFileInfoReq {
private String path;
private String password;
private int page;
private int perPage;
private boolean refresh;
}
16 changes: 16 additions & 0 deletions src/main/java/run/halo/alist/dto/request/AListLoginReq.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package run.halo.alist.dto.request;

import lombok.Builder;
import lombok.Data;

/**
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/8
*/
@Data
@Builder
public class AListLoginReq {
private String password;
private String username;
}
21 changes: 21 additions & 0 deletions src/main/java/run/halo/alist/dto/request/AListRemoveFileReq.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package run.halo.alist.dto.request;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

/**
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AListRemoveFileReq {
private String dir;
private List<String> names;
}
34 changes: 34 additions & 0 deletions src/main/java/run/halo/alist/dto/response/AListGetFileInfoRes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package run.halo.alist.dto.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.OffsetDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/10
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AListGetFileInfoRes {
private String name;
private long size;
private boolean isDir;
private OffsetDateTime modified;
private OffsetDateTime created;
private String sign;
private String thumb;
private int type;
@JsonProperty("raw_url")
private String rawUrl;
private String readme;
private String header;
private String provider;
private Object related;
}
19 changes: 19 additions & 0 deletions src/main/java/run/halo/alist/dto/response/AListLoginRes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package run.halo.alist.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* @author <a href="https://roozen.top">Roozen</a>
* @version 1.0
* 2024/7/8
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AListLoginRes {
private String token;
}
Loading

0 comments on commit 126f895

Please sign in to comment.