Skip to content

Commit

Permalink
Merge branch 'main' into feat/widgets-permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
ruibaby committed Jun 26, 2023
2 parents 9615bac + 96225e4 commit dca91d8
Show file tree
Hide file tree
Showing 40 changed files with 777 additions and 842 deletions.
Expand Up @@ -10,6 +10,8 @@
import static org.springdoc.core.fn.builders.requestbody.Builder.requestBodyBuilder;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.github.resilience4j.ratelimiter.RateLimiterRegistry;
import io.github.resilience4j.reactor.ratelimiter.operator.RateLimiterOperator;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
Expand All @@ -20,6 +22,7 @@
import org.apache.commons.lang3.StringUtils;
import org.springdoc.core.fn.builders.schema.Builder;
import org.springdoc.webflux.core.fn.SpringdocRouteBuilder;
import org.springframework.context.MessageSource;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -65,6 +68,8 @@ public class CommentFinderEndpoint implements CustomEndpoint {
private final CommentService commentService;
private final ReplyService replyService;
private final SystemConfigurableEnvironmentFetcher environmentFetcher;
private final RateLimiterRegistry rateLimiterRegistry;
private final MessageSource messageSource;

@Override
public RouterFunction<ServerResponse> endpoint() {
Expand Down Expand Up @@ -152,9 +157,17 @@ Mono<ServerResponse> createComment(ServerRequest request) {
comment.getSpec().setUserAgent(HaloUtils.userAgentFrom(request));
return commentService.create(comment);
})
.transformDeferred(createIpBasedRateLimiter(request))
.flatMap(comment -> ServerResponse.ok().bodyValue(comment));
}

private <T> RateLimiterOperator<T> createIpBasedRateLimiter(ServerRequest request) {
var clientIp = IpAddressUtils.getIpAddress(request);
var rateLimiter = rateLimiterRegistry.rateLimiter("comment-creation-from-ip-" + clientIp,
"comment-creation");
return RateLimiterOperator.of(rateLimiter);
}

