Compare commits

..
4 Commits
Author SHA1 Message Date
gawells ba8afc76cc serve logo and favicon 2026-07-31 12:50:50 -07:00
gawells e53631a65b add login page to webserver 2026-07-31 12:45:43 -07:00
gawells e8b422e390 get very simple webserver up and running 2026-07-31 12:38:56 -07:00
gawells 760dbec077 start adding in webserver component 2026-07-31 12:31:08 -07:00
8 changed files with 147 additions and 30 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
module astraltech.xyz/m/v2
module astraltech.xyz/calendar/v2
go 1.26.1
+38 -29
View File
@@ -1,43 +1,52 @@
package main
import (
"fmt"
"strings"
"net/http"
ics "github.com/arran4/golang-ical"
"astraltech.xyz/calendar/v2/webserver"
)
func LoginHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
var test_html string = "Hello, world"
w.Write([]byte(test_html))
}
func main() {
read_config()
init_dav_client()
calDavData := get_caldav_data(serverConfig.Username, serverConfig.Password)
fmt.Println()
webserver.ServeLoginPage("/login")
webserver.EnableLogoRoute()
webserver.ServeWebserver()
fmt.Printf("Users display name: %s\n", calDavData.DisplayName)
fmt.Printf("Calandar Count: %d\n", len(calDavData.Calandars))
for i := range len(calDavData.Calandars) {
calDavData.Calandars[i] = get_calandar_data(calDavData.Calandars[i], serverConfig.Username, serverConfig.Password)
// calDavData := get_caldav_data(serverConfig.Username, serverConfig.Password)
// fmt.Println()
fmt.Printf("Cal %d is named %s\n", i, calDavData.Calandars[i].DisplayName)
fmt.Printf("\tLink to cal: %s\n", calDavData.Calandars[i].Link)
fmt.Printf("\tEvent count: %d\n", len(calDavData.Calandars[i].Events))
for j := range len(calDavData.Calandars[i].Events) {
cal, err := ics.ParseCalendar(strings.NewReader(calDavData.Calandars[i].Events[j].CalData))
if err != nil {
fmt.Print(err.Error())
}
events := cal.Events()
for k := range len(events) {
name := events[k].GetProperty(ics.ComponentProperty(ics.PropertySummary)).Value
start, _ := events[k].GetStartAt()
end, _ := events[k].GetEndAt()
time := end.Sub(start)
fmt.Printf("\t\tEvent name: %s\n", name)
fmt.Printf("\t\t\tEvent start date: %s\n", end.UTC().String())
fmt.Printf("\t\t\tEvent length date: %s\n", time.String())
// fmt.Printf("Users display name: %s\n", calDavData.DisplayName)
// fmt.Printf("Calandar Count: %d\n", len(calDavData.Calandars))
// for i := range len(calDavData.Calandars) {
// calDavData.Calandars[i] = get_calandar_data(calDavData.Calandars[i], serverConfig.Username, serverConfig.Password)
}
}
}
// fmt.Printf("Cal %d is named %s\n", i, calDavData.Calandars[i].DisplayName)
// fmt.Printf("\tLink to cal: %s\n", calDavData.Calandars[i].Link)
// fmt.Printf("\tEvent count: %d\n", len(calDavData.Calandars[i].Events))
// for j := range len(calDavData.Calandars[i].Events) {
// cal, err := ics.ParseCalendar(strings.NewReader(calDavData.Calandars[i].Events[j].CalData))
// if err != nil {
// fmt.Print(err.Error())
// }
// events := cal.Events()
// for k := range len(events) {
// name := events[k].GetProperty(ics.ComponentProperty(ics.PropertySummary)).Value
// start, _ := events[k].GetStartAt()
// end, _ := events[k].GetEndAt()
// time := end.Sub(start)
// fmt.Printf("\t\tEvent name: %s\n", name)
// fmt.Printf("\t\t\tEvent start date: %s\n", end.UTC().String())
// fmt.Printf("\t\t\tEvent length date: %s\n", time.String())
// }
// }
// }
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

+4
View File
@@ -0,0 +1,4 @@
this is meant to be a reusable webserver component that I can integrate into applications
while it can serve custom routes it is also designed to server routes that are needed in all of my applications
Examples:
- Login page
+27
View File
@@ -0,0 +1,27 @@
package webserver
import (
"net/http"
"strings"
"text/template"
)
type LoginPageData struct {
IsHiddenClassList string
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
tmpl := template.Must(template.ParseFiles("webserver/pages/login_page.html"))
if r.Method == http.MethodGet {
tmpl.Execute(w, LoginPageData{IsHiddenClassList: "hidden"})
return
}
if r.Method == http.MethodPost {
username := r.FormValue("username")
if strings.Contains(username, "/") {
tmpl.Execute(w, LoginPageData{IsHiddenClassList: ""})
}
}
}
+43
View File
@@ -0,0 +1,43 @@
<!doctype html>
<title>Astral Tech - Login</title>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="static/style.css" />
<link rel="stylesheet" href="static/error/error.css" />
<link rel="stylesheet" href="static/card.css" />
<link rel="stylesheet" href="static/login_page.css" />
<img id="logo_image" alt="logo" src="/logo" />
<form id="login_card" class="card" method="POST">
<div id="welcome_text">
Welcome to Astral Tech, Please Sign in to your account below
</div>
<div class="error {{.IsHiddenClassList}}">
⚠️ Invalid username or password.
<button class="close_error_button">X</button>
</div>
<div>
<label class="input_label">Username</label><br />
<input type="text" name="username" placeholder="" required />
</div>
<div>
<label class="input_label">Password</label><br />
<div class="password_box">
<input type="password" name="password" placeholder="" required />
<button type="button" class="show_password_toggle closed"></button>
</div>
</div>
<button type="submit">Login</button>
</form>
<script src="/static/error/error.js" type="text/javascript"></script>
<script
src="/static/javascript/show_password.js"
type="text/javascript"
></script>
+34
View File
@@ -0,0 +1,34 @@
package webserver
import (
"fmt"
"net/http"
)
var routes []string
func ServeLoginPage(route string) {
ServeWebpage(route, loginHandler)
}
func EnableLogoRoute() {
ServeWebpage("/logo", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "webserver/images/astraltech_logo.png")
})
ServeWebpage("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "webserver/images/astraltech_favicon.png")
})
}
func ServeWebpage(url string, handler func(http.ResponseWriter, *http.Request)) {
http.HandleFunc(url, handler)
routes = append(routes, url)
}
func ServeWebserver() {
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Print(err.Error())
}
}