package routes import ( "encoding/json" "net/http" "reichard.io/imagini/internal/context" ) type ImaginiContext struct { *context.ImaginiContext } func RegisterRoutes(cctx *context.ImaginiContext) { ctx := &ImaginiContext{cctx} http.HandleFunc("/MediaItems", ctx.mediaItemsHandler) http.HandleFunc("/Upload", ctx.uploadHandler) http.HandleFunc("/Albums", ctx.albumsHandler) http.HandleFunc("/Logout", ctx.logoutHandler) http.HandleFunc("/Login", ctx.loginHandler) http.HandleFunc("/Users", ctx.usersHandler) http.HandleFunc("/Tags", ctx.tagsHandler) http.HandleFunc("/Info", ctx.infoHandler) http.HandleFunc("/Me", ctx.meHandler) } // https://stackoverflow.com/a/59764037 func JSONError(w http.ResponseWriter, err string, code int) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("X-Content-Type-Options", "nosniff") w.WriteHeader(code) json.NewEncoder(w).Encode(map[string]interface{}{"error": err}) } func JSONSuccess(w http.ResponseWriter, msg string, code int) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("X-Content-Type-Options", "nosniff") w.WriteHeader(code) json.NewEncoder(w).Encode(map[string]interface{}{"success": msg}) } // METHOD: // switch r.Method { // case http.MethodGet: // // Serve the resource. // case http.MethodPost: // // Create a new record. // case http.MethodPut: // // Update an existing record. // case http.MethodDelete: // // Remove the record. // default: // // Give an error message. // } // commonMiddleware := []Middleware{ // logMiddleware, // authMiddleware, // } // http.Handle("/Users", MultipleMiddleware(usersHandler, commonMiddleware...)) // http.Handle("/Uploads/", MultipleMiddleware(uploadsHandler, commonMiddleware...)) // // http.HandleFunc("/uploads/", uploadsHandler()) // http.Handle("/Uploads/", func(next http.Handler) http.Handler { // return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // _, ok := ValidateUserToken(r) // if ok { // next.ServeHTTP(w, r) // } else { // w.WriteHeader(http.StatusUnauthorized) // } // }) // }(http.StripPrefix("/Uploads/", tusHandler))) // Filter Example: // query := r.URL.Query() // filters, present := query["filters"] // func uploadsHandler() http.Handler { // store := filestore.FileStore{ // Path: "./Uploads", // } // composer := tusd.NewStoreComposer() // store.UseIn(composer) // // handler, err := tusd.NewHandler(tusd.Config{ // BasePath: "/uploads/", // StoreComposer: composer, // NotifyCompleteUploads: true, // }) // // if err != nil { // panic(fmt.Errorf("Unable to create handler: %s", err)) // } // // go func() { // for { // event := <-handler.CompleteUploads // fmt.Printf("Upload %s finished\n", event.Upload.ID) // } // }() // // // return func(w http.ResponseWriter, r *http.Request) { // // http.StripPrefix("/Uploads/", handler).ServeHTTP(w, r) // // }; // // return http.StripPrefix("/Uploads/", handler) // } // func processMedia() { // var mi db.MediaItem // // TODO: // - Derive Magic -> mediaType // - Create Thumbnail // - Pull EXIF // - EXIFDate // - Latitude // - Longitude // - TensorFlow Classification // - https://outcrawl.com/image-recognition-api-go-tensorflow // - Update Tags / MediaTags Table // - Save Image // - Update MediaItems Table // import "github.com/disintegration/imaging" // // img, err := imaging.Open("original.jpg", imaging.AutoOrientation(true)) // if err != nil { // return nil, err // } // // img = imaging.Fit(img, 240, 160, imaging.Lanczos) // err = imaging.Save(img, "thumbnail.jpg") // }