aleeusgr / hs-clojure

Other
0 stars 0 forks source link

Implement client-side routing #9

Closed aleeusgr closed 2 months ago

aleeusgr commented 3 months ago
aleeusgr commented 3 months ago

To implement client-side routing for your CRUD API, you'll need to use a web framework such as Ring or Pedestal. Here's an example using Ring:

First, add the Ring dependency to your project.clj file:

(defproject hs-clojure "0.1.0-SNAPSHOT"
  ...
  :dependencies [[org.clojure/clojure "1.10.0"]
                   [ring/ring-core "1.8.0"]
                   [ring/ring-jetty-adapter "1.8.0"]]
  ...)

Create a new file src/hs_clojure/routes.clj with the following code:

(ns hs-clojure.routes
  (:require [ring.util.response :as response]
            [hs-clojure.patients :as patients]))

(defroutes app-routes
  (GET "/patients" []
    (response/response (patients/get-all-patients)))
  (GET "/patients/:id" [id]
    (if-let [patient (patients/get-patient-by-id db/spec (Integer/parseInt id))]
      (response/response patient)
      (response/not-found "Patient not found")))
  (POST "/patients" [name sex date-of-birth address social-security-number]
    (patients/add-patient name sex date-of-birth address social-security-number)
    (response/created "Patient created successfully"))
  (PUT "/patients/:id" [id name sex date-of-birth address social-security-number]
    (patients/update-patient (Integer/parseInt id) name sex date-of-birth address social-security-number)
    (response/ok "Patient updated successfully"))
  (DELETE "/patients/:id" [id]
    (patients/delete-patient (Integer/parseInt id))
    (response/ok "Patient deleted successfully"))
  (route/not-found "Not Found"))

This defines routes for:

Create a new file src/hs_clojure/server.clj with the following code:

(ns hs-clojure.server
  (:require [ring.adapter.jetty :as jetty]
            [hs-clojure.routes :as routes]))

(defn -main []
  (jetty/run-jetty routes/app-routes {:port 3000}))

This starts a Jetty server on port 3000, serving the routes defined in routes.clj.

Run the server with lein run -m hs-clojure.server. You can now use a tool like curl to test the API endpoints. For example:

curl http://localhost:3000/patients
curl http://localhost:3000/patients/1
curl -X POST -H "Content-Type: application/json" -d '{"name": "John Doe", "sex": "M", "date_of_birth": "1990-01-01", "address": "123 Main St", "social_security_number": "123-45-6789"}' http://localhost:3000/patients
curl -X PUT -H "Content-Type: application/json" -d '{"name": "Jane Doe", "sex": "F", "date_of_birth": "1990-01-01", "address": "456 Elm St", "social_security_number": "987-65-4321"}' http://localhost:3000/patients/1
curl -X DELETE http://localhost:3000/patients/1

This is a basic implementation of client-side routing for your CRUD API. You may want to add error handling, authentication, and other features depending on your requirements.

aleeusgr commented 3 months ago

Here is an example of how you can define routes for your CRUD API in src/hs_clojure/routes.clj:

(ns hs-clojure.routes
  (:require [compojure.core :refer [defroutes GET POST PUT DELETE]]
            [hs-clojure.patients :as patients]))

(defroutes patient-routes
  (GET "/patients" [] (patients/get-all-patients))
  (GET "/patients/:id" [id] (patients/get-patient-by-id db/spec id))
  (POST "/patients" [name sex date-of-birth address social-security-number]
    (patients/add-patient name sex date-of-birth address social-security-number)
    {:status 201})
  (PUT "/patients/:id" [id name sex date-of-birth address social-security-number]
    (patients/update-patient id name sex date-of-birth address social-security-number)
    {:status 200})
  (DELETE "/patients/:id" [id]
    (patients/delete-patient id)
    {:status 204}))

This defines five routes:

Note that I'm assuming that the db/spec variable is defined elsewhere in your code, and that it contains the database connection details.

You'll also need to update your handler.clj file to include these routes:

(def app
  (-> (routes/concat patient-routes app-routes)
      (wrap-defaults site-defaults)
      (wrap-resource "public")))

This combines the patient-routes with the existing app-routes and wraps them with the default middleware.