Mono<ServerResponse> createReply(ServerRequest request) {
String commentName = request.pathVariable("name");
return request.bodyToMono(ReplyRequest.class)
Expand Down
5 changes: 5 additions & 0 deletions application/src/main/resources/application.yaml
Expand Up @@ -73,3 +73,8 @@ resilience4j.ratelimiter:
limitForPeriod: 3
limitRefreshPeriod: 1m
timeoutDuration: 0
comment-creation:
limitForPeriod: 10
limitRefreshPeriod: 1m
timeoutDuration: 10s

Expand Up @@ -3,12 +3,17 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import io.github.resilience4j.ratelimiter.RateLimiter;
import io.github.resilience4j.ratelimiter.RateLimiterConfig;
import io.github.resilience4j.ratelimiter.RateLimiterRegistry;
import java.time.Duration;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -54,6 +59,9 @@ class CommentFinderEndpointTest {
@Mock
private ReplyService replyService;

@Mock
private RateLimiterRegistry rateLimiterRegistry;

@InjectMocks
private CommentFinderEndpoint commentFinderEndpoint;

Expand Down Expand Up @@ -132,6 +140,15 @@ void listCommentReplies() {
void createComment() {
when(commentService.create(any())).thenReturn(Mono.empty());

RateLimiterConfig config = RateLimiterConfig.custom()
.limitForPeriod(10)
.limitRefreshPeriod(Duration.ofSeconds(1))
.timeoutDuration(Duration.ofSeconds(10))
.build();
RateLimiter rateLimiter = RateLimiter.of("comment-creation-from-ip-" + "0:0:0:0:0:0:0:0",
config);
when(rateLimiterRegistry.rateLimiter(anyString(), anyString())).thenReturn(rateLimiter);

final CommentRequest commentRequest = new CommentRequest();
Ref ref = new Ref();
ref.setGroup("content.halo.run");
Expand Down
3 changes: 3 additions & 0 deletions console/.eslintrc.cjs
Expand Up @@ -23,4 +23,7 @@ module.exports = {
extends: ["plugin:cypress/recommended"],
},
],
parserOptions: {
ecmaVersion: "latest",
},
};
1 change: 1 addition & 0 deletions console/env.d.ts
@@ -1,4 +1,5 @@
/// <reference types="vite/client" />
/// <reference types="unplugin-icons/types/vue" />

export {};

Expand Down
19 changes: 10 additions & 9 deletions console/package.json
Expand Up @@ -94,7 +94,7 @@
"vue": "^3.2.45",
"vue-demi": "^0.13.11",
"vue-grid-layout": "3.0.0-beta1",
"vue-i18n": "^9.2.2",
"vue-i18n": "9.3.0-beta.19",
"vue-router": "^4.1.6",
"vuedraggable": "^4.1.0"
},
Expand All @@ -103,9 +103,10 @@
"@iconify-json/mdi": "^1.1.50",
"@iconify-json/vscode-icons": "^1.1.22",
"@intlify/unplugin-vue-i18n": "^0.9.3",
"@rushstack/eslint-patch": "^1.2.0",
"@rushstack/eslint-patch": "^1.3.2",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/container-queries": "^0.1.0",
"@tsconfig/node18": "^2.0.1",
"@types/jsdom": "^20.0.1",
"@types/lodash.clonedeep": "4.5.7",
"@types/lodash.debounce": "^4.0.7",
Expand All @@ -115,19 +116,19 @@
"@types/qs": "^6.9.7",
"@types/randomstring": "^1.1.8",
"@vitejs/plugin-vue": "^4.0.0",
"@vitejs/plugin-vue-jsx": "^3.0.0",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vitest/ui": "^0.25.3",
"@vue/compiler-sfc": "^3.2.45",
"@vue/eslint-config-prettier": "^7.1.0",
"@vue/eslint-config-typescript": "^11.0.3",
"@vue/test-utils": "^2.2.4",
"@vue/tsconfig": "^0.1.3",
"@vue/test-utils": "^2.3.2",
"@vue/tsconfig": "^0.4.0",
"autoprefixer": "^10.4.14",
"c8": "^7.12.0",
"cypress": "^10.11.0",
"eslint": "^8.41.0",
"eslint": "^8.43.0",
"eslint-plugin-cypress": "^2.13.3",
"eslint-plugin-vue": "^9.13.0",
"eslint-plugin-vue": "^9.15.0",
"husky": "^8.0.3",
"jsdom": "^20.0.3",
"lint-staged": "^13.2.2",
Expand All @@ -141,7 +142,7 @@
"tailwindcss": "^3.2.7",
"tailwindcss-safe-area": "^0.2.2",
"tailwindcss-themer": "^2.0.3",
"typescript": "~4.7.4",
"typescript": "~5.0.4",
"unplugin-icons": "^0.14.15",
"vite": "^4.0.4",
"vite-compression-plugin": "^0.0.4",
Expand All @@ -150,6 +151,6 @@
"vite-plugin-pwa": "^0.13.3",
"vite-plugin-static-copy": "^0.11.1",
"vitest": "^0.25.3",
"vue-tsc": "^1.0.24"
"vue-tsc": "^1.8.1"
}
}
1 change: 1 addition & 0 deletions console/packages/components/env.d.ts
@@ -1,5 +1,6 @@
/// <reference types="vite/client" />
/// <reference types="histoire" />
/// <reference types="unplugin-icons/types/vue" />

