From ebc79583e457c7fc5eb0a29f2af4272079f19256 Mon Sep 17 00:00:00 2001 From: n0rdye Date: Sun, 12 Oct 2025 07:05:03 +0000 Subject: [PATCH] first commit. working templating, path routing, api responses, web menagment path --- go.mod | 3 ++ main.go | 13 ++++++++ web/api/api.go | 49 +++++++++++++++++++++++++++++ web/api/apis | 5 +++ web/manager/manager.go | 31 +++++++++++++++++++ web/render/render.go | 61 +++++++++++++++++++++++++++++++++++++ web/views/foot.html | 3 ++ web/views/head.html | 8 +++++ web/views/main.html | 1 + web/views/part/key-val.html | 1 + web/views/tag/text.html | 3 ++ web/web.go | 25 +++++++++++++++ 12 files changed, 203 insertions(+) create mode 100644 go.mod create mode 100644 main.go create mode 100644 web/api/api.go create mode 100644 web/api/apis create mode 100644 web/manager/manager.go create mode 100644 web/render/render.go create mode 100644 web/views/foot.html create mode 100644 web/views/head.html create mode 100644 web/views/main.html create mode 100644 web/views/part/key-val.html create mode 100644 web/views/tag/text.html create mode 100644 web/web.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b835b5a --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module api_manager + +go 1.24.5 diff --git a/main.go b/main.go new file mode 100644 index 0000000..df23ce0 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +// main package of the programm +// launching the main web package +// for future: loging + +import ( + "api_manager/web" +) + +func main() { + web.Server() +} diff --git a/web/api/api.go b/web/api/api.go new file mode 100644 index 0000000..99ff70c --- /dev/null +++ b/web/api/api.go @@ -0,0 +1,49 @@ +package api + +// package for reading and working with the storage file of the api's +// saving, loading, handling the api requests + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" +) + +// api manipulation function +func Apis() map[string]interface{} { + return get_apis() +} + +// return the value of api by name +func Get_api(w http.ResponseWriter, req *http.Request) { + apis := Apis() + str := strings.Replace(string(req.RequestURI), "/api/", "", 1) + fmt.Print(apis[str]) + jData, err := json.Marshal(apis[str]) + if err != nil { + // handle error + } + w.Header().Set("Content-Type", "application/json") + w.Write(jData) +} + +// reding the api storage file. returning map value like map[main:{sub:sub}] +func get_apis() map[string]interface{} { + jsonFile, err := os.Open("web/api/apis") + if err != nil { + fmt.Println(err) + } + fmt.Println("Successfully Opened users.json") + defer jsonFile.Close() + + byteValue, _ := ioutil.ReadAll(jsonFile) + + var result map[string]interface{} + json.Unmarshal([]byte(byteValue), &result) + + return result + +} diff --git a/web/api/apis b/web/api/apis new file mode 100644 index 0000000..b3ac723 --- /dev/null +++ b/web/api/apis @@ -0,0 +1,5 @@ +{ + "main":{"asd":"asd"}, + "sec":"/api/sec", + "thi":"/api/thi" +} \ No newline at end of file diff --git a/web/manager/manager.go b/web/manager/manager.go new file mode 100644 index 0000000..00d0e8f --- /dev/null +++ b/web/manager/manager.go @@ -0,0 +1,31 @@ +package manager + +// package for the web menagment of the api paths + +import ( + "api_manager/web/api" + "api_manager/web/render" + "fmt" + "net/http" +) + +func Add_api(w http.ResponseWriter, req *http.Request) { + // api.Apis["second"] = "/api/sec" + fmt.Fprintf(w, "good") +} + +func Show_apis(w http.ResponseWriter, req *http.Request) { + apis := api.Apis() + eval := "
" + for tag, varr := range apis { + eval_group := "" + eval_group += fmt.Sprintf("%v", varr) + eval_group += "-" + eval_group += tag + eval_group += "
" + eval += render.Template_of_tag(eval_group, "text") + } + eval += "
" + + fmt.Fprint(w, render.Template_with_string(eval)) +} diff --git a/web/render/render.go b/web/render/render.go new file mode 100644 index 0000000..e14b7ea --- /dev/null +++ b/web/render/render.go @@ -0,0 +1,61 @@ +package render + +import ( + "fmt" + "os" + "strings" +) + +func Template_with_string(str string) string { + head, err := os.ReadFile("web/views/head.html") + foot, err := os.ReadFile("web/views/foot.html") + template := "" + string(head) + str + string(foot) + fmt.Println(err) + + return template +} + +func Template_with_page(str string) string { + head, err := os.ReadFile("web/views/head.html") + foot, err := os.ReadFile("web/views/foot.html") + page, err := os.ReadFile("web/views/" + str + ".html") + + template := "" + string(head) + string(page) + string(foot) + fmt.Println(err) + + return template +} + +func Template_with_page_vars(str string, tags_and_variables map[string]string) string { + head, err := os.ReadFile("web/views/head.html") + foot, err := os.ReadFile("web/views/foot.html") + page := "" + for tag, varr := range tags_and_variables { + page = templating(str, tag, varr) + } + template := "" + string(head) + string(page) + string(foot) + fmt.Println(err) + + return template +} + +func Template_of_tag(str string, html_tag string) string { + tag, err := os.ReadFile("web/views/tag/" + html_tag + ".html") + result := strings.Replace(string(tag), "", str, 1) + fmt.Println(err) + + return result +} + +func templating(file string, tag string, variable string) string { + content, err := os.ReadFile("web/views/" + file + ".html") + if err != nil { + fmt.Println(err) + os.Exit(1) + } + find_tag := `{` + tag + `}` + + template_result := strings.Replace(string(content), find_tag, variable, 1) + + return template_result +} diff --git a/web/views/foot.html b/web/views/foot.html new file mode 100644 index 0000000..c7361de --- /dev/null +++ b/web/views/foot.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/views/head.html b/web/views/head.html new file mode 100644 index 0000000..b5124e0 --- /dev/null +++ b/web/views/head.html @@ -0,0 +1,8 @@ + + + + + + Document + + \ No newline at end of file diff --git a/web/views/main.html b/web/views/main.html new file mode 100644 index 0000000..0f2b85c --- /dev/null +++ b/web/views/main.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/views/part/key-val.html b/web/views/part/key-val.html new file mode 100644 index 0000000..8f406b4 --- /dev/null +++ b/web/views/part/key-val.html @@ -0,0 +1 @@ +: \ No newline at end of file diff --git a/web/views/tag/text.html b/web/views/tag/text.html new file mode 100644 index 0000000..3fdb996 --- /dev/null +++ b/web/views/tag/text.html @@ -0,0 +1,3 @@ +
+

+
\ No newline at end of file diff --git a/web/web.go b/web/web.go new file mode 100644 index 0000000..48360e0 --- /dev/null +++ b/web/web.go @@ -0,0 +1,25 @@ +package web + +import ( + "api_manager/web/api" + "api_manager/web/manager" + "api_manager/web/render" + "fmt" + "net/http" +) + +func Server() { + http.HandleFunc("/", main_page) + + http.HandleFunc("/mgr/add", manager.Add_api) + http.HandleFunc("/mgr/show", manager.Show_apis) + http.HandleFunc("/api/", api.Get_api) + + http.ListenAndServe(":8090", nil) +} + +// wellcoming main web page +func main_page(w http.ResponseWriter, req *http.Request) { + templ := map[string]string{"welcome_message": "hello world! this is api server with easy web menagment"} + fmt.Fprint(w, render.Template_with_page_vars("main", templ)) +}