|
@@ -1,6 +1,7 @@
|
|
package main
|
|
package main
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "strconv"
|
|
"fmt"
|
|
"fmt"
|
|
"github.com/boombuler/barcode"
|
|
"github.com/boombuler/barcode"
|
|
"github.com/boombuler/barcode/qr"
|
|
"github.com/boombuler/barcode/qr"
|
|
@@ -10,23 +11,22 @@ import (
|
|
"html/template"
|
|
"html/template"
|
|
"image"
|
|
"image"
|
|
"image/png"
|
|
"image/png"
|
|
- "log"
|
|
|
|
- "net/http"
|
|
|
|
"io/ioutil"
|
|
"io/ioutil"
|
|
|
|
+ "math/rand"
|
|
|
|
+ "net/http"
|
|
"os"
|
|
"os"
|
|
"strings"
|
|
"strings"
|
|
- "math/rand"
|
|
|
|
"time"
|
|
"time"
|
|
)
|
|
)
|
|
|
|
|
|
func init() {
|
|
func init() {
|
|
- rand.Seed(time.Now().UnixNano())
|
|
|
|
|
|
+ rand.Seed(time.Now().UnixNano())
|
|
}
|
|
}
|
|
|
|
|
|
-var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
|
|
|
|
|
+var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
|
|
|
|
|
|
func main() {
|
|
func main() {
|
|
-
|
|
|
|
|
|
+ // port := os.Getenv("PORT")
|
|
r := mux.NewRouter()
|
|
r := mux.NewRouter()
|
|
|
|
|
|
r.HandleFunc("/", PrinterList)
|
|
r.HandleFunc("/", PrinterList)
|
|
@@ -37,16 +37,35 @@ func main() {
|
|
r.HandleFunc("/cartridgeOfPrinter", AddCartridgeOfPrinter)
|
|
r.HandleFunc("/cartridgeOfPrinter", AddCartridgeOfPrinter)
|
|
r.HandleFunc("/compatible", FindCompatibleCartridges)
|
|
r.HandleFunc("/compatible", FindCompatibleCartridges)
|
|
r.HandleFunc("/printer/{printerName}", PrinterPage)
|
|
r.HandleFunc("/printer/{printerName}", PrinterPage)
|
|
|
|
+ r.HandleFunc("/cartridges", CartridgePage)
|
|
|
|
+ r.HandleFunc("/updateCartridge", updateCartridges)
|
|
fmt.Println("Server is listening...")
|
|
fmt.Println("Server is listening...")
|
|
|
|
|
|
http.Handle("/", r)
|
|
http.Handle("/", r)
|
|
- http.ListenAndServe(":8888", nil)
|
|
|
|
|
|
+ http.ListenAndServe(":80"/*+port*/, nil)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func updateCartridges(w http.ResponseWriter, r *http.Request){
|
|
|
|
+ db, _ := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
|
+
|
|
|
|
+ r.ParseForm()
|
|
|
|
+ selectedCartridge := strings.Join(r.Form["cartridges"], "")
|
|
|
|
+ var cartridge Cartridges
|
|
|
|
+ db.Where("Name = ?", selectedCartridge).First(&cartridge)
|
|
|
|
+ quantity, err := strconv.Atoi(strings.Join(r.Form["cartridgeQuantity"], ""))
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println("Someone tries to update int value by string. Someone: " + r.RemoteAddr)
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ newQuantity := cartridge.Quantity + uint(quantity)
|
|
|
|
+ db.Model(&cartridge).Update("Quantity", newQuantity)
|
|
|
|
+ http.Redirect(w, r, "/", 301)
|
|
}
|
|
}
|
|
|
|
|
|
-func generateCompatible(w http.ResponseWriter, r *http.Request){
|
|
|
|
|
|
+func generateCompatible(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Println("New generating request from" + r.RemoteAddr)
|
|
fmt.Println("New generating request from" + r.RemoteAddr)
|
|
data, err := ioutil.ReadAll(r.Body)
|
|
data, err := ioutil.ReadAll(r.Body)
|
|
- if err != nil{
|
|
|
|
|
|
+ if err != nil {
|
|
fmt.Println("Something went wrong during generating QR code")
|
|
fmt.Println("Something went wrong during generating QR code")
|
|
fmt.Fprintf(w, "Something went wrong during generating QR code")
|
|
fmt.Fprintf(w, "Something went wrong during generating QR code")
|
|
}
|
|
}
|
|
@@ -54,11 +73,42 @@ func generateCompatible(w http.ResponseWriter, r *http.Request){
|
|
fmt.Println("Generated name " + filename + " for " + r.RemoteAddr)
|
|
fmt.Println("Generated name " + filename + " for " + r.RemoteAddr)
|
|
generateFromText(string(data), filename)
|
|
generateFromText(string(data), filename)
|
|
fmt.Println("Generated file " + filename + ".png for " + r.RemoteAddr)
|
|
fmt.Println("Generated file " + filename + ".png for " + r.RemoteAddr)
|
|
- w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename +".png"))
|
|
|
|
|
|
+ w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename+".png"))
|
|
http.ServeFile(w, r, filename)
|
|
http.ServeFile(w, r, filename)
|
|
fmt.Println("Served file " + filename + ".png for " + r.RemoteAddr)
|
|
fmt.Println("Served file " + filename + ".png for " + r.RemoteAddr)
|
|
os.Remove(filename + ".png")
|
|
os.Remove(filename + ".png")
|
|
fmt.Println("Removed file " + filename + ".png")
|
|
fmt.Println("Removed file " + filename + ".png")
|
|
|
|
+ http.Redirect(w, r, "/", 301)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func CartridgePage(w http.ResponseWriter, r *http.Request) {
|
|
|
|
+ db, err := gorm.Open(sqlite.Open("printer.db"), &gorm.Config{})
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println("Error during opening DB")
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ var cartridges []Cartridges
|
|
|
|
+ var names []string
|
|
|
|
+ db.Find(&cartridges)
|
|
|
|
+ for _, v := range cartridges {
|
|
|
|
+ qua := fmt.Sprint(v.Quantity)
|
|
|
|
+ name := v.Name + ": " + qua
|
|
|
|
+ names = append(names, name)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ data := CartridgesOutput{
|
|
|
|
+ Name: names,
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ tmpl, err := template.ParseFiles("cartridges.gohtml")
|
|
|
|
+
|
|
|
|
+ if err != nil{
|
|
|
|
+ fmt.Println("Error parsing files")
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ tmpl.Execute(w, data)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
func PrinterPage(w http.ResponseWriter, r *http.Request) {
|
|
func PrinterPage(w http.ResponseWriter, r *http.Request) {
|
|
@@ -81,7 +131,7 @@ func PrinterPage(w http.ResponseWriter, r *http.Request) {
|
|
db.Where("Printer_Id = ?", printer.ID).Find(&cot)
|
|
db.Where("Printer_Id = ?", printer.ID).Find(&cot)
|
|
for _, v := range cot {
|
|
for _, v := range cot {
|
|
var cart Cartridges
|
|
var cart Cartridges
|
|
- if v.Printer_Id == printer.ID{
|
|
|
|
|
|
+ if v.Printer_Id == printer.ID {
|
|
db.Where("ID = ?", v.Cartridge_Id).First(&cart)
|
|
db.Where("ID = ?", v.Cartridge_Id).First(&cart)
|
|
cartridges = append(cartridges, cart.Name)
|
|
cartridges = append(cartridges, cart.Name)
|
|
}
|
|
}
|
|
@@ -94,11 +144,6 @@ func PrinterPage(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
tmpl, _ := template.ParseFiles("output.html")
|
|
tmpl, _ := template.ParseFiles("output.html")
|
|
tmpl.Execute(w, data)
|
|
tmpl.Execute(w, data)
|
|
- // fmt.Fprintf(w, "Выбранный принтер: %v\n", name)
|
|
|
|
- // fmt.Fprintf(w, "Совместимые картриджи (" + string(len(cartridges)) + ")\n")
|
|
|
|
- // for _, cartridge := range cartridges{
|
|
|
|
- // fmt.Fprintf(w, cartridge)
|
|
|
|
- // }
|
|
|
|
} else {
|
|
} else {
|
|
http.Redirect(w, r, "https://www.youtube.com/watch?v=dQw4w9WgXcQ", 301)
|
|
http.Redirect(w, r, "https://www.youtube.com/watch?v=dQw4w9WgXcQ", 301)
|
|
}
|
|
}
|
|
@@ -195,11 +240,67 @@ func AddPrinter(w http.ResponseWriter, r *http.Request) {
|
|
}
|
|
}
|
|
|
|
|
|
func GenerateQR(w http.ResponseWriter, r *http.Request) {
|
|
func GenerateQR(w http.ResponseWriter, r *http.Request) {
|
|
- r.ParseForm()
|
|
|
|
|
|
+ r.ParseForm() // Получение имени принтера
|
|
text := strings.Join(r.Form["printer"], "")
|
|
text := strings.Join(r.Form["printer"], "")
|
|
- w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", text+".png"))
|
|
|
|
- generateFromText(text, text)
|
|
|
|
- http.ServeFile(w, r, text)
|
|
|
|
|
|
+ GenerateFromWeb(w, r, text)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func GenerateFromWeb(w http.ResponseWriter, r *http.Request, printerName string) {
|
|
|
|
+ qrtext := "https://printers-ttit.herokuapp.com/printer/" + printerName // Генерация URL
|
|
|
|
+ fmt.Println("Generating QR code with text: " + qrtext + " for " + r.RemoteAddr)
|
|
|
|
+ filename := GenerateRandomString(10) // Генерация имени файла
|
|
|
|
+ fmt.Println("Generated filename " + filename + " for " + r.RemoteAddr)
|
|
|
|
+ err := generateFromText(qrtext, filename) // qrtext - текст в QR, filename - имя файла
|
|
|
|
+
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fmt.Println("Setting header Content-Disposition for " + r.RemoteAddr)
|
|
|
|
+ w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename+".png"))
|
|
|
|
+ fmt.Println("Starting serving file for " + r.RemoteAddr)
|
|
|
|
+ http.ServeFile(w, r, filename+".png")
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func generateFromText(text string, filename string) error {
|
|
|
|
+ code, err := qr.Encode(text, qr.L, qr.Auto)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return fmt.Errorf("Error during generating QR code")
|
|
|
|
+ }
|
|
|
|
+ if text != code.Content() {
|
|
|
|
+ return fmt.Errorf("data differs")
|
|
|
|
+ }
|
|
|
|
+ code, err = barcode.Scale(code, 512, 512)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return fmt.Errorf("Error during scaling QR code")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = writePng(filename, code)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func writePng(filename string, img image.Image) error {
|
|
|
|
+ file, err := os.Create(filename + ".png")
|
|
|
|
+ if err != nil {
|
|
|
|
+ return fmt.Errorf("Creating file error")
|
|
|
|
+ }
|
|
|
|
+ err = png.Encode(file, img)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return fmt.Errorf("PNG file error")
|
|
|
|
+ }
|
|
|
|
+ file.Close()
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func GenerateRandomString(n int) string {
|
|
|
|
+ b := make([]rune, n)
|
|
|
|
+ for i := range b {
|
|
|
|
+ b[i] = letterRunes[rand.Intn(len(letterRunes))]
|
|
|
|
+ }
|
|
|
|
+ return string(b)
|
|
}
|
|
}
|
|
|
|
|
|
func PrinterList(w http.ResponseWriter, r *http.Request) {
|
|
func PrinterList(w http.ResponseWriter, r *http.Request) {
|
|
@@ -235,48 +336,12 @@ func cartridgeQR(text string, filename string) {
|
|
fmt.Println("Something went wrong...")
|
|
fmt.Println("Something went wrong...")
|
|
}
|
|
}
|
|
if text != code.Content() {
|
|
if text != code.Content() {
|
|
- log.Fatal("data differs")
|
|
|
|
|
|
+ panic("data differs")
|
|
}
|
|
}
|
|
code, err = barcode.Scale(code, 512, 512)
|
|
code, err = barcode.Scale(code, 512, 512)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Fatal(err)
|
|
|
|
|
|
+ panic(err)
|
|
}
|
|
}
|
|
|
|
|
|
writePng(filename, code)
|
|
writePng(filename, code)
|
|
}
|
|
}
|
|
-
|
|
|
|
-func generateFromText(text string, filename string) {
|
|
|
|
- code, err := qr.Encode(text, qr.L, qr.Auto)
|
|
|
|
- if err != nil {
|
|
|
|
- fmt.Println("Something went wrong...")
|
|
|
|
- }
|
|
|
|
- if text != code.Content() {
|
|
|
|
- log.Fatal("data differs")
|
|
|
|
- }
|
|
|
|
- code, err = barcode.Scale(code, 512, 512)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal(err)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- writePng(filename, code)
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func writePng(filename string, img image.Image) {
|
|
|
|
- file, err := os.Create(filename + ".png")
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal(err)
|
|
|
|
- }
|
|
|
|
- err = png.Encode(file, img)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal(err)
|
|
|
|
- }
|
|
|
|
- file.Close()
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func GenerateRandomString(n int) string {
|
|
|
|
- b := make([]rune, n)
|
|
|
|
- for i := range b {
|
|
|
|
- b[i] = letterRunes[rand.Intn(len(letterRunes))]
|
|
|
|
- }
|
|
|
|
- return string(b)
|
|
|
|
-}
|
|
|