1st commit
This commit is contained in:
		
						commit
						e439115501
					
				
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | pkg/ | ||||||
|  | .go/ | ||||||
|  | .vscode/ | ||||||
|  | 
 | ||||||
|  | config.json | ||||||
|  | chromagies | ||||||
|  | log.txt | ||||||
							
								
								
									
										5
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | module chromagies | ||||||
|  | 
 | ||||||
|  | go 1.24.2 | ||||||
|  | 
 | ||||||
|  | require github.com/gorilla/mux v1.8.1 | ||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= | ||||||
|  | github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= | ||||||
							
								
								
									
										107
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"chromagies/src/api" | ||||||
|  | 	"chromagies/src/config" | ||||||
|  | 	"fmt" | ||||||
|  | 	"log" | ||||||
|  | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | 	"os/signal" | ||||||
|  | 	"syscall" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"github.com/gorilla/mux" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var router *mux.Router | ||||||
|  | var logFile *os.File | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 	startTime := time.Now() | ||||||
|  | 	log.SetOutput(os.Stdout) | ||||||
|  | 	log.Println("============================================================") | ||||||
|  | 	log.Println("Starting server...") | ||||||
|  | 
 | ||||||
|  | 	go handleStopSignal() | ||||||
|  | 
 | ||||||
|  | 	initConfig() | ||||||
|  | 	startLogger() | ||||||
|  | 
 | ||||||
|  | 	initRouter() | ||||||
|  | 
 | ||||||
|  | 	stopTime := time.Now() | ||||||
|  | 	log.Printf("Server ready in %d microseconds\n", stopTime.Sub(startTime).Microseconds()) | ||||||
|  | 
 | ||||||
|  | 	var conf config.Server = (config.GetConfig()).Server | ||||||
|  | 
 | ||||||
