aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CacheDatabase.go69
-rw-r--r--Database.go47
-rw-r--r--client.go53
-rw-r--r--main.go28
-rw-r--r--outboxGet.go22
-rw-r--r--static/catalog.html189
-rw-r--r--static/ncatalog.html4
7 files changed, 174 insertions, 238 deletions
diff --git a/CacheDatabase.go b/CacheDatabase.go
index 26d7d8d..010ad67 100644
--- a/CacheDatabase.go
+++ b/CacheDatabase.go
@@ -252,6 +252,47 @@ func GetObjectFromCache(db *sql.DB, id string) Collection {
return nColl
}
+func GetObjectFromCacheCatalog(db *sql.DB, id string) Collection {
+ var nColl Collection
+ var result []ObjectBase
+
+ query := `select id, name, content, type, published, updated, attributedto, attachment, preview, actor from cacheactivitystream where actor=$1 and id in (select id from replies where inreplyto='') and type='Note' order by updated asc`
+
+ rows, err := db.Query(query, id)
+
+ CheckError(err, "error query object from db cache")
+
+ defer rows.Close()
+ for rows.Next(){
+ var post ObjectBase
+ var actor Actor
+ var attachID string
+ var previewID string
+
+ err = rows.Scan(&post.Id, &post.Name, &post.Content, &post.Type, &post.Published, &post.Updated, &post.AttributedTo, &attachID, &previewID, &actor.Id)
+
+ CheckError(err, "error scan object into post struct cache")
+
+ post.Actor = &actor
+
+ var replies CollectionBase
+
+ post.Replies = &replies
+
+ post.Replies.TotalItems, post.Replies.TotalImgs = GetObjectRepliesCount(db, post)
+
+ post.Attachment = GetObjectAttachmentCache(db, attachID)
+
+ post.Preview = GetObjectPreviewCache(db, previewID)
+
+ result = append(result, post)
+ }
+
+ nColl.OrderedItems = result
+
+ return nColl
+}
+
func GetObjectByIDFromCache(db *sql.DB, postID string) Collection {
var nColl Collection
var result []ObjectBase
@@ -479,34 +520,6 @@ func GetObjectRepliesRepliesCache(db *sql.DB, parent ObjectBase) (*CollectionBas
return &nColl, 0, 0
}
-func GetObjectRepliesCacheCount(db *sql.DB, parent ObjectBase) (int, int) {
-
- var countId int
- var countImg int
-
- query := `select count(id) from replies where inreplyto=$1 and id in (select id from activitystream where type='Note')`
-
- rows, err := db.Query(query, parent.Id)
-
- CheckError(err, "error with replies count db query")
-
- defer rows.Close()
- rows.Next()
- rows.Scan(&countId)
-
- query = `select count(attachment) from activitystream where id in (select id from replies where inreplyto=$1) and attachment != ''`
-
- rows, err = db.Query(query, parent.Id)
-
- CheckError(err, "error with select attachment count db query")
-
- defer rows.Close()
- rows.Next()
- rows.Scan(&countImg)
-
- return countId, countImg
-}
-
func GetObjectAttachmentCache(db *sql.DB, id string) []ObjectBase {
var attachments []ObjectBase
diff --git a/Database.go b/Database.go
index d027b43..3cd9f44 100644
--- a/Database.go
+++ b/Database.go
@@ -445,6 +445,47 @@ func GetObjectFromDB(db *sql.DB, id string) Collection {
return nColl
}
+func GetObjectFromDBCatalog(db *sql.DB, id string) Collection {
+ var nColl Collection
+ var result []ObjectBase
+
+ query := `select id, name, content, type, published, updated, attributedto, attachment, preview, actor from activitystream where actor=$1 and id in (select id from replies where inreplyto='') and type='Note' order by updated asc`
+
+ rows, err := db.Query(query, id)
+
+ CheckError(err, "error query object from db")
+
+ defer rows.Close()
+ for rows.Next(){
+ var post ObjectBase
+ var actor Actor
+ var attachID string
+ var previewID string
+
+ err = rows.Scan(&post.Id, &post.Name, &post.Content, &post.Type, &post.Published, &post.Updated, &post.AttributedTo, &attachID, &previewID, &actor.Id)
+
+ CheckError(err, "error scan object into post struct")
+
+ post.Actor = &actor
+
+ var replies CollectionBase
+
+ post.Replies = &replies
+
+ post.Replies.TotalItems, post.Replies.TotalImgs = GetObjectRepliesCount(db, post)
+
+ post.Attachment = GetObjectAttachment(db, attachID)
+
+ post.Preview = GetObjectPreview(db, previewID)
+
+ result = append(result, post)
+ }
+
+ nColl.OrderedItems = result
+
+ return nColl
+}
+
func GetObjectByIDFromDB(db *sql.DB, postID string) Collection {
var nColl Collection
var result []ObjectBase
@@ -717,12 +758,12 @@ func CheckIfObjectOP(db *sql.DB, id string) bool {
return false
}
-func GetObjectRepliesDBCount(db *sql.DB, parent ObjectBase) (int, int) {
+func GetObjectRepliesCount(db *sql.DB, parent ObjectBase) (int, int) {
var countId int
var countImg int
- query := `select count(id) from replies where inreplyto=$1 and id in (select id from activitystream where type='Note')`
+ query := `select count(id) from replies where inreplyto=$1 and id in (select id from activitystream where type='Note' union select id from cacheactivitystream where type='Note')`
rows, err := db.Query(query, parent.Id)
@@ -732,7 +773,7 @@ func GetObjectRepliesDBCount(db *sql.DB, parent ObjectBase) (int, int) {
rows.Next()
rows.Scan(&countId)
- query = `select count(attachment) from activitystream where id in (select id from replies where inreplyto=$1) and attachment != ''`
+ query = `select count(attach) from (select attachment from activitystream where id in (select id from replies where inreplyto=$1) and attachment != '' union select attachment from cacheactivitystream where id in (select id from replies where inreplyto=$1) and attachment != '') as attach`
rows, err = db.Query(query, parent.Id)
diff --git a/client.go b/client.go
index f82c8f7..01dc894 100644
--- a/client.go
+++ b/client.go
@@ -212,9 +212,9 @@ func CatalogGet(w http.ResponseWriter, r *http.Request, db *sql.DB, collection C
var mergeCollection Collection
- for _, e := range collection.OrderedItems {
- mergeCollection.OrderedItems = append(mergeCollection.OrderedItems, e)
- }
+
+
+ mergeCollection.OrderedItems = collection.OrderedItems
domainURL := GetDomainURL(*actor)
@@ -229,7 +229,7 @@ func CatalogGet(w http.ResponseWriter, r *http.Request, db *sql.DB, collection C
DeleteRemovedPosts(db, &mergeCollection)
DeleteTombstonePosts(&mergeCollection)
-
+
sort.Sort(ObjectBaseSortDesc(mergeCollection.OrderedItems))
var returnData PageData
@@ -255,15 +255,6 @@ func CatalogGet(w http.ResponseWriter, r *http.Request, db *sql.DB, collection C
returnData.Posts = mergeCollection.OrderedItems
- for i, _ := range returnData.Posts {
- for _, e := range returnData.Posts[i].Replies.OrderedItems {
- if len(e.Attachment) > 0 {
- returnData.Posts[i].Replies.TotalImgs = returnData.Posts[i].Replies.TotalImgs + 1
- }
- }
- returnData.Posts[i].Replies.TotalItems = len(returnData.Posts[i].Replies.OrderedItems)
- }
-
t.ExecuteTemplate(w, "layout", returnData)
}
@@ -450,6 +441,40 @@ func WantToServe(db *sql.DB, actorName string) (Collection, bool) {
return collection, serve
}
+func WantToServeCatalog(db *sql.DB, actorName string) (Collection, bool) {
+
+ var collection Collection
+ serve := false
+
+ boardActor := GetActorByNameFromDB(db, actorName)
+
+ if boardActor.Id != "" {
+ collection = GetActorCollectionDBCatalog(db, boardActor)
+ return collection, true
+ }
+
+ for _, e := range FollowingBoards {
+ boardActor := GetActorFromDB(db, e.Id)
+
+ if boardActor.Id == "" {
+ boardActor = GetActor(e.Id)
+ }
+
+ if boardActor.Name == actorName {
+ serve = true
+ if IsActorLocal(db, boardActor.Id) {
+ collection = GetActorCollectionDBCatalog(db, boardActor)
+ } else {
+ collection = GetActorCollectionCacheCatalog(db, boardActor)
+ }
+ collection.Actor = &boardActor
+ return collection, serve
+ }
+ }
+
+ return collection, serve
+}
+
func StripTransferProtocol(value string) string {
re := regexp.MustCompile("(http://|https://)?(www.)?")
@@ -538,7 +563,7 @@ func DeleteRemovedPosts(db *sql.DB, collection *Collection) {
}
}
}
-
+
for i, r := range e.Replies.OrderedItems {
for _, k := range removed {
if r.Id == k.ID {
diff --git a/main.go b/main.go
index 3dfad82..bfc2846 100644
--- a/main.go
+++ b/main.go
@@ -204,7 +204,7 @@ func main() {
}
if actorCatalog {
- collection, valid := WantToServe(db, actor.Name)
+ collection, valid := WantToServeCatalog(db, actor.Name)
if valid {
CatalogGet(w, r, db, collection)
}
@@ -1311,6 +1311,19 @@ func GetActorCollectionCache(db *sql.DB, actor Actor) Collection {
return collection
}
+func GetActorCollectionCacheCatalog(db *sql.DB, actor Actor) Collection {
+ var collection Collection
+
+ collection.OrderedItems = GetObjectFromCacheCatalog(db, actor.Id).OrderedItems
+
+ collection.Actor = &actor
+
+ collection.TotalItems = GetObjectPostsTotalCache(db, actor)
+ collection.TotalImgs = GetObjectImgsTotalCache(db, actor)
+
+ return collection
+}
+
func GetActorCollectionDB(db *sql.DB, actor Actor) Collection {
var collection Collection
@@ -1324,6 +1337,19 @@ func GetActorCollectionDB(db *sql.DB, actor Actor) Collection {
return collection
}
+func GetActorCollectionDBCatalog(db *sql.DB, actor Actor) Collection {
+ var collection Collection
+
+ collection.OrderedItems = GetObjectFromDBCatalog(db, actor.Id).OrderedItems
+
+ collection.Actor = &actor
+
+ collection.TotalItems = GetObjectPostsTotalDB(db, actor)
+ collection.TotalImgs = GetObjectImgsTotalDB(db, actor)
+
+ return collection
+}
+
func GetActorCollection(collection string) Collection {
var nCollection Collection
diff --git a/outboxGet.go b/outboxGet.go
index a42a3d7..8ee6587 100644
--- a/outboxGet.go
+++ b/outboxGet.go
@@ -40,6 +40,24 @@ func GetObjectsFromFollow(db *sql.DB, actor Actor) []ObjectBase {
return followObj
}
+func GetObjectsFromFollowCatalog(db *sql.DB, actor Actor) []ObjectBase {
+ var followingCol Collection
+ var followObj []ObjectBase
+ followingCol = GetActorCollection(actor.Following)
+ for _, e := range followingCol.Items {
+ var followOutbox Collection
+ if !IsActorLocal(db, e.Id) {
+ followOutbox = GetObjectFromCacheCatalog(db, e.Id)
+ } else {
+ followOutbox = GetObjectFromDBCatalog(db, e.Id)
+ }
+ for _, e := range followOutbox.OrderedItems {
+ followObj = append(followObj, e)
+ }
+ }
+ return followObj
+}
+
func GetCollectionFromPath(db *sql.DB, path string) Collection {
var nColl Collection
@@ -71,7 +89,7 @@ func GetCollectionFromPath(db *sql.DB, path string) Collection {
var imgCnt int
post.Replies, postCnt, imgCnt = GetObjectRepliesDB(db, post)
- post.Replies.TotalItems, post.Replies.TotalImgs = GetObjectRepliesDBCount(db, post)
+ post.Replies.TotalItems, post.Replies.TotalImgs = GetObjectRepliesCount(db, post)
post.Replies.TotalItems = post.Replies.TotalItems + postCnt
post.Replies.TotalImgs = post.Replies.TotalImgs + imgCnt
@@ -117,7 +135,7 @@ func GetObjectFromPath(db *sql.DB, path string) ObjectBase{
nObj.Replies, postCnt, imgCnt = GetObjectRepliesDB(db, nObj)
- nObj.Replies.TotalItems, nObj.Replies.TotalImgs = GetObjectRepliesDBCount(db, nObj)
+ nObj.Replies.TotalItems, nObj.Replies.TotalImgs = GetObjectRepliesCount(db, nObj)
nObj.Replies.TotalItems = nObj.Replies.TotalItems + postCnt
nObj.Replies.TotalImgs = nObj.Replies.TotalImgs + imgCnt
diff --git a/static/catalog.html b/static/catalog.html
deleted file mode 100644
index b5b361e..0000000
--- a/static/catalog.html
+++ /dev/null
@@ -1,189 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>{{ .Title }}</title>
- </head>
- <style>
- a, a:link, a:visited, a:hover, a:active {
- text-decoration: none
- }
-
- a:link, a:visited, a:active {
- color: black;
- }
-
- a:hover {
- color: #de0808;
- }
- </style>
- <script>
-
- function getMIMEType(type)
- {
- re = /\/.+/g
- return type.replace(re, "")
- }
-
- function shortURL(url)
- {
- var check = url.replace("{{.Board.Actor}}/", "")
- re = /.+\//g;
- temp = re.exec(url)
- if(temp[0] == "{{ .Board.Actor }}/")
- {
- var short = url.replace("https://", "");
- short = short.replace("http://", "");
- short = short.replace("www.", "");
-
- var re = /^.{3}/g;
-
- var u = re.exec(short);
-
- re = /\w+$/g;
-
- u = re.exec(short);
-
- return u;
- }else{
- var short = url.replace("https://", "");
- short = short.replace("http://", "");
- short = short.replace("www.", "");
-
- var re = /^.{3}/g;
-
- var u = re.exec(short);
-
- re = /\w+$/g;
-
- u = re.exec(short);
-
-
- replace = short.replace(/\/+/g, " ")
- replace = replace.replace(u, " ").trim()
- re = /\w+$/;
- v = re.exec(replace)
-
- v = "f" + v[0] + "-" + u
-
- return v;
- }
- }
-
- </script>
- <body style="background-color: #eef2fe;">
- <ul id="top" style="padding:0; display: inline;">
- {{range .Boards}}
- <li style="display: inline;"><a href="{{.Location}}">{{.Name }}</a></li>
- {{end}}
- </ul>
- {{ $board := .Board }}
- {{ if $board.IsMod }}
- <span style="float: right;"><a href="/{{ .Key }}/{{ .Board.Name }}">[Manage Board]</a></span>
- {{ end }}
- <div style="margin: 0 auto; width: 400px; margin-bottom: 100px;">
- <h1 style="color: #af0a0f;">/{{ $board.Name }}/ - {{ $board.PrefName }}</h1>
- <form id="new-post" action="/post" method="post" enctype="multipart/form-data">
- <label for="name">Name:</label><br>
- <input type="text" id="name" name="name" placeholder="Anonymous"><br>
- <label for="options">Options:</label><br>
- <input type="text" id="options" name="options"><br>
- <label for="subject">Subject:</label><br>
- <input type="text" id="subject" name="subject"><input type="submit" value="Post"><br>
- <label for="comment">Comment:</label><br>
- <textarea rows="10" cols="50" id="comment" name="comment"></textarea><br>
- <input type="hidden" id="inReplyTo" name="inReplyTo" value="{{ $board.InReplyTo }}">
- <input type="hidden" id="sendTo" name="sendTo" value="{{ $board.To }}">
- <input type="hidden" id="boardName" name="boardName" value="{{ $board.Name }}">
- <input type="hidden" id="captchaCode" name="captchaCode" value="{{ $board.CaptchaCode }}">
- <input type="file" id="file" name="file"><br><br>
- <label stye="display: inline-block;" for="captcha">Captcha:</label><br>
- <input style="display: inline-block;" type="text" id="captcha" name="captcha"><br>
- <div style="height: 65px;">
- <img src="{{ $board.Captcha }}">
- </div>
- </form>
- </div>
-
- <hr>
- <ul style="margin: 0; padding: 0; display: inline">
- <li style="display: inline"><a href="/{{ $board.Name }}">[Return]</a></li>
- <li style="display: inline"><a href="#bottom">[Bottom]</a></li>
- <li style="display: inline"><a href="javascript:location.reload()">[Refresh]</a></li>
- </ul>
- <hr>
-
- <div style="padding: 10px; text-align: center;">
- {{ range .Posts }}
- <div style="overflow: hidden; vertical-align: top; margin: 0 auto; display: inline-block; width: 180px; max-height: 320px; margin-bottom: 10px;">
- {{ if $board.IsMod }}
- <a href="/delete?id={{ .Id }}">[Delete Post]</a>
- {{ end }}
- {{ if .Attachment }}
- {{ if $board.IsMod }}
- <a href="/deleteattach?id={{ .Id }}">[Delete Attachment]</a>
- {{ end }}
- <a id="{{ .Id }}-anchor" href="/{{ $board.Name }}/">
- <div id="media-{{ .Id }}"></div>
- <script>
- media = document.getElementById("media-{{ .Id }}")
- if(getMIMEType({{ (index .Attachment 0).MediaType }}) == "image"){
- var img = document.createElement("img");
- img.style = "float: left; margin-right: 10px; margin-bottom: 10px; max-width: 150px; max-height: 150px; cursor: move;"
- img.setAttribute("id", "img")
- img.setAttribute("main", "1")
- img.setAttribute("src", "{{ (index .Attachment 0).Href }}")
- media.appendChild(img)
- }
-
- if(getMIMEType({{ (index .Attachment 0).MediaType }}) == "audio"){
- var audio = document.createElement("audio")
- audio.controls = 'controls'
- audio.muted = 'muted'
- audio.src = '{{ (index .Attachment 0).Href }}'
- audio.type = '{{ (index .Attachment 0).MediaType }}'
- audio.style = "float: left; margin-right: 10px; margin-bottom: 10px; width: 150px;"
- audio.innerText = 'Audio is not supported.'
- media.appendChild(audio)
- }
-
- if(getMIMEType({{ (index .Attachment 0).MediaType }}) == "video"){
- var video = document.createElement("video")
- video.controls = 'controls'
- video.muted = 'muted'
- video.src = '{{ (index .Attachment 0).Href }}'
- video.type = '{{ (index .Attachment 0).MediaType }}'
- video.style = "float: left; margin-right: 10px; margin-bottom: 10px; width: 150px;"
- video.innerText = 'Video is not supported.'
- media.appendChild(video)
- }
- </script>
-
-
- {{ end }}
- <div>
- {{ $replies := .Replies }}
- <span style="display: block">R: {{ $replies.TotalItems }}{{ if $replies.TotalImgs }}/ A: {{ $replies.TotalImgs }}{{ end }}</span>
- {{ if .Name }}
- <span style="display: block; color: #0f0c5d;"><b>{{ .Name }}</b></span>
- {{ end }}
- {{ if .Content }}
- <span style="display: block">{{.Content}}</span>
- {{ end }}
- </div>
- </a>
- </div>
- <script>
- document.getElementById("{{ .Id }}-anchor").href = "/{{ $board.Name }}/" + shortURL("{{ .Id }}")
- </script>
- {{ end }}
- </div>
- <hr>
- <ul style="margin: 0; padding: 0; display: inline">
- <li style="display: inline"><a href="/{{ $board.Name }}">[Return]</a></li>
- <li style="display: inline"><a id="bottom" href="#top">[Top]</a></li>
- <li style="display: inline"><a href="javascript:location.reload()">[Refresh]</a></li>
- </ul>
- <hr>
- </body>
-</html>
-
diff --git a/static/ncatalog.html b/static/ncatalog.html
index 3638d95..c5b6a23 100644
--- a/static/ncatalog.html
+++ b/static/ncatalog.html
@@ -61,7 +61,9 @@
{{ end }}
<div>
{{ $replies := .Replies }}
- <span style="display: block;">R: {{ $replies.TotalItems }}{{ if $replies.TotalImgs }}/ A: {{ $replies.TotalImgs }}{{ end }}</span>
+ {{ if $replies }}
+ <span style="display: block;">R: {{ $replies.TotalItems }}{{ if $replies.TotalImgs }}/ A: {{ $replies.TotalImgs }}{{ end }}</span>
+ {{ end }}
{{ if .Name }}
<span style="display: block; color: #0f0c5d;"><b>{{ .Name }}</b></span>
{{ end }}