mirror of
https://github.com/balzack/databag.git
synced 2025-02-12 03:29:16 +00:00
support staggard loading of tags
This commit is contained in:
parent
1c05180251
commit
0ceee0089f
31
doc/api.oa3
31
doc/api.oa3
@ -2982,16 +2982,43 @@ paths:
|
|||||||
description: return updated topics since revision
|
description: return updated topics since revision
|
||||||
required: false
|
required: false
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: integer
|
||||||
|
format: int64
|
||||||
|
- name: count
|
||||||
|
in: query
|
||||||
|
description: limit number of latest from latest when revision not set
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
- name: begin
|
||||||
|
in: query
|
||||||
|
description: return tags after and including sequence marker
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
- name: end
|
||||||
|
in: query
|
||||||
|
description: return tags before and not including sequence marker
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: successful operation
|
description: successful operation
|
||||||
headers:
|
headers:
|
||||||
X-Tag-Revision:
|
Tag-Revision:
|
||||||
schema:
|
schema:
|
||||||
type: integer
|
type: integer
|
||||||
format: int64
|
format: int64
|
||||||
description: current tag revision
|
description: current tag revision
|
||||||
|
Tag-Marker:
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
description: sequnce marker of first tag when count set
|
||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
|
@ -9,9 +9,23 @@ import (
|
|||||||
"databag/internal/store"
|
"databag/internal/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func reverseTags(input []store.TagSlot) []store.TagSlot {
|
||||||
|
var output []store.TagSlot
|
||||||
|
for i := len(input) - 1; i >= 0; i-- {
|
||||||
|
output = append(output, input[i])
|
||||||
|
}
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
func GetChannelTopicTags(w http.ResponseWriter, r *http.Request) {
|
func GetChannelTopicTags(w http.ResponseWriter, r *http.Request) {
|
||||||
var revisionSet bool
|
var revisionSet bool
|
||||||
var revision int64
|
var revision int64
|
||||||
|
var beginSet bool
|
||||||
|
var begin int64
|
||||||
|
var endSet bool
|
||||||
|
var end int64
|
||||||
|
var countSet bool
|
||||||
|
var count int
|
||||||
|
|
||||||
// load channel slot
|
// load channel slot
|
||||||
channelSlot, _, err, code := getChannelSlot(r, false)
|
channelSlot, _, err, code := getChannelSlot(r, false)
|
||||||
@ -23,6 +37,7 @@ func GetChannelTopicTags(w http.ResponseWriter, r *http.Request) {
|
|||||||
// scan parameters
|
// scan parameters
|
||||||
params := mux.Vars(r)
|
params := mux.Vars(r)
|
||||||
topicId := params["topicId"]
|
topicId := params["topicId"]
|
||||||
|
|
||||||
rev := r.FormValue("revision")
|
rev := r.FormValue("revision")
|
||||||
if rev != "" {
|
if rev != "" {
|
||||||
revisionSet = true
|
revisionSet = true
|
||||||
@ -32,6 +47,33 @@ func GetChannelTopicTags(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cnt := r.FormValue("count")
|
||||||
|
if cnt != "" {
|
||||||
|
countSet = true
|
||||||
|
if count, err = strconv.Atoi(cnt); err != nil {
|
||||||
|
ErrResponse(w, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bn := r.FormValue("begin")
|
||||||
|
if bn != "" {
|
||||||
|
beginSet = true
|
||||||
|
if begin, err = strconv.ParseInt(bn, 10, 64); err != nil {
|
||||||
|
ErrResponse(w, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
en := r.FormValue("end")
|
||||||
|
if en != "" {
|
||||||
|
endSet = true
|
||||||
|
if end, err = strconv.ParseInt(en, 10, 64); err != nil {
|
||||||
|
ErrResponse(w, http.StatusBadRequest, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// load topic
|
// load topic
|
||||||
var topicSlot store.TopicSlot
|
var topicSlot store.TopicSlot
|
||||||
if err = store.DB.Preload("Topic").Where("channel_id = ? AND topic_slot_id = ?", channelSlot.Channel.ID, topicId).First(&topicSlot).Error; err != nil {
|
if err = store.DB.Preload("Topic").Where("channel_id = ? AND topic_slot_id = ?", channelSlot.Channel.ID, topicId).First(&topicSlot).Error; err != nil {
|
||||||
@ -47,24 +89,75 @@ func GetChannelTopicTags(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var response []*Tag
|
response := []*Tag{}
|
||||||
if revisionSet {
|
if revisionSet {
|
||||||
var slots []store.TagSlot
|
var slots []store.TagSlot
|
||||||
|
if beginSet && !endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND revision > ? AND id >= ?", topicSlot.Topic.ID, revision, begin).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if !beginSet && endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND revision > ? AND id < ?", topicSlot.Topic.ID, revision, end).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if beginSet && endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND revision > ? AND id >= ? AND id < ?", topicSlot.Topic.ID, revision, begin, end).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if err := store.DB.Preload("Tag").Where("topic_id = ? AND revision > ?", topicSlot.Topic.ID, revision).Find(&slots).Error; err != nil {
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND revision > ?", topicSlot.Topic.ID, revision).Find(&slots).Error; err != nil {
|
||||||
ErrResponse(w, http.StatusInternalServerError, err)
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for _, slot := range slots {
|
for _, slot := range slots {
|
||||||
response = append(response, getTagModel(&slot))
|
response = append(response, getTagModel(&slot))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var slots []store.TagSlot
|
var slots []store.TagSlot
|
||||||
|
if countSet {
|
||||||
|
if !endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ?", topicSlot.Topic.ID).Order("id desc").Limit(count).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND id < ?", topicSlot.Topic.ID, end).Order("id desc").Limit(count).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slots = reverseTags(slots)
|
||||||
|
} else if beginSet && !endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND id >= ?", topicSlot.Topic.ID, begin).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if !beginSet && endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND id < ?", topicSlot.Topic.ID, end).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if beginSet && endSet {
|
||||||
|
if err := store.DB.Preload("Tag").Where("topic_id = ? AND id >= ? AND id < ?", topicSlot.Topic.ID, begin, end).Find(&slots).Error; err != nil {
|
||||||
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if err := store.DB.Preload("Tag").Where("topic_id = ?", topicSlot.Topic.ID).Find(&slots).Error; err != nil {
|
if err := store.DB.Preload("Tag").Where("topic_id = ?", topicSlot.Topic.ID).Find(&slots).Error; err != nil {
|
||||||
ErrResponse(w, http.StatusInternalServerError, err)
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for _, slot := range slots {
|
for _, slot := range slots {
|
||||||
if slot.Tag != nil {
|
if slot.Tag != nil {
|
||||||
|
if countSet {
|
||||||
|
w.Header().Set("Tag-Marker", strconv.FormatUint(uint64(slot.ID), 10))
|
||||||
|
countSet = false
|
||||||
|
}
|
||||||
response = append(response, getTagModel(&slot))
|
response = append(response, getTagModel(&slot))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"databag/internal/store"
|
"databag/internal/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
func reverse(input []store.TopicSlot) []store.TopicSlot {
|
func reverseTopics(input []store.TopicSlot) []store.TopicSlot {
|
||||||
var output []store.TopicSlot
|
var output []store.TopicSlot
|
||||||
for i := len(input) - 1; i >= 0; i-- {
|
for i := len(input) - 1; i >= 0; i-- {
|
||||||
output = append(output, input[i])
|
output = append(output, input[i])
|
||||||
@ -107,7 +107,7 @@ func GetChannelTopics(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
slots = reverse(slots)
|
slots = reverseTopics(slots)
|
||||||
} else if beginSet && !endSet {
|
} else if beginSet && !endSet {
|
||||||
if err := store.DB.Preload("Topic.Assets").Where("channel_id = ? AND id >= ?", channelSlot.Channel.ID, begin).Find(&slots).Error; err != nil {
|
if err := store.DB.Preload("Topic.Assets").Where("channel_id = ? AND id >= ?", channelSlot.Channel.ID, begin).Find(&slots).Error; err != nil {
|
||||||
ErrResponse(w, http.StatusInternalServerError, err)
|
ErrResponse(w, http.StatusInternalServerError, err)
|
||||||
@ -132,7 +132,7 @@ func GetChannelTopics(w http.ResponseWriter, r *http.Request) {
|
|||||||
for _, slot := range slots {
|
for _, slot := range slots {
|
||||||
if slot.Topic != nil {
|
if slot.Topic != nil {
|
||||||
if countSet {
|
if countSet {
|
||||||
w.Header().Set("Topic-Index", strconv.FormatUint(uint64(slot.ID), 10))
|
w.Header().Set("Topic-Marker", strconv.FormatUint(uint64(slot.ID), 10))
|
||||||
countSet = false
|
countSet = false
|
||||||
}
|
}
|
||||||
response = append(response, getTopicModel(&slot))
|
response = append(response, getTopicModel(&slot))
|
||||||
|
Loading…
Reference in New Issue
Block a user