Почтовый кабинет: регистрация, папки, черновики, вложения, грид @jambotron/aria-grid, интерфейс по synthwave-шаблону
Бэкенд: регистрация со входом сразу и /api/config, профиль и смена пароля, свои папки, PATCH письма (прочитано, флажок, перенос; Спам ставит отметку), корзина и очистка, черновики, несколько адресатов и копия, вложения черновика уходят с письмом, вложения и заголовки To/Cc входящих сохраняются, письма заблокированных — в Спам. Исправлено: загрузка файла (415), колонка content_id (500 на любых вложениях), SPA-маршрут с точкой. Фронтенд переписан: все таблицы — грид, оформление — шаблон synthwave-design-showcase.html. α Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -51,7 +51,7 @@ public class SecurityConfig {
|
||||
.exceptionHandling(e -> e.authenticationEntryPoint(new HttpStatusServerEntryPoint(HttpStatus.UNAUTHORIZED)))
|
||||
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
|
||||
.authorizeExchange(exchange -> exchange
|
||||
.pathMatchers("/api/login", "/api/register", "/actuator/health").permitAll()
|
||||
.pathMatchers("/api/login", "/api/register", "/api/config", "/actuator/health").permitAll()
|
||||
.pathMatchers("/api/**", "/actuator/**").authenticated()
|
||||
// the web client (static files, SPA routes)
|
||||
.anyExchange().permitAll()
|
||||
|
||||
@@ -7,7 +7,10 @@ import org.springframework.web.server.WebFilter;
|
||||
import org.springframework.web.server.WebFilterChain;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
/** Angular routes (/inbox, /message/5, …) are pages of the web client: serve index.html for them. */
|
||||
/**
|
||||
* Angular routes (/inbox, /message/5, /compose;to=a@b.c …) are pages of the web client: serve index.html for them.
|
||||
* A last segment with a dot (before matrix parameters) is a file.
|
||||
*/
|
||||
@Component
|
||||
@Order(-100)
|
||||
public class SpaWebFilter implements WebFilter {
|
||||
@@ -17,7 +20,7 @@ public class SpaWebFilter implements WebFilter {
|
||||
String path = exchange.getRequest().getPath().pathWithinApplication().value();
|
||||
boolean page = exchange.getRequest().getMethod().matches("GET")
|
||||
&& !path.startsWith("/api") && !path.startsWith("/actuator")
|
||||
&& !path.equals("/") && !path.substring(path.lastIndexOf('/') + 1).contains(".");
|
||||
&& !path.equals("/") && !path.substring(path.lastIndexOf('/') + 1).split(";")[0].contains(".");
|
||||
if (page) {
|
||||
return chain.filter(exchange.mutate().request(exchange.getRequest().mutate().path("/index.html").build()).build());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user