From 10ba28ddcfcecc18e062c8f4b4fbc305da7850dd Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 20:02:42 +0200 Subject: [PATCH 1/8] refactor(be/middlewares): move `allow_cors` middleware --- backend/src/common/middlewares.ml | 2 ++ backend/src/main.ml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/common/middlewares.ml b/backend/src/common/middlewares.ml index 26b818b..548199f 100644 --- a/backend/src/common/middlewares.ml +++ b/backend/src/common/middlewares.ml @@ -30,3 +30,5 @@ let verify_expiration = Rock.Middleware.create ~filter: verify_expiration ~name: "verify expiration" let logger = Opium.Middleware.logger + +let allow_cors = Opium.Middleware.allow_cors () diff --git a/backend/src/main.ml b/backend/src/main.ml index a9c477c..d707fe2 100644 --- a/backend/src/main.ml +++ b/backend/src/main.ml @@ -27,7 +27,7 @@ let auth = Web.choose ~scope: "/api" ~middlewares: [ require_login; verify_expir Web.post "/reviews/create" Handlers.Reviews.create; ] -let router = Web.choose ~middlewares: [ logger; Opium.Middleware.allow_cors (); ] [ +let router = Web.choose ~middlewares: [ logger; allow_cors; ] [ public; no_auth; auth; From 005c5e42e6db60fe742b4005a3d4db1c26bb405a Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 20:03:13 +0200 Subject: [PATCH 2/8] feat(be/handlers): add ordering in `get_all` toilets query --- backend/src/handlers/toilets.ml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/handlers/toilets.ml b/backend/src/handlers/toilets.ml index 5c97760..7b4c345 100644 --- a/backend/src/handlers/toilets.ml +++ b/backend/src/handlers/toilets.ml @@ -31,7 +31,8 @@ module Query = struct FROM toilets t INNER JOIN users u ON t.creator = u.id LEFT JOIN reviews r ON t.id = r.toilet - GROUP BY t.id, u.username" + GROUP BY t.id, u.username + ORDER BY reviews_count DESC" let create = tup2 From 3b634862a23fa92cc9b5767fd85051781f26b940 Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 20:04:09 +0200 Subject: [PATCH 3/8] feat(fe/pages): add `toilets` page and `toiletCard` component --- frontend/src/routes/+page.svelte | 4 +- frontend/src/routes/toilets/+page.svelte | 62 +++++++++++++++ frontend/src/routes/toilets/toiletCard.svelte | 77 +++++++++++++++++++ 3 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 frontend/src/routes/toilets/+page.svelte create mode 100644 frontend/src/routes/toilets/toiletCard.svelte diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index f5bb561..7f27e2b 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -22,7 +22,7 @@ }); -
+

Know the toilets around you.

@@ -33,7 +33,7 @@
-
+
diff --git a/frontend/src/routes/toilets/+page.svelte b/frontend/src/routes/toilets/+page.svelte new file mode 100644 index 0000000..84297f9 --- /dev/null +++ b/frontend/src/routes/toilets/+page.svelte @@ -0,0 +1,62 @@ + + +

Toilets