declare module "*.vue" {
import type { DefineComponent } from "vue";
Expand Down
2 changes: 1 addition & 1 deletion console/packages/components/package.json
Expand Up @@ -48,7 +48,7 @@
"@iconify-json/ri": "^1.1.4",
"histoire": "^0.11.7",
"unplugin-icons": "^0.14.14",
"vite-plugin-dts": "^1.7.3"
"vite-plugin-dts": "^2.3.0"
},
"peerDependencies": {
"vue": "^3.2.37",
Expand Down
4 changes: 4 additions & 0 deletions console/packages/components/src/components/button/Button.vue
Expand Up @@ -123,6 +123,10 @@ function handleClick() {
.btn-default {
border: 1px solid #d9d9d9;
&:hover {
@apply bg-gray-100;
}
.btn-icon {
@apply text-secondary;
}
Expand Down
@@ -1,6 +1,6 @@
export type Type = "success" | "info" | "warning" | "error";
export const DialogProviderProvideKey = "DIALOG_PROVIDER_PROVIDE_KEY";
import type { Type as ButtonType } from "@/components/button/interface";
import type { Type as ButtonType } from "../button/interface";

export interface useDialogOptions {
type?: Type;
Expand Down
2 changes: 1 addition & 1 deletion console/packages/components/tsconfig.app.json
@@ -1,5 +1,5 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
Expand Down
2 changes: 1 addition & 1 deletion console/packages/components/tsconfig.json
Expand Up @@ -2,7 +2,7 @@
"files": [],
"references": [
{
"path": "./tsconfig.vite-config.json"
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
Expand Down
9 changes: 9 additions & 0 deletions console/packages/components/tsconfig.node.json
@@ -0,0 +1,9 @@
{
"extends": "@tsconfig/node18/tsconfig.json",
"include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
"compilerOptions": {
"composite": true,
"module": "ESNext",
"types": ["node"]
}
}
8 changes: 0 additions & 8 deletions console/packages/components/tsconfig.vite-config.json

This file was deleted.

5 changes: 3 additions & 2 deletions console/packages/components/vite.config.ts
@@ -1,6 +1,6 @@
import { fileURLToPath, URL } from "url";

import { defineConfig } from "vite";
import { defineConfig, type Plugin } from "vite";
import Vue from "@vitejs/plugin-vue";
import VueJsx from "@vitejs/plugin-vue-jsx";
import Icons from "unplugin-icons/vite";
Expand All @@ -13,10 +13,11 @@ export default defineConfig({
VueJsx(),
Icons({ compiler: "vue3" }),
Dts({
tsConfigFilePath: "./tsconfig.app.json",
entryRoot: "./src",
outputDir: "./dist",
insertTypesEntry: true,
}),
}) as Plugin,
],
define: {
"process.env": process.env,
Expand Down
2 changes: 1 addition & 1 deletion console/packages/shared/env.d.ts
Expand Up @@ -2,9 +2,9 @@

export {};

import type { Component } from "vue";
import type { CoreMenuGroupId } from "./src/types/menus";


declare module "*.vue" {
import type { DefineComponent } from "vue";
// eslint-disable-next-line
Expand Down
5 changes: 4 additions & 1 deletion console/packages/shared/package.json
Expand Up @@ -38,10 +38,13 @@
"homepage": "https://github.com/halo-dev/console/tree/main/packages/shared#readme",
"license": "MIT",
"devDependencies": {
"vite-plugin-dts": "^1.7.3"
"vite-plugin-dts": "^2.3.0"
},
"peerDependencies": {
"vue": "^3.2.37",
"vue-router": "^4.0.16"
},
"dependencies": {
"@halo-dev/api-client": "workspace:*"
}
}
2 changes: 1 addition & 1 deletion console/packages/shared/tsconfig.app.json
@@ -1,5 +1,5 @@
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
Expand Down
2 changes: 1 addition & 1 deletion console/packages/shared/tsconfig.json
Expand Up @@ -2,7 +2,7 @@
"files": [],
"references": [
{
"path": "./tsconfig.vite-config.json"
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
Expand Down
9 changes: 9 additions & 0 deletions console/packages/shared/tsconfig.node.json
@@ -0,0 +1,9 @@
{
"extends": "@tsconfig/node18/tsconfig.json",
"include": ["vite.config.*", "vitest.config.*", "cypress.config.*"],
"compilerOptions": {
"composite": true,
"module": "ESNext",
"types": ["node"]
}
}
8 changes: 0 additions & 8 deletions console/packages/shared/tsconfig.vite-config.json

This file was deleted.

1 change: 1 addition & 0 deletions console/packages/shared/vite.config.ts
Expand Up @@ -11,6 +11,7 @@ export default defineConfig({
Vue(),
VueJsx(),
Dts({
tsConfigFilePath: "./tsconfig.app.json",
entryRoot: "./src",
outputDir: "./dist",
insertTypesEntry: true,
Expand Down

0 comments on commit dca91d8

Please sign in to comment.