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/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 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 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; 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/review/+page.svelte b/frontend/src/routes/review/+page.svelte new file mode 100644 index 0000000..268394c --- /dev/null +++ b/frontend/src/routes/review/+page.svelte @@ -0,0 +1,157 @@ + + + +
+

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/+page.svelte b/frontend/src/routes/reviews/+page.svelte new file mode 100644 index 0000000..d0ef5f2 --- /dev/null +++ b/frontend/src/routes/reviews/+page.svelte @@ -0,0 +1,69 @@ + + +{#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..3d37713 --- /dev/null +++ b/frontend/src/routes/reviews/reviewCard.svelte @@ -0,0 +1,100 @@ + + + +
+
+ +
+

filter = toilet_id} class="link">{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"} +

+

+ + 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/+page.svelte b/frontend/src/routes/toilets/+page.svelte new file mode 100644 index 0000000..63104e7 --- /dev/null +++ b/frontend/src/routes/toilets/+page.svelte @@ -0,0 +1,60 @@ + + +{#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/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 + + +
+ +
diff --git a/frontend/src/routes/toilets/toiletCard.svelte b/frontend/src/routes/toilets/toiletCard.svelte new file mode 100644 index 0000000..be3a131 --- /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)} +
+
+
+