From 822df7fe35285655fd2d1659a6fcce1368509a5c Mon Sep 17 00:00:00 2001 From: Adalricus Ovicula Date: Sun, 2 Feb 2020 16:44:51 +0530 Subject: [PATCH] Initial Commit --- LICENSE | 13 ++++ README | 12 ++++ main.go | 137 +++++++++++++++++++++++++++++++++++++++++++ static/favicon.png | Bin 0 -> 10206 bytes static/style.css | 136 ++++++++++++++++++++++++++++++++++++++++++ templates/index.html | 35 +++++++++++ templates/short.html | 36 ++++++++++++ 7 files changed, 369 insertions(+) create mode 100644 LICENSE create mode 100644 README create mode 100644 main.go create mode 100644 static/favicon.png create mode 100644 static/style.css create mode 100644 templates/index.html create mode 100644 templates/short.html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7ed2d04 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2020, Adalricus Ovicula + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README b/README new file mode 100644 index 0000000..152c5c9 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +Cortris +======= + +Cortris is a simple url shortener + +Database Structure +------------------ +Database Name: cortris + +shortURL: Not Null +time: Not Null +url: Primary Key & Not Null diff --git a/main.go b/main.go new file mode 100644 index 0000000..860166a --- /dev/null +++ b/main.go @@ -0,0 +1,137 @@ +// Cortris is a simple url shortener + +// Copyright (c) 2020, Adalricus Ovicula +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +package main + +import ( + "database/sql" + "html/template" + "log" + "math/rand" + "net/http" + "time" + + "github.com/gorilla/mux" + _ "github.com/mattn/go-sqlite3" +) + +func main() { + rand.Seed(time.Now().UnixNano()) + r := mux.NewRouter() + r.HandleFunc("/", indexH).Methods("GET") + r.HandleFunc("/short/", sURLH).Methods("POST") + r.HandleFunc("/{sURL}/", urlH).Methods("GET") + + r.PathPrefix("/static/"). + Handler(http.FileServer(http.Dir("./"))) + + log.Println("listening on port 8080...") + srv := &http.Server{ + Handler: r, + Addr: "127.0.0.1:8080", + WriteTimeout: 8 * time.Second, + ReadTimeout: 8 * time.Second, + } + log.Fatal(srv.ListenAndServe()) +} + +type shortP struct { + ShortURL string + URL string +} + +func indexH(w http.ResponseWriter, r *http.Request) { + t, _ := template.ParseFiles("templates/index.html") + t.Execute(w, nil) +} + +// This is the POST endpoint +func sURLH(w http.ResponseWriter, r *http.Request) { + if err := r.ParseForm(); err != nil { + errChk(err) + } + + dbL := "/home/adalricus/projects/db/adalricus.db" + url := r.FormValue("url") + db, err := sql.Open("sqlite3", dbL) + errChk(err) + defer db.Close() + + // Checks if url is already in the database + stmt, err := db.Prepare("SELECT shortURL FROM cortris WHERE url = ?") + errChk(err) + defer stmt.Close() + + var shortURL string + err = stmt.QueryRow(url).Scan(&shortURL) + + // If short url doesn't exist then create it + if len(shortURL) == 0 { + shortURL = randS(8) + tx, err := db.Begin() + errChk(err) + + stmt, err := tx.Prepare("INSERT INTO cortris(url, shortURL, time) VALUES(?, ?, ?)") + errChk(err) + + defer stmt.Close() + _, err = stmt.Exec(url, shortURL, time.Now().UTC()) + errChk(err) + + tx.Commit() + } + + p := shortP{ + ShortURL: shortURL, + URL: url} + t, _ := template.ParseFiles("templates/short.html") + t.Execute(w, p) +} + +// This handles short urls +func urlH(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + shortURL := vars["sURL"] + + dbL := "/home/adalricus/projects/db/adalricus.db" + db, err := sql.Open("sqlite3", dbL) + errChk(err) + defer db.Close() + stmt, err := db.Prepare("SELECT url FROM cortris WHERE shortURL = ?") + errChk(err) + + var url string + err = stmt.QueryRow(shortURL).Scan(&url) + + if len(url) != 0 { + http.Redirect(w, r, url, http.StatusSeeOther) + } +} + +func errChk(err error) { + if err != nil { + log.Fatal(err) + } +} + +func randS(n int) string { + var alphaNum = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + b := make([]rune, n) + for i := range b { + b[i] = alphaNum[rand.Intn(len(alphaNum))] + } + return string(b) +} diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b64d71bbf986d0281d160106d2e5410d19c48c91 GIT binary patch literal 10206 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 literal 0 HcmV?d00001 diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..1b43d3e --- /dev/null +++ b/static/style.css @@ -0,0 +1,136 @@ +html { + font-family: "Fira Sans"; + line-height: 1.5; + background-color: #282a2e; + color: #c5c8c6; +} +body { + margin: auto; + padding: 0; + max-width: 80ch; +} +header, +main, +footer { + margin: 1rem; + padding: 0.5rem 1rem; +} +main { + background-color: #1d1f21; +} +footer { + text-align: right; +} +blockquote { + padding: .5rem 1rem; + margin: .8rem 0; + color: #c5c8c6; + border-left: .25rem solid #282a2e; +} +@media (min-width: 30em) { + blockquote { + padding-right: 5rem; + padding-left: 1.25rem; + } +} +img { + display: block; + margin: auto; + border-radius: 5px; + max-width: 100%; +} +code { + padding: .25em .5em; + font-size: 85%; + background-color: #282a2e; + border-radius: 0; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + padding: 1rem; + font-size: .8rem; + line-height: 1.4; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + background-color: #282a2e; +} +pre code { + padding: 0; + font-size: 100%; + color: inherit; + background-color: transparent; +} +a { + color: #81a2be; + text-decoration: none; + border-bottom: 0.1rem dashed #81a2be; +} +a:visited { + color: #b294bb; +} +a:hover, +a:focus { + border-bottom: 0.2rem solid #81a2be; +} +h1, h2, h3, h4, h5, h6 { + margin-bottom: .5rem; + font-weight: 400; + line-height: 1.25; +} +h1 { + font-size: 2rem; + border-bottom: 0.16rem solid #cc6666; +} +h2 { + margin-top: 1rem; + font-size: 1.5rem; +} +h3 { + margin-top: 1.5rem; + font-size: 1.25rem; +} +h4, +h5, +h6 { + margin-top: 1rem; + font-size: 1rem; +} +ul, ol, dl { + margin: 1rem 0; +} +hr { + color: #cc6666; +} +table { + margin-bottom: 1rem; + width: 100%; + border: 1px solid #282a2e; + border-collapse: collapse; +} +td, +th { + padding: .25rem .5rem; + border: 1px solid #282a2e; +} +tbody tr:nth-child(odd) td, +tbody tr:nth-child(odd) th { + background-color: #282a2e; +} +button, +input, +select, +textarea { + background-color: #282a2e; + color: #c5c8c6; + padding: 0.2rem 0.8rem; +} +textarea { + width: 80%; +} +textarea { + resize: vertical; +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..d4cd9c6 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,35 @@ + + + + Cortris + + + + + +
+ index + ⁘ ⁘ + cortris +
+
+

Cortris

+

+ Cortris is a simple url shortener +

+
+

URL to shorten

+ + +
+
+
+
+

+ Copyright © 2020 Adalricus Ovicula
+ Cortris is licensed under the ISC License. + +

+
+ + diff --git a/templates/short.html b/templates/short.html new file mode 100644 index 0000000..1b4369f --- /dev/null +++ b/templates/short.html @@ -0,0 +1,36 @@ + + + + Cortris + + + + + +
+ index + ⁘ ⁘ + cortris +
+
+

Cortris

+ +
+

URL to shorten

+ + +
+
+
+ + +