From ee21b1793505b65bc1051d8ddc1c7532fdcae3eb Mon Sep 17 00:00:00 2001 From: Lukas Werner Date: Sat, 30 Aug 2025 22:14:57 -0700 Subject: [PATCH] feat: add download page --- assets/css/output.css | 349 +++++++++++++++++++++++------ components/badge/badge.templ | 58 +++++ components/checkbox/checkbox.templ | 70 ++++++ components/table/table.templ | 204 +++++++++++++++++ handlers/download.go | 138 ++++++++++++ handlers/list.go | 58 +++++ handlers/upload.go | 69 ++++++ main.go | 132 +---------- makefile | 2 +- pages/share_list.templ | 143 ++++++++++++ pages/upload.templ | 16 +- tmp/bin/main | Bin 0 -> 14433106 bytes tmp/build-errors.log | 1 + 13 files changed, 1039 insertions(+), 201 deletions(-) create mode 100644 components/badge/badge.templ create mode 100644 components/checkbox/checkbox.templ create mode 100644 components/table/table.templ create mode 100644 handlers/download.go create mode 100644 handlers/list.go create mode 100644 handlers/upload.go create mode 100644 pages/share_list.templ create mode 100755 tmp/bin/main create mode 100644 tmp/build-errors.log diff --git a/assets/css/output.css b/assets/css/output.css index d7c7d7e..f251794 100644 --- a/assets/css/output.css +++ b/assets/css/output.css @@ -11,14 +11,18 @@ --color-yellow-500: oklch(79.5% 0.184 86.047); --color-green-500: oklch(72.3% 0.219 149.579); --color-blue-500: oklch(62.3% 0.214 259.815); + --color-slate-950: oklch(12.9% 0.042 264.695); --color-gray-300: oklch(87.2% 0.01 258.338); --color-gray-400: oklch(70.7% 0.022 261.325); --color-gray-500: oklch(55.1% 0.027 264.364); + --color-gray-800: oklch(27.8% 0.033 256.848); + --color-gray-950: oklch(13% 0.028 261.692); + --color-white: #fff; --spacing: 0.25rem; + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); --text-sm: 0.875rem; --text-sm--line-height: calc(1.25 / 0.875); - --text-xl: 1.25rem; - --text-xl--line-height: calc(1.75 / 1.25); --text-2xl: 1.5rem; --text-2xl--line-height: calc(2 / 1.5); --text-3xl: 1.875rem; @@ -31,7 +35,6 @@ --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); - --ease-out: cubic-bezier(0, 0, 0.2, 1); --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-font-family: var(--font-sans); @@ -228,6 +231,9 @@ .pointer-events-auto { pointer-events: auto; } + .pointer-events-none { + pointer-events: none; + } .collapse { visibility: collapse; } @@ -240,27 +246,15 @@ .relative { position: relative; } - .inset-0 { - inset: calc(var(--spacing) * 0); - } .top-0 { top: calc(var(--spacing) * 0); } .right-0 { right: calc(var(--spacing) * 0); } - .bottom-0 { - bottom: calc(var(--spacing) * 0); - } .left-0 { left: calc(var(--spacing) * 0); } - .left-1 { - left: calc(var(--spacing) * 1); - } - .left-1\/2 { - left: calc(1/2 * 100%); - } .z-50 { z-index: 50; } @@ -294,6 +288,9 @@ .mt-1 { margin-top: calc(var(--spacing) * 1); } + .mt-4 { + margin-top: calc(var(--spacing) * 4); + } .mr-3 { margin-right: calc(var(--spacing) * 3); } @@ -318,6 +315,10 @@ .table { display: table; } + .size-4 { + width: calc(var(--spacing) * 4); + height: calc(var(--spacing) * 4); + } .size-9 { width: calc(var(--spacing) * 9); height: calc(var(--spacing) * 9); @@ -343,15 +344,27 @@ .h-screen { height: 100vh; } + .w-2 { + width: calc(var(--spacing) * 2); + } + .w-3 { + width: calc(var(--spacing) * 3); + } .w-4 { width: calc(var(--spacing) * 4); } - .w-7 { - width: calc(var(--spacing) * 7); + .w-9 { + width: calc(var(--spacing) * 9); + } + .w-40 { + width: calc(var(--spacing) * 40); } .w-\[39ch\] { width: 39ch; } + .w-fit { + width: fit-content; + } .w-full { width: 100%; } @@ -379,28 +392,15 @@ .grow { flex-grow: 1; } + .caption-bottom { + caption-side: bottom; + } .border-collapse { border-collapse: collapse; } .origin-left { transform-origin: left; } - .-translate-x-1 { - --tw-translate-x: calc(var(--spacing) * -1); - translate: var(--tw-translate-x) var(--tw-translate-y); - } - .-translate-x-1\/2 { - --tw-translate-x: calc(calc(1/2 * 100%) * -1); - translate: var(--tw-translate-x) var(--tw-translate-y); - } - .-translate-y-4 { - --tw-translate-y: calc(var(--spacing) * -4); - translate: var(--tw-translate-x) var(--tw-translate-y); - } - .translate-y-4 { - --tw-translate-y: calc(var(--spacing) * 4); - translate: var(--tw-translate-x) var(--tw-translate-y); - } .scale-3d { scale: var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z); } @@ -437,6 +437,9 @@ .items-start { align-items: flex-start; } + .justify-between { + justify-content: space-between; + } .justify-center { justify-content: center; } @@ -452,17 +455,20 @@ .gap-3 { gap: calc(var(--spacing) * 3); } - .gap-6 { - gap: calc(var(--spacing) * 6); - } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .overflow-auto { + overflow: auto; + } .overflow-hidden { overflow: hidden; } + .rounded-\[4px\] { + border-radius: 4px; + } .rounded-full { border-radius: calc(infinity * 1px); } @@ -483,6 +489,14 @@ border-style: var(--tw-border-style); border-width: 2px; } + .border-t { + border-top-style: var(--tw-border-style); + border-top-width: 1px; + } + .border-b { + border-bottom-style: var(--tw-border-style); + border-bottom-width: 1px; + } .border-dashed { --tw-border-style: dashed; border-style: dashed; @@ -490,27 +504,42 @@ .border-gray-400 { border-color: var(--color-gray-400); } + .border-input { + border-color: var(--input); + } .border-primary { border-color: var(--primary); } + .border-transparent { + border-color: transparent; + } .bg-background { background-color: var(--background); } - .bg-blue-500 { - background-color: var(--color-blue-500); - } .bg-destructive { background-color: var(--destructive); } .bg-gray-300 { background-color: var(--color-gray-300); } - .bg-gray-500 { - background-color: var(--color-gray-500); + .bg-gray-800 { + background-color: var(--color-gray-800); + } + .bg-gray-950 { + background-color: var(--color-gray-950); } .bg-green-500 { background-color: var(--color-green-500); } + .bg-muted { + background-color: var(--muted); + } + .bg-muted\/50 { + background-color: var(--muted); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--muted) 50%, transparent); + } + } .bg-popover { background-color: var(--popover); } @@ -526,8 +555,8 @@ .bg-selection { background-color: var(--selection); } - .bg-yellow-500 { - background-color: var(--color-yellow-500); + .bg-white { + background-color: var(--color-white); } .p-0 { padding: calc(var(--spacing) * 0); @@ -541,12 +570,21 @@ .p-4 { padding: calc(var(--spacing) * 4); } + .p-5 { + padding: calc(var(--spacing) * 5); + } .p-7 { padding: calc(var(--spacing) * 7); } + .p-8 { + padding: calc(var(--spacing) * 8); + } .p-10 { padding: calc(var(--spacing) * 10); } + .px-2 { + padding-inline: calc(var(--spacing) * 2); + } .px-3 { padding-inline: calc(var(--spacing) * 3); } @@ -556,6 +594,12 @@ .px-6 { padding-inline: calc(var(--spacing) * 6); } + .py-0 { + padding-block: calc(var(--spacing) * 0); + } + .py-0\.5 { + padding-block: calc(var(--spacing) * 0.5); + } .py-2 { padding-block: calc(var(--spacing) * 2); } @@ -568,12 +612,15 @@ .pl-2 { padding-left: calc(var(--spacing) * 2); } - .pl-4 { - padding-left: calc(var(--spacing) * 4); - } .text-center { text-align: center; } + .text-left { + text-align: left; + } + .align-middle { + vertical-align: middle; + } .text-2xl { font-size: var(--text-2xl); line-height: var(--tw-leading, var(--text-2xl--line-height)); @@ -590,6 +637,10 @@ font-size: var(--text-sm); line-height: var(--tw-leading, var(--text-sm--line-height)); } + .text-xs { + font-size: var(--text-xs); + line-height: var(--tw-leading, var(--text-xs--line-height)); + } .leading-none { --tw-leading: 1; line-height: 1; @@ -611,9 +662,15 @@ .text-destructive { color: var(--destructive); } + .text-foreground { + color: var(--foreground); + } .text-green-500 { color: var(--color-green-500); } + .text-muted-foreground { + color: var(--muted-foreground); + } .text-popover-foreground { color: var(--popover-foreground); } @@ -629,6 +686,9 @@ .text-secondary-foreground { color: var(--secondary-foreground); } + .text-white { + color: var(--color-white); + } .text-yellow-500 { color: var(--color-yellow-500); } @@ -670,11 +730,26 @@ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } + .transition-\[color\,box-shadow\] { + transition-property: color,box-shadow; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } + .transition-colors { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .transition-shadow { + transition-property: box-shadow; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } .transition-transform { transition-property: transform, translate, scale, rotate; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -688,14 +763,15 @@ --tw-ease: linear; transition-timing-function: linear; } - .ease-out { - --tw-ease: var(--ease-out); - transition-timing-function: var(--ease-out); - } .outline-none { --tw-outline-style: none; outline-style: none; } + .peer-checked\:opacity-100 { + &:is(:where(.peer):checked ~ *) { + opacity: 100%; + } + } .before\:absolute { &::before { content: var(--tw-content); @@ -762,6 +838,11 @@ background-color: var(--primary); } } + .checked\:text-primary-foreground { + &:checked { + color: var(--primary-foreground); + } + } .checked\:before\:visible { &:checked { &::before { @@ -794,6 +875,16 @@ } } } + .hover\:bg-muted\/50 { + &:hover { + @media (hover: hover) { + background-color: var(--muted); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--muted) 50%, transparent); + } + } + } + } .hover\:bg-primary\/90 { &:hover { @media (hover: hover) { @@ -894,6 +985,12 @@ } } } + .focus-visible\:outline-none { + &:focus-visible { + --tw-outline-style: none; + outline-style: none; + } + } .disabled\:pointer-events-none { &:disabled { pointer-events: none; @@ -1009,6 +1106,11 @@ right: calc(var(--spacing) * 0); } } + .data-\[tui-table-state-selected\]\:bg-muted { + &[data-tui-table-state-selected] { + background-color: var(--muted); + } + } .data-\[variant\=default\]\:bg-gray-500 { &[data-variant="default"] { background-color: var(--color-gray-500); @@ -1034,6 +1136,16 @@ background-color: var(--color-yellow-500); } } + .sm\:flex { + @media (width >= 40rem) { + display: flex; + } + } + .md\:w-3\/4 { + @media (width >= 48rem) { + width: calc(3/4 * 100%); + } + } .md\:max-w-\[420px\] { @media (width >= 48rem) { max-width: 420px; @@ -1060,6 +1172,11 @@ } } } + .dark\:text-white { + &:where(.dark, .dark *) { + color: var(--color-white); + } + } .dark\:hover\:bg-accent\/50 { &:where(.dark, .dark *) { &:hover { @@ -1120,6 +1237,102 @@ height: calc(var(--spacing) * 4); } } + .\[\&_tr\]\:border-b { + & tr { + border-bottom-style: var(--tw-border-style); + border-bottom-width: 1px; + } + } + .\[\&_tr\:last-child\]\:border-0 { + & tr:last-child { + border-style: var(--tw-border-style); + border-width: 0px; + } + } + .\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0 { + &:has([role=checkbox]) { + padding-right: calc(var(--spacing) * 0); + } + } + .\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\] { + &>[role=checkbox] { + --tw-translate-y: 2px; + translate: var(--tw-translate-x) var(--tw-translate-y); + } + } + .\[\&\>svg\]\:pointer-events-none { + &>svg { + pointer-events: none; + } + } + .\[\&\>svg\]\:size-3 { + &>svg { + width: calc(var(--spacing) * 3); + height: calc(var(--spacing) * 3); + } + } + .\[\&\>tr\]\:last\:border-b-0 { + &>tr { + &:last-child { + border-bottom-style: var(--tw-border-style); + border-bottom-width: 0px; + } + } + } + .\[a\&\]\:hover\:bg-accent { + a& { + &:hover { + @media (hover: hover) { + background-color: var(--accent); + } + } + } + } + .\[a\&\]\:hover\:bg-destructive\/90 { + a& { + &:hover { + @media (hover: hover) { + background-color: var(--destructive); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--destructive) 90%, transparent); + } + } + } + } + } + .\[a\&\]\:hover\:bg-primary\/90 { + a& { + &:hover { + @media (hover: hover) { + background-color: var(--primary); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--primary) 90%, transparent); + } + } + } + } + } + .\[a\&\]\:hover\:bg-secondary\/90 { + a& { + &:hover { + @media (hover: hover) { + background-color: var(--secondary); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--secondary) 90%, transparent); + } + } + } + } + } + .\[a\&\]\:hover\:text-accent-foreground { + a& { + &:hover { + @media (hover: hover) { + color: var(--accent-foreground); + } + } + } + } } :root { --radius: 0.65rem; @@ -1207,21 +1420,6 @@ font-feature-settings: "rlig" 1, "calt" 1; } } -@property --tw-translate-x { - syntax: "*"; - inherits: false; - initial-value: 0; -} -@property --tw-translate-y { - syntax: "*"; - inherits: false; - initial-value: 0; -} -@property --tw-translate-z { - syntax: "*"; - inherits: false; - initial-value: 0; -} @property --tw-scale-x { syntax: "*"; inherits: false; @@ -1353,12 +1551,24 @@ initial-value: ""; inherits: false; } +@property --tw-translate-x { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-y { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-z { + syntax: "*"; + inherits: false; + initial-value: 0; +} @layer properties { @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { *, ::before, ::after, ::backdrop { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-translate-z: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scale-z: 1; @@ -1388,6 +1598,9 @@ --tw-duration: initial; --tw-ease: initial; --tw-content: ""; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-translate-z: 0; } } } diff --git a/components/badge/badge.templ b/components/badge/badge.templ new file mode 100644 index 0000000..770f15d --- /dev/null +++ b/components/badge/badge.templ @@ -0,0 +1,58 @@ +// templui component badge - version: v0.94.0 installed by templui v0.94.0 +package badge + +import "git.hafen.run/lukas/timeshare/utils" + +type Variant string + +const ( + VariantDefault Variant = "default" + VariantSecondary Variant = "secondary" + VariantDestructive Variant = "destructive" + VariantOutline Variant = "outline" +) + +type Props struct { + ID string + Class string + Attributes templ.Attributes + Variant Variant +} + +templ Badge(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } + svg]:size-3 gap-1 [&>svg]:pointer-events-none", + "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", + "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "transition-[color,box-shadow] overflow-hidden", + p.variantClasses(), + p.Class, + ), + } + { p.Attributes... } + > + { children... } + +} + +func (p Props) variantClasses() string { + switch p.Variant { + case VariantDestructive: + return "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60" + case VariantOutline: + return "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground" + case VariantSecondary: + return "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90" + default: + return "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90" + } +} diff --git a/components/checkbox/checkbox.templ b/components/checkbox/checkbox.templ new file mode 100644 index 0000000..4c58ea4 --- /dev/null +++ b/components/checkbox/checkbox.templ @@ -0,0 +1,70 @@ +// templui component checkbox - version: v0.94.0 installed by templui v0.94.0 +package checkbox + +import ( + "git.hafen.run/lukas/timeshare/components/icon" + "git.hafen.run/lukas/timeshare/utils" +) + +type Props struct { + ID string + Class string + Attributes templ.Attributes + Name string + Value string + Disabled bool + Required bool + Checked bool + Form string + Icon templ.Component +} + +templ Checkbox(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } +
+ +
+ if p.Icon != nil { + @p.Icon + } else { + @icon.Check(icon.Props{Size: 14}) + } +
+
+} diff --git a/components/table/table.templ b/components/table/table.templ new file mode 100644 index 0000000..0573056 --- /dev/null +++ b/components/table/table.templ @@ -0,0 +1,204 @@ +// templui component table - version: v0.94.0 installed by templui v0.94.0 +package table + +import "git.hafen.run/lukas/timeshare/utils" + +type Props struct { + ID string + Class string + Attributes templ.Attributes +} + +type HeaderProps struct { + ID string + Class string + Attributes templ.Attributes +} + +type BodyProps struct { + ID string + Class string + Attributes templ.Attributes +} + +type FooterProps struct { + ID string + Class string + Attributes templ.Attributes +} + +type RowProps struct { + ID string + Class string + Attributes templ.Attributes + Selected bool +} + +type HeadProps struct { + ID string + Class string + Attributes templ.Attributes +} + +type CellProps struct { + ID string + Class string + Attributes templ.Attributes +} + +type CaptionProps struct { + ID string + Class string + Attributes templ.Attributes +} + +templ Table(props ...Props) { + {{ var p Props }} + if len(props) > 0 { + {{ p = props[0] }} + } +
+ + { children... } +
+
+} + +templ Header(props ...HeaderProps) { + {{ var p HeaderProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + + { children... } + +} + +templ Body(props ...BodyProps) { + {{ var p BodyProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + + { children... } + +} + +templ Footer(props ...FooterProps) { + {{ var p FooterProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + tr]:last:border-b-0", p.Class) } + { p.Attributes... } + > + { children... } + +} + +templ Row(props ...RowProps) { + {{ var p RowProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + + { children... } + +} + +templ Head(props ...HeadProps) { + {{ var p HeadProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + [role=checkbox]]:translate-y-[2px]", + p.Class, + ), + } + { p.Attributes... } + > + { children... } + +} + +templ Cell(props ...CellProps) { + {{ var p CellProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + [role=checkbox]]:translate-y-[2px]", + p.Class, + ), + } + { p.Attributes... } + > + { children... } + +} + +templ Caption(props ...CaptionProps) { + {{ var p CaptionProps }} + if len(props) > 0 { + {{ p = props[0] }} + } + + { children... } + +} diff --git a/handlers/download.go b/handlers/download.go new file mode 100644 index 0000000..f6f14fe --- /dev/null +++ b/handlers/download.go @@ -0,0 +1,138 @@ +package handlers + +import ( + "archive/zip" + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + + "github.com/gabriel-vasile/mimetype" + "github.com/valkey-io/valkey-go" +) + +func DownloadFile(client valkey.Client) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + upload_id := r.PathValue("upload_id") + if upload_id == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + file_id := r.PathValue("file_id") + if file_id == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + + files_json, err := client.Do(r.Context(), + client.B().Get().Key(upload_id).Build()).ToString() + if err != nil { + http.Error(w, err.Error(), http.StatusNotFound) + return + } + var files []string + err = json.Unmarshal([]byte(files_json), &files) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + found := false + found_id := 0 + for i, id := range files { + if id == file_id { + found = true + found_id = i + } + } + if !found { + http.Error(w, "not found", http.StatusNotFound) + return + + } + + file := files[found_id] + + filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() + if err != nil { + return + } + fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() + if err != nil { + return + } + w.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) + mime := mimetype.Detect(fileContents) + w.Header().Add("mimetype", mime.String()) + w.Write(fileContents) + } +} +func DownloadFilesZipped(client valkey.Client) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + upload_id := r.PathValue("upload_id") + if upload_id == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + + files_json, err := client.Do(r.Context(), + client.B().Get().Key(upload_id).Build()).ToString() + if err != nil { + http.Error(w, err.Error(), http.StatusNotFound) + return + } + + var files []string + + err = json.Unmarshal([]byte(files_json), &files) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if len(files) == 1 { + file := files[0] + + filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() + if err != nil { + return + } + fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() + if err != nil { + return + } + w.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) + mime := mimetype.Detect(fileContents) + w.Header().Add("mimetype", mime.String()) + w.Write(fileContents) + return + } + + zipBuf := new(bytes.Buffer) + zipWriter := zip.NewWriter(zipBuf) + + for _, file := range files { + filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() + if err != nil { + continue + } + fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() + if err != nil { + continue + } + w, err := zipWriter.Create(filename) + if err != nil { + continue + } + w.Write(fileContents) + + } + + zipWriter.Close() + w.Header().Add("mimetype", "application/zip") + w.Header().Add("Content-Disposition", `attachment; filename="timeshare-download.zip"`) + io.Copy(w, zipBuf) + + } +} diff --git a/handlers/list.go b/handlers/list.go new file mode 100644 index 0000000..f870806 --- /dev/null +++ b/handlers/list.go @@ -0,0 +1,58 @@ +package handlers + +import ( + "encoding/json" + "net/http" + "time" + + "git.hafen.run/lukas/timeshare/pages" + "github.com/a-h/templ" + "github.com/valkey-io/valkey-go" +) + +func ListFiles(client valkey.Client) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + upload_id := r.PathValue("upload_id") + if upload_id == "" { + w.WriteHeader(http.StatusBadRequest) + return + } + + expiresInt, err := client.Do(r.Context(), client.B().Ttl().Key(upload_id).Build()).AsInt64() + if err != nil { + http.Error(w, err.Error(), http.StatusNotFound) + return + } + expiresIn := time.Second * time.Duration(expiresInt) + expires := time.Now().Add(expiresIn) + + files_json, err := client.Do(r.Context(), + client.B().Get().Key(upload_id).Build()).ToString() + if err != nil { + http.Error(w, err.Error(), http.StatusNotFound) + return + } + + var fileIds []string + + err = json.Unmarshal([]byte(files_json), &fileIds) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + files := make([]pages.File, len(fileIds)) + for i, fileid := range fileIds { + filename, err := client.Do(r.Context(), client.B().Get().Key(fileid+":filename").Build()).ToString() + if err != nil { + continue + } + files[i] = pages.File{ + Filename: filename, + Key: fileid, + } + } + + templ.Handler(pages.ListShareContents(expires, upload_id, files)).ServeHTTP(w, r) + } +} diff --git a/handlers/upload.go b/handlers/upload.go new file mode 100644 index 0000000..29bde22 --- /dev/null +++ b/handlers/upload.go @@ -0,0 +1,69 @@ +package handlers + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "git.hafen.run/lukas/timeshare/pages" + "github.com/a-h/templ" + "github.com/google/uuid" + "github.com/valkey-io/valkey-go" +) + +func UploadFiles(client valkey.Client) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + err := r.ParseMultipartForm(125_000_000) // 1G max memory usage + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + form := r.MultipartForm + expiry_values := form.Value["expiry"] + expiry, err := time.ParseDuration(expiry_values[0]) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + form_files := form.File["files"] + files := make([]string, len(form_files)) + for i := range form_files { + fid := uuid.New().String() + files[i] = fid + f, err := form_files[i].Open() + if err != nil { + continue + } + buf := new(bytes.Buffer) + _, err = io.Copy(buf, f) + if err != nil { + continue + } + err = client.Do(r.Context(), client.B().Set().Key(fid+":filename").Value(form_files[i].Filename).Ex(expiry).Build()).Error() + if err != nil { + continue + } + + err = client.Do(r.Context(), client.B().Set().Key(fid+":contents").Value(valkey.BinaryString(buf.Bytes())).Ex(expiry).Build()).Error() + if err != nil { + continue + } + } + + uid := uuid.New() + files_b, _ := json.Marshal(files) + err = client.Do(r.Context(), client.B().Set().Key(uid.String()).Value(string(files_b)).Ex(expiry).Build()).Error() + + templ.Handler(pages.Upload([]pages.Expiry{ + {DurationCode: "24h", DurationName: "24 Hours"}, + {DurationCode: "36h", DurationName: "36 Hours"}, + {DurationCode: "48h", DurationName: "48 Hours"}, + {DurationCode: "168h", DurationName: "1 Week"}, + }, fmt.Sprintf("https://share.lukaswerner.com/%s", uid.String()))).ServeHTTP(w, r) + } +} diff --git a/main.go b/main.go index c2b92ab..8bb65bb 100644 --- a/main.go +++ b/main.go @@ -1,22 +1,15 @@ package main import ( - "archive/zip" - "bytes" "embed" - "encoding/json" - "fmt" - "io" "log" "mime/multipart" "net/http" "os" - "time" + "git.hafen.run/lukas/timeshare/handlers" "git.hafen.run/lukas/timeshare/pages" "github.com/a-h/templ" - "github.com/gabriel-vasile/mimetype" - "github.com/google/uuid" "github.com/valkey-io/valkey-go" ) @@ -46,125 +39,10 @@ func main() { {DurationCode: "168h", DurationName: "1 Week"}, }, ""))) - http.Handle("POST /upload", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - err := r.ParseMultipartForm(125_000_000) // 1G max memory usage - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - form := r.MultipartForm - expiry_values := form.Value["expiry"] - expiry, err := time.ParseDuration(expiry_values[0]) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - form_files := form.File["files"] - files := make([]string, len(form_files)) - for i := range form_files { - fid := uuid.New().String() - files[i] = fid - f, err := form_files[i].Open() - if err != nil { - continue - } - buf := new(bytes.Buffer) - _, err = io.Copy(buf, f) - if err != nil { - continue - } - err = client.Do(r.Context(), client.B().Set().Key(fid+":filename").Value(form_files[i].Filename).Ex(expiry).Build()).Error() - if err != nil { - continue - } - - err = client.Do(r.Context(), client.B().Set().Key(fid+":contents").Value(valkey.BinaryString(buf.Bytes())).Ex(expiry).Build()).Error() - if err != nil { - continue - } - } - - uid := uuid.New() - files_b, _ := json.Marshal(files) - err = client.Do(r.Context(), client.B().Set().Key(uid.String()).Value(string(files_b)).Ex(expiry).Build()).Error() - - templ.Handler(pages.Upload([]pages.Expiry{ - {DurationCode: "24h", DurationName: "24 Hours"}, - {DurationCode: "36h", DurationName: "36 Hours"}, - {DurationCode: "48h", DurationName: "48 Hours"}, - {DurationCode: "168h", DurationName: "1 Week"}, - }, fmt.Sprintf("https://share.lukaswerner.com/%s", uid.String()))).ServeHTTP(w, r) - })) - - http.Handle("/{upload_id}", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - upload_id := r.PathValue("upload_id") - if upload_id == "" { - w.WriteHeader(http.StatusBadRequest) - return - } - - files_json, err := client.Do(r.Context(), - client.B().Get().Key(upload_id).Build()).ToString() - if err != nil { - - http.Error(w, err.Error(), http.StatusNotFound) - return - } - - var files []string - - err = json.Unmarshal([]byte(files_json), &files) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - if len(files) == 1 { - file := files[0] - - filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() - if err != nil { - return - } - fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() - if err != nil { - return - } - w.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) - mime := mimetype.Detect(fileContents) - w.Header().Add("mimetype", mime.String()) - w.Write(fileContents) - return - } - - zipBuf := new(bytes.Buffer) - zipWriter := zip.NewWriter(zipBuf) - - for _, file := range files { - filename, err := client.Do(r.Context(), client.B().Get().Key(file+":filename").Build()).ToString() - if err != nil { - continue - } - fileContents, err := client.Do(r.Context(), client.B().Get().Key(file+":contents").Build()).AsBytes() - if err != nil { - continue - } - w, err := zipWriter.Create(filename) - if err != nil { - continue - } - w.Write(fileContents) - - } - - zipWriter.Close() - w.Header().Add("mimetype", "application/zip") - w.Header().Add("Content-Disposition", `attachment; filename="timeshare-download.zip"`) - io.Copy(w, zipBuf) - - })) + http.Handle("POST /upload", http.HandlerFunc(handlers.UploadFiles(client))) + http.Handle("/download/{upload_id}/zip", http.HandlerFunc(handlers.DownloadFilesZipped(client))) + http.Handle("/download/{upload_id}/{file_id}", http.HandlerFunc(handlers.DownloadFile(client))) + http.Handle("/{upload_id}", http.HandlerFunc(handlers.ListFiles(client))) http.Handle("/", templ.Handler(pages.Index())) log.Println(http.ListenAndServe(":8080", nil)) } diff --git a/makefile b/makefile index 1b19fbf..71e919c 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ # Run templ generation in watch mode templ: - templ generate --watch --proxy="http://localhost:8090" --open-browser=false + templ generate --watch --proxy="http://localhost:8080" --open-browser=true # Run air for Go hot reload server: diff --git a/pages/share_list.templ b/pages/share_list.templ new file mode 100644 index 0000000..690e9a0 --- /dev/null +++ b/pages/share_list.templ @@ -0,0 +1,143 @@ +package pages + +import ( + "git.hafen.run/lukas/timeshare/components/badge" + "git.hafen.run/lukas/timeshare/components/button" + "git.hafen.run/lukas/timeshare/components/checkbox" + "git.hafen.run/lukas/timeshare/components/icon" + "git.hafen.run/lukas/timeshare/components/table" + "path" + "time" +) + +type File struct { + Filename string + Key string +} + +templ filetypeIcon(filename string) { + switch path.Ext(filename) { + case ".jpg",".jpeg", ".png",".heic", ".webp", ".avif", ".gif", ".tiff": + @icon.FileImage() + case ".mp3",".flac", ".m4a",".m4b", ".wav", ".midi": + @icon.FileAudio() + case ".mov",".mp4": + @icon.FileVideo() + case ".txt",".md": + @icon.FileText() + case ".zip": + @icon.FileArchive() + case ".xlsx", ".csv": + @icon.FileSpreadsheet() + case ".pdf", ".docx", ".doc": + @icon.FileText() + case ".epub": + @icon.BookMarked() + case ".stl", ".3mf", ".step": + @icon.FileAxis3d() + case ".json": + @icon.FileJson() + default: + @icon.File() + } +} + +templ ListShareContents(expires time.Time, shareid string, files []File) { + @PageSkeleton("Download - Time Share") { +
+
+
+

Download from Share

+ @badge.Badge(badge.Props{ + Class: "flex gap-2 items-center dark:text-white", + }) { + @icon.Timer() + { expires.Format("03:04PM Jan 2") } + } +
+ + @button.Button(button.Props{ID: "download-button"}) { + @icon.FolderDown() + Download All + } + +
+
+
+ @table.Table() { + @table.Header() { + @table.Row() { + @table.Head() + @table.Head() { + Filename + } + } + } + @table.Body() { + for _, file := range files { + @table.Row() { + @table.Cell(table.CellProps{Class: "w-2"}) { + @checkbox.Checkbox(checkbox.Props{ + Name: file.Key, + Value: file.Key, + }) + } + @table.Cell() { + + @filetypeIcon(file.Filename) + { file.Filename } + + } + } + } + } + } +
+
+
+ + } +} diff --git a/pages/upload.templ b/pages/upload.templ index 94fece7..aa64f89 100644 --- a/pages/upload.templ +++ b/pages/upload.templ @@ -37,6 +37,16 @@ templ Upload(expirations []Expiry, uploadedLink string) { let drop_zone = document.getElementById("drop_zone"); let desc = document.getElementById("desc"); let fileInput = document.getElementById("files"); + function updateDescription(len) { + desc.innerText = `${len} File` + if (len > 1) { + desc.innerText += "s" + } + desc.innerText += " Attached" + } + fileInput.addEventListener("change", () => { + updateDescription(fileInput.files.length) + }); drop_zone.addEventListener("click", function (ev) { fileInput.click(); }) @@ -51,11 +61,7 @@ templ Upload(expirations []Expiry, uploadedLink string) { const newDT = new DataTransfer(); files.forEach(f => newDT.items.add(f)); fileInput.files = newDT.files; - desc.innerText = `${fileInput.files.length} File` - if (fileInput.files.length > 1) { - desc.innerText += "s" - } - + updateDescription(fileInput.files.length) }); drop_zone.addEventListener("dragover", function (e) { drop_zone.classList.add('dragover'); diff --git a/tmp/bin/main b/tmp/bin/main new file mode 100755 index 0000000000000000000000000000000000000000..77c3a20ecb5fa3e43d87de636f2ed4aeba362a3e GIT binary patch literal 14433106 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