|  | 	http.ListenAndServe(fmt.Sprintf("%s:%s", conf.IP, conf.Port), router) | ||||||
|  | 	stopServer() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func startLogger() { | ||||||
|  | 	var conf config.Logger = (config.GetConfig()).Logger | ||||||
|  | 	if conf.Output != "" { | ||||||
|  | 		var err error | ||||||
|  | 		logFile, err = os.OpenFile(conf.Output, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Printf("Output file \"%s\" un-openable : %s", conf.Output, err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		log.Printf("Switching logs to output file \"%s\"\nStopping to log in the console", conf.Output) | ||||||
|  | 		log.SetOutput(logFile) | ||||||
|  | 		log.Println("============================================================") | ||||||
|  | 		log.Printf("Hi there ! Server is starting...") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func initConfig() { | ||||||
|  | 	var err error | ||||||
|  | 	err = config.ReadConfigFile() | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		err = config.CreateConfigFile() | ||||||
|  | 
 | ||||||
|  | 		if err == nil { | ||||||
|  | 			err = config.ReadConfigFile() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatal("Cannot read/write config file !") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func initRouter() { | ||||||
|  | 	router = mux.NewRouter() | ||||||
|  | 
 | ||||||
|  | 	// routeur.NotFoundHandler = TODO | ||||||
|  | 
 | ||||||
|  | 	api.Init(router) | ||||||
|  | 
 | ||||||
|  | 	router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static/")))) | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func handleStopSignal() { | ||||||
|  | 	sigs := make(chan os.Signal, 1) | ||||||
|  | 	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) | ||||||
|  | 	<-sigs | ||||||
|  | 	close(sigs) | ||||||
|  | 	stopServer() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func stopServer() { | ||||||
|  | 	log.Println("Stopping server...") | ||||||
|  | 
 | ||||||
|  | 	// Close everything | ||||||
|  | 
 | ||||||
|  | 	if logFile != nil { | ||||||
|  | 		log.Println("Closing log file, giving back log output to console") | ||||||
|  | 		logFile.Close() | ||||||
|  | 		log.SetOutput(os.Stdout) | ||||||
|  | 	} | ||||||
|  | 	log.Println("Server stopped") | ||||||
|  | 	os.Exit(0) | ||||||
|  | } | ||||||
							
								
								
									
										98
									
								
								src/api/api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/api/api.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,98 @@ | |||||||
|  | package api | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  | 
 | ||||||
|  | 	"github.com/gorilla/mux" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var apiRootPath string = "/api/v1" | ||||||
|  | 
 | ||||||
|  | func Init(router *mux.Router) { | ||||||
|  | 
 | ||||||
|  | 	router.HandleFunc(apiRootPath, apiRoot).Methods("GET") | ||||||
|  | 
 | ||||||
|  | 	routerAuth := router.PathPrefix(apiRootPath + "/auth").Subrouter() | ||||||
|  | 	routerPage := router.PathPrefix(apiRootPath + "/page").Subrouter() | ||||||
|  | 	routerUser := router.PathPrefix(apiRootPath + "/user").Subrouter() | ||||||
|  | 	routerTag := router.PathPrefix(apiRootPath + "/tag").Subrouter() | ||||||
|  | 
 | ||||||
|  | 	routerAuth.HandleFunc("", apiAuth) | ||||||
|  | 	routerAuth.HandleFunc("/login", apiAuthLogin) | ||||||
|  | 	routerAuth.HandleFunc("/logout", apiAuthLogout) | ||||||
|  | 
 | ||||||
|  | 	routerPage.HandleFunc("", apiPage) | ||||||
|  | 	routerPage.HandleFunc("/{folder}", apiPageFolder) | ||||||
|  | 	routerPage.HandleFunc("/{folder}/{page}", apiPageFolderPage) | ||||||
|  | 	routerPage.HandleFunc("/{folder}/{page}/content", apiPageFolderPageContent) | ||||||
|  | 
 | ||||||
|  | 	routerUser.HandleFunc("", apiUser) | ||||||
|  | 	routerUser.HandleFunc("/{name}", apiUserName) | ||||||
|  | 
 | ||||||
|  | 	routerTag.HandleFunc("", apiTag) | ||||||
|  | 	routerTag.HandleFunc("/{name}", apiTagName) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // API ROOT | ||||||
|  | 
 | ||||||
|  | func apiRoot(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API ROOT") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // API Auth | ||||||
|  | 
 | ||||||
|  | func apiAuth(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API Auth") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiAuthLogin(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API Auth Login") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiAuthLogout(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API Auth Logout") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // API Page | ||||||
|  | 
 | ||||||
|  | func apiPage(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API Page") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiPageFolder(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	vars := mux.Vars(r) | ||||||
|  | 	fmt.Fprintf(w, "API Page Folder(%s)", vars["folder"]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiPageFolderPage(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	vars := mux.Vars(r) | ||||||
|  | 	fmt.Fprintf(w, "API Page Folder(%s) Page(%s)", vars["folder"], vars["page"]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiPageFolderPageContent(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	vars := mux.Vars(r) | ||||||
|  | 	fmt.Fprintf(w, "API Page Folder(%s) Page(%s) Content", vars["folder"], vars["page"]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // API User | ||||||
|  | 
 | ||||||
|  | func apiUser(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API User") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiUserName(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	vars := mux.Vars(r) | ||||||
|  | 	fmt.Fprintf(w, "API User Name(%s)", vars["name"]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // API Tag | ||||||
|  | 
 | ||||||
|  | func apiTag(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	fmt.Fprintf(w, "API Tag") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func apiTagName(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	vars := mux.Vars(r) | ||||||
|  | 	fmt.Fprintf(w, "API Tag Name(%s)", vars["name"]) | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								src/config/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/config/config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | package config | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"log" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const CONFIG_FILE_NAME string = "./config.json" | ||||||
|  | const CONFIG_FILE_DEFAULT_CONF string = `{ | ||||||
|  |     "Database": { | ||||||
|  |         "Host": "localhost", | ||||||
|  |         "Port": "3306", | ||||||
|  |         "Database": "Chromagies", | ||||||
|  |         "User": "chromagies_user", | ||||||
|  |         "Password": "12345678" | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     "Logger": { | ||||||
|  |         "Output": "./log.txt" | ||||||
|  |     }, | ||||||
|  |     "Server": { | ||||||
|  |         "Port": "12345" | ||||||
|  |     } | ||||||
|  | }` | ||||||
|  | 
 | ||||||
|  | type Database struct { | ||||||
|  | 	Host     string | ||||||
|  | 	Port     string | ||||||
|  | 	Database string | ||||||
|  | 	User     string | ||||||
|  | 	Password string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Logger struct { | ||||||
|  | 	Output string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Server struct { | ||||||
|  | 	IP   string | ||||||
|  | 	Port string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Config struct { | ||||||
|  | 	Database Database | ||||||
|  | 	Logger   Logger | ||||||
|  | 	Server   Server | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var config Config | ||||||
|  | 
 | ||||||
|  | func ReadConfigFile() error { | ||||||
|  | 	log.Println("Reading config file") | ||||||
|  | 	file, err := os.Open(CONFIG_FILE_NAME) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	defer file.Close() | ||||||
|  | 
 | ||||||
|  | 	err = json.NewDecoder(file).Decode(&config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	log.Println("Reading config OK") | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateConfigFile() error { | ||||||
|  | 	log.Println("Creating config file") | ||||||
|  | 	file, err := os.Create(CONFIG_FILE_NAME) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err = file.WriteString(CONFIG_FILE_DEFAULT_CONF) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetConfig() Config { | ||||||
|  | 	return config | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								src/database/database.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/database/database.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | package database | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"chromagies/src/config" | ||||||
|  | 	"database/sql" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var db *sql.DB | ||||||
|  | var dbConfig config.Database | ||||||
|  | var dbPath string | ||||||
|  | 
 | ||||||
|  | func Init(conf config.Config) { | ||||||
|  | 	dbConfig = conf.Database | ||||||
|  | 	dbPath = fmt.Sprintf("%s:%s@(%s:%d)/%s?parseTime=true", dbConfig.Host, dbConfig.Password, dbConfig.Host, dbConfig.Port, dbConfig.Database) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func openDB() { | ||||||
|  | 	var err error | ||||||
|  | 
 | ||||||
|  | 	if db != nil { | ||||||
|  | 		db.Close() | ||||||
|  | 		db = nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	db, err = sql.Open("mysql", dbPath) | ||||||
|  | 	if err != nil { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								static/test.jpg
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								static/test.jpg
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 434 KiB | 
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user