+ +{#await promise} +
+ +
+{:then toilets} +
+

Toilets someone created

+

Please verify if someone already created the toilet you want to review before creating it.

+ +
+ + New toilet +
+

Filter by title, place, building or description!

+ +
+ + {#if toilets.data.filter(t => isValid(t, filter)).length === 0} +

No toilets found :(

+ {:else} + {#each [0, 1, 2] as rem} +
+ {#each toilets.data.filter(t => isValid(t, filter)) as toilet, i (toilet.id)} + {#if i % 3 === rem} + + {/if} + {/each} +
+ {/each} + {/if} + +
+
+{:catch error} +

Error: {JSON.stringify(error.response.data)}

+{/await} diff --git a/frontend/src/routes/toilets/toiletCard.svelte b/frontend/src/routes/toilets/toiletCard.svelte new file mode 100644 index 0000000..eb995f7 --- /dev/null +++ b/frontend/src/routes/toilets/toiletCard.svelte @@ -0,0 +1,77 @@ + + + +
+
+ +
+

{title || "Unnamed toilet"} + {#if reviews_count > 0} + {goodness[Math.round(rating / 2)][0]} + {:else} + NO REVIEWS + {/if} +

+

{building} - {place}

+

{description}

+
+ + {#if reviews_count > 0} +
+
+ {#each Array(Math.round(rating/2)) as _} + + {/each} + {#each Array(5 - Math.round(rating/2)) as _} + + {/each} +
+
+ {rating / 2} based on {reviews_count} reviews +
+
+ {/if} + +
+ {#if reviews_count > 0} + View reviews + {/if} + Review +
+ +
+ Created by {creator_name || "Anonymous"} on {formatDate(creation_date)} +
+
+
+ From ba4f2a9f95ae8d700077451cee112abb2524590b Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 20:52:13 +0200 Subject: [PATCH 4/8] feat(fe/pages): add `toilets/new` page --- frontend/src/routes/toilets/+page.svelte | 2 - frontend/src/routes/toilets/new/+page.svelte | 94 ++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 frontend/src/routes/toilets/new/+page.svelte diff --git a/frontend/src/routes/toilets/+page.svelte b/frontend/src/routes/toilets/+page.svelte index 84297f9..63104e7 100644 --- a/frontend/src/routes/toilets/+page.svelte +++ b/frontend/src/routes/toilets/+page.svelte @@ -19,8 +19,6 @@ -

Toilets

- {#await promise}
diff --git a/frontend/src/routes/toilets/new/+page.svelte b/frontend/src/routes/toilets/new/+page.svelte new file mode 100644 index 0000000..59abad5 --- /dev/null +++ b/frontend/src/routes/toilets/new/+page.svelte @@ -0,0 +1,94 @@ + + +
+

Create new toilet

+

Please verify if someone already created the toilet you want to review before creating it.

+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ + + + + Go back + + +
+ +
From 4b98d0deeef7f627bf7df1fc212748e953b32d3e Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 21:23:15 +0200 Subject: [PATCH 5/8] feat(be/handlers): add ordering in `get_all` reviews --- backend/src/handlers/reviews.ml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/handlers/reviews.ml b/backend/src/handlers/reviews.ml index 9ae8864..b6919af 100644 --- a/backend/src/handlers/reviews.ml +++ b/backend/src/handlers/reviews.ml @@ -15,7 +15,8 @@ module Query = struct r.rating, r.description, r.paper, r.soap, r.dryer, r.hotwater, r.clean, r.temperature FROM reviews r INNER JOIN toilets t ON r.toilet = t.id - INNER JOIN users u ON r.author = u.id" + INNER JOIN users u ON r.author = u.id + ORDER BY date DESC" let create = tup3 From 314283bf77dee2c249a979d387b5acc248e48b79 Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 21:23:30 +0200 Subject: [PATCH 6/8] feat(fe/pages): add `reviews` page --- frontend/src/routes/reviews/+page.svelte | 61 ++++++++++ frontend/src/routes/reviews/reviewCard.svelte | 108 ++++++++++++++++++ frontend/src/routes/toilets/toiletCard.svelte | 2 +- 3 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 frontend/src/routes/reviews/+page.svelte create mode 100644 frontend/src/routes/reviews/reviewCard.svelte diff --git a/frontend/src/routes/reviews/+page.svelte b/frontend/src/routes/reviews/+page.svelte new file mode 100644 index 0000000..7757065 --- /dev/null +++ b/frontend/src/routes/reviews/+page.svelte @@ -0,0 +1,61 @@ + + +{#await promise} +
+ +
+{:then reviews} +
+

Reviews available

+

Visit /toilets page to leave a review.

+ +
+ +
+

Filter by bathroom title, place and building or by review author and description!

+ +
+ + {#if reviews.data.filter(t => isValid(t, filter)).length === 0} +

No reviews found :(

+ {:else} + {#each [0, 1, 2] as rem} +
+ {#each reviews.data.filter(t => isValid(t, filter)) as review, i (review.id)} + {#if i % 3 === rem} + + {/if} + {/each} +
+ {/each} + {/if} + +
+
+{:catch error} +

Error: {JSON.stringify(error.response.data)}

+{/await} diff --git a/frontend/src/routes/reviews/reviewCard.svelte b/frontend/src/routes/reviews/reviewCard.svelte new file mode 100644 index 0000000..0439be4 --- /dev/null +++ b/frontend/src/routes/reviews/reviewCard.svelte @@ -0,0 +1,108 @@ + + + +
+
+ +
+

{title || "Unnamed toilet"} + {goodness[Math.round(rating / 2)][0]} +

+

{building} - {place}

+
+ +
+
+ {#each Array(Math.round(rating/2)) as _} + + {/each} + {#each Array(5 - Math.round(rating/2)) as _} + + {/each} +
+
+ {rating / 2} out of 5 +
+
+ +

{description}

+ +
+

+ + Paper: {paper ? "Yes" : "No"} +

+

+ + Soap: {soap ? "Yes" : "No"} +

+

+ + Hands dryer: {dryer ? "Yes" : "No"} +

+

+ + Hot water: {hotwater ? "Yes" : "No"} +

+

+ + Level of cleanliness: {clean / 2} out of 5 +

+

+ + Temperature: {temperature / 2} out of 5 +

+ + + + + +
+ +
+ Review by {author_name || "Anonymous"} on {formatDate(date)} +
+
+
+ diff --git a/frontend/src/routes/toilets/toiletCard.svelte b/frontend/src/routes/toilets/toiletCard.svelte index eb995f7..1b2bc66 100644 --- a/frontend/src/routes/toilets/toiletCard.svelte +++ b/frontend/src/routes/toilets/toiletCard.svelte @@ -35,7 +35,7 @@
-

{title || "Unnamed toilet"} +

{title || "Unnamed toilet"} {#if reviews_count > 0} {goodness[Math.round(rating / 2)][0]} {:else} From 8c9d6c4a6c8b06c3c8b1eb96a3146697e347d90c Mon Sep 17 00:00:00 2001 From: Luca Favini Date: Sun, 21 Apr 2024 21:52:37 +0200 Subject: [PATCH 7/8] feat(fe/pages): add filtering by URL props in `reviews` page --- frontend/src/routes/reviews/+page.svelte | 18 +++++++++++++----- frontend/src/routes/reviews/reviewCard.svelte | 3 ++- frontend/src/routes/toilets/toiletCard.svelte | 4 ++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/frontend/src/routes/reviews/+page.svelte b/frontend/src/routes/reviews/+page.svelte index 7757065..d0ef5f2 100644 --- a/frontend/src/routes/reviews/+page.svelte +++ b/frontend/src/routes/reviews/+page.svelte @@ -1,16 +1,24 @@ + +
+

Review a toilet

+

Thanks for sharing such a precious information.

+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+

NO

+

YES

+ +
+
+ +
+ +
+
+ +
+

NO

+

YES

+ +
+
+ +
+ +
+
+ +
+

NO

+

YES

+ +
+
+ +
+ +
+
+ +
+

NO

+

YES

+ +
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ + + + + Go back + + +
+ +
diff --git a/frontend/src/routes/reviews/reviewCard.svelte b/frontend/src/routes/reviews/reviewCard.svelte index d725f0c..3d37713 100644 --- a/frontend/src/routes/reviews/reviewCard.svelte +++ b/frontend/src/routes/reviews/reviewCard.svelte @@ -83,22 +83,13 @@

- Level of cleanliness: {clean / 2} out of 5 + Cleanliness: {clean / 2} out of 5

Temperature: {temperature / 2} out of 5

- - - -
diff --git a/frontend/src/routes/toilets/toiletCard.svelte b/frontend/src/routes/toilets/toiletCard.svelte index 8d8297e..be3a131 100644 --- a/frontend/src/routes/toilets/toiletCard.svelte +++ b/frontend/src/routes/toilets/toiletCard.svelte @@ -66,7 +66,7 @@ {#if reviews_count > 0} View reviews {/if} - Review + Review