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" ] + ] + ] ]