From 6ce4def6e5e63998ed43f3475779e394337be6cc Mon Sep 17 00:00:00 2001 From: shoofle Date: Thu, 19 Sep 2024 15:43:50 -0400 Subject: [PATCH] extract some queries from the app pages --- client/src/EditPage.jsx | 112 +++++++++++++----------- client/src/Landing.jsx | 28 +++--- client/src/PageView.jsx | 43 ++++----- client/src/clientStuff.jsx | 43 +++++++++ db/the_big_db.db/dbs/default/data-wal | Bin 358472 -> 449112 bytes db/the_big_db.db/dbs/default/stats.json | 2 +- db/the_big_db.db/dbs/default/wallog | Bin 358504 -> 449144 bytes server/server.js | 57 +++++++----- 8 files changed, 171 insertions(+), 114 deletions(-) create mode 100644 client/src/clientStuff.jsx diff --git a/client/src/EditPage.jsx b/client/src/EditPage.jsx index 68f42b75..47275634 100644 --- a/client/src/EditPage.jsx +++ b/client/src/EditPage.jsx @@ -4,85 +4,95 @@ import './App.css'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useParams, useNavigate } from 'react-router-dom'; import { useState } from 'react'; - -const url = "http://127.0.0.1:3001" +import { apiUrl, fetchPage, postPage, deletePage } from './clientStuff.jsx'; function PageView() { const queryClient = useQueryClient(); const navigate = useNavigate(); const { pagenumber } = useParams(); - const [ text_of_page, setBodyText ] = useState("Not loaded yet"); - const { isPending, error, data } = useQuery({ // fetch the currrent values + const fetchQuery = useQuery({ // fetch the currrent values queryKey: ['page', pagenumber], - queryFn: () => - fetch(`${url}/page/${pagenumber}`, { - method: 'GET', - headers: {'Content-Type': 'application/json'} - }).then((res) => res.json()) - .then((data) => { - setBodyText(data[2]) - return data; - }) + queryFn: () => fetchPage(pagenumber) }) - const mutation = useMutation({ // for changing the value when we're done with it - mutationFn: ({id, title, description}) => { - console.log("trying to update!"); - const body = JSON.stringify({id: id, title: title, description: description}) - console.log(`sending ${body}`) - fetch(`${url}/page/${pagenumber}`, { - method: 'POST', - headers: {'Content-Type': 'application/json'}, - body: body - }).then((res) => { console.log("tried to update!", res.json()) }) - .catch((error) => { console.log("got an error", error.json()) }); - }, + const postMutation = useMutation({ // for changing the value when we're done with it + mutationFn: ({id, title, description}) => postPage({id, title, description}), onSettled: async (data, error, variables) => { // Invalidate and refetch await queryClient.invalidateQueries({ queryKey: ['page', variables.id] }) }, }); - function handleSubmit(e) { - e.preventDefault() - const data = e.target.querySelector('pre').innerHTML - const formData = new FormData(e.target); - mutation.mutate({ + const deleteMutation = useMutation({ // for changing the value when we're done with it + mutationFn: (id) => deletePage(id), + onSettled: async (data, error, variables) => { + // Invalidate and refetch + await queryClient.invalidateQueries({ queryKey: ['pages'] }) + }, + }); + + const ready = !(fetchQuery.error || fetchQuery.isPending); + + let the_id, page_title, page_text, page_html; + if (ready) [the_id, page_title, page_text, page_html] = fetchQuery.data; + if (!page_title) page_title = " "; + if (!page_text) page_text = " "; + + function submitChanges(e) { + const newTitle = document.querySelector('span').innerHTML; + const newText = document.querySelector('pre').innerHTML; + postMutation.mutate({ id: pagenumber, - title: page_title, - description: data, + title: newTitle, + description: newText, }); navigate(`/${pagenumber}`) } - if (isPending) return "Loading..."; - - if (error) return "Uh oh!"; + function submitDelete(e) { + e.preventDefault(); + deleteMutation.mutate(pagenumber); + navigate(`/`); + } - const [the_id, page_title, page_text] = data; return (
-
- logo + logo
-

{the_id}. {page_title}

-
-
-
 setBodyText(e.target.value)} 
-              dangerouslySetInnerHTML={{__html: text_of_page}} />
+            

+ {pagenumber}. + +

- + { ready ? + <> +
+
+              
+ + + + : +
+ { fetchQuery.isPending ? "Loading..." : JSON.stringify(fetchQuery.error) } +
+ }
-
); } diff --git a/client/src/Landing.jsx b/client/src/Landing.jsx index c2b98f0e..b66ea330 100644 --- a/client/src/Landing.jsx +++ b/client/src/Landing.jsx @@ -4,32 +4,22 @@ import './App.css'; import { useNavigate } from 'react-router-dom' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -const url = "http://127.0.0.1:3001" +import { apiUrl, fetchPageList, postNewPage } from './clientStuff.jsx'; function Landing() { const queryClient = useQueryClient(); const navigate = useNavigate(); const { isPending, error, data } = useQuery({ // fetch the currrent values queryKey: ['pages'], - queryFn: () => - fetch(`${url}/pages`, { - method: 'GET', - headers: {'Content-Type': 'application/json'} - }).then((res) => res.json()) + queryFn: fetchPageList }) const makeNewPage = useMutation({ // for changing the value when we're done with it - mutationFn: () => - fetch(`${url}/page/new`, { - method: 'POST', - headers: {'Content-Type': 'application/json'}, - }).then((res) => res.json()) - .then((data) => data.id) + mutationFn: () => postNewPage() .catch((error) => { console.log("got an error", error.json()) }), onSettled: async (data, error, variables) => { // Invalidate and navigate to the new page await queryClient.invalidateQueries({ queryKey: ['pages'] }); - console.log(data); navigate(`/${data}/edit`); }, }); @@ -37,13 +27,15 @@ function Landing() { return (
- logo + logo

Welcome to the forest!

+

This is some random stuff I added!

{ isPending ? "Loading..." : (error ? - (
{error}
) : -
    +
    {error}
    + : +
      { data.map((row) =>
    • @@ -51,10 +43,10 @@ function Landing() {
    • ) } -
+ ) } - +
); diff --git a/client/src/PageView.jsx b/client/src/PageView.jsx index 3c90d098..1324fe32 100644 --- a/client/src/PageView.jsx +++ b/client/src/PageView.jsx @@ -4,46 +4,41 @@ import './App.css'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useParams, useNavigate } from 'react-router-dom'; import { useState } from 'react'; - -const url = "http://localhost:3001" +import { apiUrl, fetchPage, postPage } from './clientStuff.jsx'; function PageView() { - const navigate = useNavigate(); const queryClient = useQueryClient(); + const navigate = useNavigate(); const { pagenumber } = useParams(); - const [ text_of_page, setBodyText ] = useState("Not loaded yet"); const { isPending, error, data } = useQuery({ // fetch the currrent values queryKey: ['page', pagenumber], - queryFn: () => - fetch(`${url}/page/${pagenumber}`, { - method: 'GET', - headers: {'Content-Type': 'application/json'} - }).then((res) => res.json()) - .then((data) => { - //console.log(`got ${data} as a response for ${pagenumber}`); - setBodyText(data[3]); - return data; - }) + queryFn: () => fetchPage(pagenumber) }) - if (isPending) return "Loading..."; + const ready = !(error || isPending); - if (error) return "Uh oh!"; - - const [the_id, page_title, page_text, page_html] = data; + let the_id, page_title, page_text, page_html; + if (data) [the_id, page_title, page_text, page_html] = data; return (
- logo + logo
-

{the_id}. {page_title}

+

{pagenumber}. {ready ? (page_title || " ") : "..."}

-
+ { ready ? +
+ : +
+ { isPending ? "Loading..." : JSON.stringify(error) } +
+ } +
diff --git a/client/src/clientStuff.jsx b/client/src/clientStuff.jsx new file mode 100644 index 00000000..8300c738 --- /dev/null +++ b/client/src/clientStuff.jsx @@ -0,0 +1,43 @@ +export const apiUrl = "http://127.0.0.1:3001" + +const defaults = { + headers: {'Content-Type': 'application/json'} +}; + +export async function postNewPage() { + return fetch(`${apiUrl}/page/new`, { + method: 'POST', + ...defaults + }).then((res) => res.json()) + .then((data) => data.id) +} + +export async function fetchPageList() { + return fetch(`${apiUrl}/pages`, { + method: 'GET', + ...defaults + }).then((res) => res.json()) +} + +export async function fetchPage(id) { + return fetch(`${apiUrl}/page/${id}`, { + method: 'GET', + ...defaults + }).then((res) => res.json()) +} + +export async function postPage({id, title, description}) { + return fetch(`${apiUrl}/page/${id}`, { + method: 'POST', + body: JSON.stringify({id: id, title: title, description: description}), + ...defaults + }) +} + +export async function deletePage(id) { + return fetch(`${apiUrl}/page/${id}`, { + method: 'DELETE', + headers: {'Content-Type': 'application/json'}, + ...defaults + }) +} \ No newline at end of file diff --git a/db/the_big_db.db/dbs/default/data-wal b/db/the_big_db.db/dbs/default/data-wal index 1657ef9d059d16391417d1dc6b980bdcf6416323..147170283e9dc8f440cfaf67d0ffcedf4a5fcc50 100644 GIT binary patch literal 449112 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 delta 19 acmcbyMf$`C(S{br7N!>F7M3ln9u)vrfd_~H diff --git a/db/the_big_db.db/dbs/default/stats.json b/db/the_big_db.db/dbs/default/stats.json index 477713b8..23bd392e 100644 --- a/db/the_big_db.db/dbs/default/stats.json +++ b/db/the_big_db.db/dbs/default/stats.json @@ -1 +1 @@ -{"id":"7de13931-444c-4dd2-a19a-5cd1e70b7f36","rows_written":87,"rows_read":1016,"storage_bytes_used":12288,"write_requests_delegated":0,"current_frame_no":86,"top_query_threshold":3,"top_queries":[{"rows_written":2,"rows_read":1,"query":"\ncreate table if not exists renders (\n id integer primary key,\n title varchar(255),\n description text\n)\n"},{"rows_written":0,"rows_read":4,"query":"select id from pages"},{"rows_written":0,"rows_read":5,"query":"select id from pages"},{"rows_written":1,"rows_read":4,"query":"\nalter table pages \nadd column html text\n"},{"rows_written":0,"rows_read":6,"query":"\nselect p.id from pages p where not exists (select r.id from renders r where p.id = r.id)\n"},{"rows_written":0,"rows_read":10,"query":"select id from pages"},{"rows_written":0,"rows_read":11,"query":"select id from pages"},{"rows_written":0,"rows_read":12,"query":"select id from pages"},{"rows_written":0,"rows_read":13,"query":"select id from pages"},{"rows_written":0,"rows_read":14,"query":"select id from pages"}],"slowest_query_threshold":0,"slowest_queries":[{"elapsed_ms":0,"query":"select id, title, description from pages where id=@val","rows_written":0,"rows_read":1},{"elapsed_ms":0,"query":"select title from pages","rows_written":0,"rows_read":1},{"elapsed_ms":0,"query":"select title from pages","rows_written":0,"rows_read":2},{"elapsed_ms":1,"query":"\nalter table pages \nadd column html text\n","rows_written":1,"rows_read":4},{"elapsed_ms":1,"query":"\ncreate table if not exists renders (\n id integer primary key,\n title varchar(255),\n description text\n)\n","rows_written":2,"rows_read":1},{"elapsed_ms":1,"query":"insert into pages (title, description) values (?, ?) returning id","rows_written":1,"rows_read":1},{"elapsed_ms":1,"query":"replace into pages (id, title, description) values (?, ?, ?)","rows_written":1,"rows_read":1},{"elapsed_ms":1,"query":"select * from pages where id=@val","rows_written":0,"rows_read":1},{"elapsed_ms":1,"query":"select count(*) as num_pages from pages","rows_written":0,"rows_read":1},{"elapsed_ms":7,"query":"replace into pages (id, title, description) values (?, ?, ?)","rows_written":1,"rows_read":1}],"embedded_replica_frames_replicated":0,"query_count":665,"query_latency":74555} \ No newline at end of file +{"id":"7de13931-444c-4dd2-a19a-5cd1e70b7f36","rows_written":109,"rows_read":1706,"storage_bytes_used":12288,"write_requests_delegated":0,"current_frame_no":108,"top_query_threshold":3,"top_queries":[{"rows_written":2,"rows_read":1,"query":"\ncreate table if not exists renders (\n id integer primary key,\n title varchar(255),\n description text\n)\n"},{"rows_written":0,"rows_read":4,"query":"select id from pages"},{"rows_written":0,"rows_read":5,"query":"select id from pages"},{"rows_written":1,"rows_read":4,"query":"\nalter table pages \nadd column html text\n"},{"rows_written":0,"rows_read":6,"query":"\nselect p.id from pages p where not exists (select r.id from renders r where p.id = r.id)\n"},{"rows_written":0,"rows_read":10,"query":"select id from pages"},{"rows_written":0,"rows_read":11,"query":"select id from pages"},{"rows_written":0,"rows_read":12,"query":"select id from pages"},{"rows_written":0,"rows_read":13,"query":"select id from pages"},{"rows_written":0,"rows_read":14,"query":"select id from pages"}],"slowest_query_threshold":0,"slowest_queries":[{"elapsed_ms":0,"query":"select id, title, description from pages where id=@val","rows_written":0,"rows_read":1},{"elapsed_ms":0,"query":"select title from pages","rows_written":0,"rows_read":1},{"elapsed_ms":0,"query":"select title from pages","rows_written":0,"rows_read":2},{"elapsed_ms":1,"query":"\nalter table pages \nadd column html text\n","rows_written":1,"rows_read":4},{"elapsed_ms":1,"query":"\ncreate table if not exists renders (\n id integer primary key,\n title varchar(255),\n description text\n)\n","rows_written":2,"rows_read":1},{"elapsed_ms":1,"query":"insert into pages (title, description) values (?, ?) returning id","rows_written":1,"rows_read":1},{"elapsed_ms":1,"query":"replace into pages (id, title, description) values (?, ?, ?)","rows_written":1,"rows_read":1},{"elapsed_ms":1,"query":"select * from pages where id=@val","rows_written":0,"rows_read":1},{"elapsed_ms":1,"query":"select count(*) as num_pages from pages","rows_written":0,"rows_read":1},{"elapsed_ms":7,"query":"replace into pages (id, title, description) values (?, ?, ?)","rows_written":1,"rows_read":1}],"embedded_replica_frames_replicated":0,"query_count":877,"query_latency":90259} \ No newline at end of file diff --git a/db/the_big_db.db/dbs/default/wallog b/db/the_big_db.db/dbs/default/wallog index ad4bd94c7911bd3b18f2e4798ecfd09ac9032922..3374cd9437287f73c077d16e4a626a06e50a82a2 100644 GIT binary patch literal 449144 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 xe`)Op)R2FVW2e+GuRCDI { .then((data) => data[0].results.rows) .then((rows) => rows.map(([id]) => id)) .then((ids) => res.json(ids)) - .catch((error) => res.status(404).json({"error": "error"})); + .catch((error) => res.status(500).json({"error": error})); }); -app.get('/page/:id', (req, res) => { - fetch(db_url, { - method: 'POST', - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({ - statements: [{ - q: 'select * from pages where id=?', - params: [req.params.id] - }] - }) - }).then((rsp) => rsp.json()) - .then((data) => data[0].results.rows[0]) - .then((row) => res.json(row)) - .catch((error) => res.status(404).json({"error": error})); -}); - - app.post('/page/new', (req, res) => { fetch(db_url, { method: 'POST', @@ -68,7 +51,25 @@ app.post('/page/new', (req, res) => { }).then((rsp) => rsp.json()) .then((data) => data[0].results.rows[0][0]) .then((row) => res.status(200).json({id: row})) - .catch((error) => res.status(404).json({"error": error})) + .catch((error) => res.status(500).json({"error": error})) +}); + +app.get('/page/:id', (req, res) => { + fetch(db_url, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + statements: [{ + q: 'select * from pages where id=?', + params: [req.params.id] + }] + }) + }).then((rsp) => rsp.json()) + .then((data) => { + if (data[0].results.rows.length == 0) return res.status(404).json({"error": "page not found in db"}); + return data[0].results.rows[0]; + }).then((row) => res.status(200).json(row)) + .catch((error) => res.status(500).json({"error": error})); }); app.post('/page/:id', (req, res) => { @@ -90,5 +91,21 @@ app.post('/page/:id', (req, res) => { }] }) }).then(() => res.status(200).json({})) - .catch((error) => res.status(404).json({"error": error})); + .catch((error) => res.status(500).json({"error": error})); }); + +app.delete('/page/:id', (req, res) => { + console.log(`deleting page #${req.params.id}`); + + fetch(db_url, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + statements: [{ + q: 'delete from pages where id = ?', + params: [Number(req.params.id)] + }] + }) + }).then(() => res.status(200).json({id: req.params.id})) + .catch((error) => res.status(500).json({"error": error})) +})