From 5f9f9c024b46cd0d9fb24a1a916d7ccadbce1371 Mon Sep 17 00:00:00 2001 From: Raymaekers Luca Date: Wed, 19 Nov 2025 12:42:03 +0100 Subject: checkpoint --- code/index.tmpl.html | 26 +++++++++++++++++--- code/noelan.go | 67 +++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 12 deletions(-) (limited to 'code') diff --git a/code/index.tmpl.html b/code/index.tmpl.html index 43e9db4..f60ecf6 100644 --- a/code/index.tmpl.html +++ b/code/index.tmpl.html @@ -81,7 +81,7 @@ textarea { //- Globals let people = [{{ range .People }} - {"name": "{{.Name}}", "has_picked": {{.HasPicked}},}, {{ end }} + {"name": "{{.Name}}", "has_picked": {{.HasPicked}}}, {{ end }} ]; let local_storage_key = "{{.Key}}"; @@ -220,7 +220,7 @@ function setPageOtherPerson() { let wishlist = document.getElementById(wishlistID); wishlist.textContent = global_all_data.otherWishlist; - fetch(`/api/list/?name=${global_all_data.thisName}&token=${global_all_data.token}`) + fetch(`/api/list/?user=${global_all_data.thisName}&name=${global_all_data.otherName}&token=${global_all_data.token}`) .then(function(response) { if (!response.ok) { console.error('Network response was not ok'); @@ -231,7 +231,7 @@ function setPageOtherPerson() { if(wishlist.textContent != response) { global_all_data.otherWishlist = response; - wishlist.textContent = global_all_data.otherWishlist; + wishlist.textContent = response; localStorage.setItem(local_storage_key, JSON.stringify(global_all_data)); } }) @@ -302,6 +302,26 @@ function setPageThisPerson() { let letterTextArea = document.getElementById(letterTextAreaID); letterTextArea.textContent = global_all_data.thisWishlist; + fetch(`/api/list/?user=${global_all_data.thisName}&name=${global_all_data.thisName}&token=${global_all_data.token}`) + .then(function(response) { + if (!response.ok) { + console.error('Network response was not ok'); + } + return response.text(); + }) + .then(function(response) { + if(wishlist.textContent != response) + { + global_all_data.thisWishlist = response; + letterTextArea.textContent = response; + localStorage.setItem(local_storage_key, JSON.stringify(global_all_data)); + } + }) + .catch(function(error) { + console.error('There was a problem with the fetch operation:', error); + }); + + let sendLetterButton = document.getElementById(sendLetterButtonID); sendLetterButton.addEventListener("click", function(event) { event.preventDefault(); diff --git a/code/noelan.go b/code/noelan.go index 48f0bb2..2e01b81 100644 --- a/code/noelan.go +++ b/code/noelan.go @@ -25,6 +25,15 @@ // Since we only have one page we lose following functionality of the browser. // - native navigation through history of urls // - control+click to open in a new page +// +// x In PageData that is sent to the client, only send people's name who have not clicked yet. +// x Synchronization for your own wishlist +// +// TODO(luca): No backup option +// TODO(luca): Offline mode +// - detect when you are offline +// - display a tooltip saying that you are offline +// TODO(luca): Remove names from here and add them through a config file package noelan @@ -148,7 +157,9 @@ func (person Person) String() string { // - Helpers func TemplateToString(template_contents string, people []Person, local_storage_key int64, internal bool) string { + var response string var buf strings.Builder + template_response, err := template.New("tirage").Parse(template_contents) if err != nil { fmt.Println(err) @@ -159,11 +170,26 @@ func TemplateToString(template_contents string, people []Person, local_storage_k Key int64 Internal bool } - err = template_response.ExecuteTemplate(&buf, "tirage", PageData{People: people, Key: local_storage_key, Internal: internal}) - if err != nil { - fmt.Println(err) + + page_data := PageData{People: people, Key: local_storage_key, Internal: internal} + + // NOTE(luca): Count people whow have picked, only send the people if some are remaining that haven't picked + { + has_picked_count := 0 + for index := range people { + if people[index].HasPicked { + has_picked_count += 1 + } + } + + if has_picked_count < len(people) { + err = template_response.ExecuteTemplate(&buf, "tirage", page_data) + if err != nil { + fmt.Println(err) + } + response = buf.String() + } } - response := buf.String() return response } @@ -209,10 +235,10 @@ func ShufflePeople(rand *rand.Rand, people []Person, logger *log.Logger) { } func HttpError(logger *log.Logger, message string, person *Person, writer http.ResponseWriter, request *http.Request) { - logger.Printf("Error for %s: %s | %s %s %s %s\n", + logger.Printf("ERROR: for %s: %s | %s %s %s %s\n", person.Name, message, request.RemoteAddr, request.Method, request.URL, request.Form) - http.Error(writer, message, http.StatusNotFound) + http.Error(writer, "ERROR: " + message, http.StatusNotFound) } // - Main @@ -401,7 +427,7 @@ func Run() { if !local_storage_key_initialized { logger.Println("Initialize local storage key.") - local_storage_key = rand.Int63() + local_storage_key = seeded_rand.Int63() local_storage_key_initialized = true } @@ -427,6 +453,12 @@ func Run() { http.HandleFunc("/api/list/", func(writer http.ResponseWriter, request *http.Request) { if request.Method == http.MethodPost { + // @api_notes + // POST /api/list/ + // Form values: + // - name: username + // - text: new text for wishlist + // - token: token user string name := request.FormValue("name") text := request.FormValue("text") token := request.FormValue("token") @@ -448,17 +480,34 @@ func Run() { HttpError(logger, "no such person", &GlobalNilPerson, writer, request) } } else if request.Method == http.MethodGet { + // @api_notes + // GET /api/list/ + // Url params: + // - user: username + // - name: requestee's wishlist + // - token: token user string params := request.URL.Query() + user := params.Get("user") name := params.Get("name") token := params.Get("token") - found, person := FindPersonByName(people, name) + found, person := FindPersonByName(people, user) if found { tokenString := strconv.FormatInt(person.Token, 10) if token == tokenString { - fmt.Fprint(writer, people[person.Other].Wishlist) + + var response string + if people[person.Other].Name == name { + response = people[person.Other].Wishlist + fmt.Fprint(writer, response) + } else if person.Name == user { + response = person.Wishlist + fmt.Fprint(writer, response) + } else { + HttpError(logger, "invalid person: "+name, person, writer, request) + } } else { HttpError(logger, "invalid token", person, writer, request) } -- cgit v1.2.3-70-g09d2