")
}
func Cors(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Allow all origins (can restrict to specific origins)
- w.Header().Set("Access-Control-Allow-Origin", "*")
+ w.Header().Set("Access-Control-Allow-Origin", CORS_AllowOrigin)
// Allow certain HTTP methods (you can customize these as needed)
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH")
// Allow certain headers (you can add more as needed)
- w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
+ w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, X-CSRF-Token")
+ w.Header().Set("Access-Control-Allow-Credentials", "true")
// Handle OPTIONS pre-flight request
if r.Method == http.MethodOptions {
return
@@ -43,6 +48,7 @@ func main() {
port := os.Getenv("BACKEND_DOCKER_PORT")
hostname := os.Getenv("DATABASE_HOSTNAME")
postgres_port := os.Getenv("POSTGRES_DOCKER_PORT")
+ CORS_AllowOrigin = os.Getenv("CORS_AllowOrigin")
if environ == "DEV" {
port = os.Getenv("BACKEND_PORT")
hostname = "localhost"
@@ -66,6 +72,12 @@ func main() {
defer core.DB.Close()
+ CSRFMiddleware := csrf.Protect(
+ core.CSRF_KEY,
+ csrf.Secure(environ != "DEV"),
+ csrf.HttpOnly(true),
+ )
+
mux := http.NewServeMux()
core.HandleRoutes(mux, map[string]core.Handler{
@@ -108,6 +120,14 @@ func main() {
Handler: api.HandleVerifyMedia,
Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT},
},
+ "/contact": {
+ Handler: api.HandleContact,
+ Middlewares: []core.Middleware{api.Methods("POST"), CSRFMiddleware},
+ },
+ "/csrf-token": {
+ Handler: api.HandleCSRF,
+ Middlewares: []core.Middleware{api.Methods("GET"), CSRFMiddleware},
+ },
})
fmt.Printf("Serving on port %s\n", port)
diff --git a/docker-compose.yaml b/docker-compose.yaml
index cbfda19..f8839af 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -19,7 +19,7 @@ services:
depends_on:
- psql
volumes:
- - ./backend/media:/media
+ - ./backend/media:/app/media
build:
context: ./backend/
dockerfile: Dockerfile
diff --git a/frontend/app/(main)/blogs/[slug]/page.tsx b/frontend/app/(main)/blogs/[slug]/page.tsx
index 2cac801..85c3a0a 100644
--- a/frontend/app/(main)/blogs/[slug]/page.tsx
+++ b/frontend/app/(main)/blogs/[slug]/page.tsx
@@ -9,21 +9,19 @@ export default async function HistoryDetails({
params: Promise<{ blog_id: string }>;
}) {
const { blog_id } = await params;
- let blog = {}
+ let blog = {};
try {
- const res = await fetch('http://localhost:3001/blogs/' + blog_id, {method: "GET"})
- blog = await res.json()
- console.log(blog as Blog)
- } catch(e) {
+ const res = await fetch("http://localhost:3001/blogs/" + blog_id, {
+ method: "GET",
+ });
+ blog = await res.json();
+ console.log(blog as Blog);
+ } catch (e) {
console.log(e);
}
- if(blog == null) {
- return(
- <>
- Error
- >
- )
+ if (blog == null) {
+ return <>Error>;
}
const blog_item_params: BlogItemParams = {
diff --git a/frontend/app/(main)/page.tsx b/frontend/app/(main)/page.tsx
index 5070134..18f0266 100644
--- a/frontend/app/(main)/page.tsx
+++ b/frontend/app/(main)/page.tsx
@@ -4,8 +4,16 @@ import Features, { FeatureItem } from "@/components/features";
import Gallery from "@/components/gallery";
import Hero from "@/components/hero";
import Testimonial from "@/components/testimonial";
+import { CarouselItem } from "@/components/ui/carousel";
+import { IYoutube } from "@/interfaces/youtube";
export default async function Home() {
+ let videos: IYoutube | null = null;
+ if (process.env.YOUTUBE_API_KEY) {
+ const query = `https://www.googleapis.com/youtube/v3/search?key=${process.env.YOUTUBE_API_KEY}&channelId=UCzuFLl5I0WxSMqbeMaiq_FQ&part=snippet,id&order=date&maxResults=50`;
+ const res = await fetch(query);
+ videos = await res.json();
+ }
return (
@@ -20,10 +28,10 @@ export default async function Home() {
position="left"
image="https://shadcnblocks.com/images/block/placeholder-2.svg"
>
-
+
Un Système Centré sur les Concepts{" "}
-
+
Étude et application des meilleurs
concepts et stratégies issus de
@@ -37,7 +45,7 @@ export default async function Home() {
Éducation au Mouvement et à l’Efficacité
-
+
Plus qu’un enchaînement de techniques :
une véritable éducation aux mouvements
@@ -56,12 +64,12 @@ export default async function Home() {
position="right"
image="https://shadcnblocks.com/images/block/placeholder-2.svg"
>
-
+
Les Premières Étapes
-
+
Initialement centré sur les techniques
et mouvements, le système s’est montré
@@ -78,10 +86,10 @@ export default async function Home() {
La Découverte des Concepts Clés
{" "}
-
+
Rôle central des concepts de combat :
-
+
Puissance dans les frappes.
Blocage ferme.
Équilibre et attitude.
@@ -103,7 +111,7 @@ export default async function Home() {
>
Latosa Escrima Concepts repose sur cinq concepts
fondamentaux :
-
+
Équilibre
Vitesse (Timing et Distance)
Puissance
@@ -112,8 +120,35 @@ export default async function Home() {