diff --git a/assets/index.html b/assets/index.html
index abc0991..b7eb222 100644
--- a/assets/index.html
+++ b/assets/index.html
@@ -92,6 +92,10 @@
ul li span {
cursor: pointer;
}
+
+ footer {
+ text-align: center;
+ }
diff --git a/assets/main.min.js b/assets/main.min.js
index 11475de..eeb2436 100644
--- a/assets/main.min.js
+++ b/assets/main.min.js
@@ -1 +1 @@
-!function(D){"use strict";function n(n,r,t){return t.a=n,t.f=r,t}function r(t){return n(2,t,function(r){return function(n){return t(r,n)}})}function t(e){return n(3,e,function(t){return function(r){return function(n){return e(t,r,n)}}})}function R(u){return n(4,u,function(e){return function(t){return function(r){return function(n){return u(e,t,r,n)}}}})}function F(a){return n(5,a,function(u){return function(e){return function(t){return function(r){return function(n){return a(u,e,t,r,n)}}}}})}function J(i){return n(6,i,function(a){return function(u){return function(e){return function(t){return function(r){return function(n){return i(a,u,e,t,r,n)}}}}}})}function M(o){return n(7,o,function(i){return function(a){return function(u){return function(e){return function(t){return function(r){return function(n){return o(i,a,u,e,t,r,n)}}}}}}})}function b(n,r,t){return 2===n.a?n.f(r,t):n(r)(t)}function s(n,r,t,e){return 3===n.a?n.f(r,t,e):n(r)(t)(e)}function v(n,r,t,e,u){return 4===n.a?n.f(r,t,e,u):n(r)(t)(e)(u)}function l(n,r,t,e,u,a){return 5===n.a?n.f(r,t,e,u,a):n(r)(t)(e)(u)(a)}function z(n,r,t,e,u,a,i){return 6===n.a?n.f(r,t,e,u,a,i):n(r)(t)(e)(u)(a)(i)}function H(n,r,t,e,u,a,i,o){return 7===n.a?n.f(r,t,e,u,a,i,o):n(r)(t)(e)(u)(a)(i)(o)}function P(n,r){for(var t,e=[],u=Y(n,r,0,e);u&&(t=e.pop());u=Y(t.a,t.b,0,e));return u}function Y(n,r,t,e){if(n!==r){if("object"!=typeof n||null===n||null===r)return"function"==typeof n&&Z(5),!1;if(100i)return u}var v=t.$;if(4===v){for(var l=t.k;4===l.$;)l=l.k;return n(r,l,e,u,a+1,i,r.elm_event_node_ref)}var d=t.e;var $=r.childNodes;for(var h=0;hi))return u;a=p}return u}(n,r,t,0,0,r.b,e)}function br(n,r,t,e){return 0===t.length?n:(sr(n,r,t,e),vr(n,t))}function vr(n,r){for(var t=0;t "),B(n.p),b(mu,$([$u({$:5,a:n.ag})]),$([B(" ×")]))])),b(yu,d,b(Yt,Vr,n.aG))]))]))])):B("")},Cu={$:16},_u=r(function(n,r){return b(x,d,$([s(tu,"Watches",Cu,b(x,d,$([l(bu,"Item: ","some string...","name",n.C.p,function(n){return{$:8,a:e(r,{p:n})}}),l(bu,"Repository: ","NixOS/nixpkgs","repo",n.C.T,function(n){return{$:8,a:e(r,{T:n})}})])))]))}),fn=wn({b4:function(n){return{a:De,b:Xt($([xe,Be]))}},cy:function(n){return Re},cC:Q,cD:function(t){return b(x,d,$([b(Ye,d,$([b(x,$([S("grid")]),$([b(x,$([S("col")]),$([function(n){return b(x,d,$([b(gu,b(_u,n,n.C),b(Ie,$([$u(ku)]),$([B(" ⟳")]))),n.aq.b?b(yu,d,b(Yt,Ou,n.aq)):B("No watches found!")]))}(t)])),b(x,$([S("col")]),$([function(n){return b(x,d,$([b(gu,b(du,n,n.u),b(Ie,$([$u(Ge)]),$([B(" ⟳")]))),n.aj.b?b(x,$([S("icon-grid")]),b(Yt,wu,n.aj)):B("No links found!")]))}(t)]))])),b(x,$([S("grid")]),$([function(){var n,r=t.q;return 3===r.$?(r=r.a,b(x,$([(n=$([{a:"error",b:!0}]),S(b(st," ",b(Yt,xt,b(He,Pe,n)))))]),$([B(r)]))):B("")}()]))]))]))}});an={Main:{init:fn(Mt(0))(0)}},D.Elm?function n(r,t){for(var e in t)e in r?"init"==e?Z(6):n(r[e],t[e]):r[e]=t[e]}(D.Elm,an):D.Elm=an}(this);
\ No newline at end of file
+!function(B){"use strict";function n(n,r,t){return t.a=n,t.f=r,t}function r(t){return n(2,t,function(r){return function(n){return t(r,n)}})}function t(e){return n(3,e,function(t){return function(r){return function(n){return e(t,r,n)}}})}function D(u){return n(4,u,function(e){return function(t){return function(r){return function(n){return u(e,t,r,n)}}}})}function R(a){return n(5,a,function(u){return function(e){return function(t){return function(r){return function(n){return a(u,e,t,r,n)}}}}})}function M(i){return n(6,i,function(a){return function(u){return function(e){return function(t){return function(r){return function(n){return i(a,u,e,t,r,n)}}}}}})}function F(o){return n(7,o,function(i){return function(a){return function(u){return function(e){return function(t){return function(r){return function(n){return o(i,a,u,e,t,r,n)}}}}}}})}function b(n,r,t){return 2===n.a?n.f(r,t):n(r)(t)}function s(n,r,t,e){return 3===n.a?n.f(r,t,e):n(r)(t)(e)}function v(n,r,t,e,u){return 4===n.a?n.f(r,t,e,u):n(r)(t)(e)(u)}function d(n,r,t,e,u,a){return 5===n.a?n.f(r,t,e,u,a):n(r)(t)(e)(u)(a)}function z(n,r,t,e,u,a,i){return 6===n.a?n.f(r,t,e,u,a,i):n(r)(t)(e)(u)(a)(i)}function H(n,r,t,e,u,a,i,o){return 7===n.a?n.f(r,t,e,u,a,i,o):n(r)(t)(e)(u)(a)(i)(o)}function P(n,r){for(var t,e=[],u=Y(n,r,0,e);u&&(t=e.pop());u=Y(t.a,t.b,0,e));return u}function Y(n,r,t,e){if(n!==r){if("object"!=typeof n||null===n||null===r)return"function"==typeof n&&Z(5),!1;if(100i)return u}var v=t.$;if(4===v){for(var d=t.k;4===d.$;)d=d.k;return n(r,d,e,u,a+1,i,r.elm_event_node_ref)}var l=t.e;var $=r.childNodes;for(var h=0;hi))return u;a=p}return u}(n,r,t,0,0,r.b,e)}function br(n,r,t,e){return 0===t.length?n:(sr(n,r,t,e),vr(n,t))}function vr(n,r){for(var t=0;t "),x(n.q),b(yu,$([Ze({$:5,a:n.ag})]),$([x(" ×")]))])),b(Cu,l,b(Yt,Kr,n.aG))]))]))])):x("")},Ju={$:16},qu=r(function(n,r){return b(O,l,$([s(ou,"Watches",Ju,b(O,l,$([d(hu,"Item: ","some string...","name",n.C.q,function(n){return{$:8,a:e(r,{q:n})}}),d(hu,"Repository: ","NixOS/nixpkgs","repo",n.C.T,function(n){return{$:8,a:e(r,{T:n})}})])))]))}),fn=kn({b4:function(n){return{a:Be,b:Xt($([Oe,xe]))}},cy:function(n){return De},cC:Q,cD:function(t){return b(O,l,$([b(Ve,l,$([b(O,$([S("grid")]),$([b(O,$([S("col")]),$([function(n){return b(O,l,$([b(ku,b(qu,n,n.C),b(tu,$([Ze(Eu)]),$([x(" ⟳")]))),n.aq.b?b(Cu,l,b(Yt,Nu,n.aq)):x("No watches found!")]))}(t)])),b(O,$([S("col")]),$([function(n){return b(O,l,$([b(ku,b(pu,n,n.u),b(tu,$([Ze(ru)]),$([x(" ⟳")]))),n.aj.b?b(O,$([S("icon-grid")]),b(Yt,ju,n.aj)):x("No links found!")]))}(t)]))])),b(O,$([S("grid")]),$([function(){var n,r=t.p;return 3===r.$?(r=r.a,b(O,$([(n=$([{a:"error",b:!0}]),S(b(st," ",b(Yt,Ot,b(Ie,We,n)))))]),$([x(r)]))):x("")}()]))])),b(Xe,l,$([b(Ue,l,$([b(nu,l,$([b(Ye,l,$([x("Maintenence")]))])),b(Ge,$([Ze(Pe)]),$([x("Update Icons")]))]))]))]))}});an={Main:{init:fn(Ft(0))(0)}},B.Elm?function n(r,t){for(var e in t)e in r?"init"==e?Z(6):n(r[e],t[e]):r[e]=t[e]}(B.Elm,an):B.Elm=an}(this);
\ No newline at end of file
diff --git a/icons.go b/icons.go
new file mode 100644
index 0000000..89ec49f
--- /dev/null
+++ b/icons.go
@@ -0,0 +1,52 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+
+ "suah.dev/gostart/data"
+)
+
+func updateIcons() {
+ links, err := app.queries.GetAllLinks(app.ctx)
+ if err != nil {
+ log.Println("can't get links: ", err)
+ }
+
+ for _, link := range links {
+ fmt.Println(link.LogoUrl)
+ if link.LogoUrl == "" {
+ continue
+ }
+ resp, err := http.Get(link.LogoUrl)
+ if err != nil {
+ log.Println(err)
+ continue
+ }
+
+ body, err := io.ReadAll(resp.Body)
+ if err != nil {
+ log.Println(err)
+ continue
+ }
+ err = resp.Body.Close()
+ if err != nil {
+ log.Println(err)
+ continue
+ }
+ contentType := resp.Header.Get("Content-Type")
+
+ err = app.queries.AddIcon(app.ctx, data.AddIconParams{
+ OwnerID: link.OwnerID,
+ LinkID: link.ID,
+ ContentType: contentType,
+ Data: body,
+ })
+ if err != nil {
+ log.Println("can't add icon: ", err)
+
+ }
+ }
+}
diff --git a/main.go b/main.go
index 42adac2..f6d9679 100644
--- a/main.go
+++ b/main.go
@@ -7,7 +7,6 @@ import (
"embed"
"flag"
"fmt"
- "io"
"io/fs"
"log"
"net/http"
@@ -162,6 +161,14 @@ func main() {
r.Use(IconCacher)
r.Get("/{linkID:[0-9]+}", iconGET)
})
+ r.Route("/update-icons", func(r chi.Router) {
+ r.Get("/", func(w http.ResponseWriter, r *http.Request) {
+ updateIcons()
+ w.Header().Add("Content-type", "application/json")
+ w.WriteHeader(200)
+ w.Write([]byte(`{"update": true}`))
+ })
+ })
go func() {
for {
@@ -182,45 +189,7 @@ func main() {
go func() {
if dbExists {
for {
- links, err := app.queries.GetAllLinks(app.ctx)
- if err != nil {
- log.Println("can't get links: ", err)
- }
-
- for _, link := range links {
- fmt.Println(link.LogoUrl)
- if link.LogoUrl == "" {
- continue
- }
- resp, err := http.Get(link.LogoUrl)
- if err != nil {
- log.Println(err)
- continue
- }
-
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- log.Println(err)
- continue
- }
- err = resp.Body.Close()
- if err != nil {
- log.Println(err)
- continue
- }
- contentType := resp.Header.Get("Content-Type")
-
- err = app.queries.AddIcon(app.ctx, data.AddIconParams{
- OwnerID: link.OwnerID,
- LinkID: link.ID,
- ContentType: contentType,
- Data: body,
- })
- if err != nil {
- log.Println("can't add icon: ", err)
-
- }
- }
+ updateIcons()
time.Sleep(24 * time.Hour)
}
} else {
diff --git a/src/Main.elm b/src/Main.elm
index 2abfaeb..08a6231 100644
--- a/src/Main.elm
+++ b/src/Main.elm
@@ -89,6 +89,8 @@ type Msg
| ReloadWatches
| SubmitLink
| SubmitWatch
+ | FetchIcons
+ | LoadIcons (Result Http.Error ())
type Status
@@ -199,6 +201,14 @@ addWatch model =
}
+fetchIcons : Cmd Msg
+fetchIcons =
+ Http.get
+ { url = "/update-icons"
+ , expect = Http.expectWhatever LoadIcons
+ }
+
+
deleteLink : Int -> Cmd Msg
deleteLink linkId =
Http.request
@@ -228,6 +238,15 @@ deleteWatch watchId =
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
+ LoadIcons (Ok _) ->
+ ( model, getLinks )
+
+ LoadIcons (Err _) ->
+ ( { model | status = Errored "Server error reloading icons!" }, Cmd.none )
+
+ FetchIcons ->
+ ( model, fetchIcons )
+
DeleteLink linkId ->
( model, deleteLink linkId )
@@ -359,6 +378,13 @@ view model =
text ""
]
]
+ , footer []
+ [ details []
+ [ summary []
+ [ b [] [ text "Maintenence" ] ]
+ , button [ onClick FetchIcons ] [ text "Update Icons" ]
+ ]
+ ]
]