github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/model/post_list.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "io" 9 "sort" 10 ) 11 12 type PostList struct { 13 Order []string `json:"order"` 14 Posts map[string]*Post `json:"posts"` 15 NextPostId string `json:"next_post_id"` 16 PrevPostId string `json:"prev_post_id"` 17 } 18 19 func NewPostList() *PostList { 20 return &PostList{ 21 Order: make([]string, 0), 22 Posts: make(map[string]*Post), 23 NextPostId: "", 24 PrevPostId: "", 25 } 26 } 27 28 func (o *PostList) ToSlice() []*Post { 29 var posts []*Post 30 for _, id := range o.Order { 31 posts = append(posts, o.Posts[id]) 32 } 33 return posts 34 } 35 36 func (o *PostList) WithRewrittenImageURLs(f func(string) string) *PostList { 37 copy := *o 38 copy.Posts = make(map[string]*Post) 39 for id, post := range o.Posts { 40 copy.Posts[id] = post.WithRewrittenImageURLs(f) 41 } 42 return © 43 } 44 45 func (o *PostList) StripActionIntegrations() { 46 posts := o.Posts 47 o.Posts = make(map[string]*Post) 48 for id, post := range posts { 49 pcopy := post.Clone() 50 pcopy.StripActionIntegrations() 51 o.Posts[id] = pcopy 52 } 53 } 54 55 func (o *PostList) ToJson() string { 56 copy := *o 57 copy.StripActionIntegrations() 58 b, err := json.Marshal(©) 59 if err != nil { 60 return "" 61 } 62 return string(b) 63 } 64 65 func (o *PostList) MakeNonNil() { 66 if o.Order == nil { 67 o.Order = make([]string, 0) 68 } 69 70 if o.Posts == nil { 71 o.Posts = make(map[string]*Post) 72 } 73 74 for _, v := range o.Posts { 75 v.MakeNonNil() 76 } 77 } 78 79 func (o *PostList) AddOrder(id string) { 80 81 if o.Order == nil { 82 o.Order = make([]string, 0, 128) 83 } 84 85 o.Order = append(o.Order, id) 86 } 87 88 func (o *PostList) AddPost(post *Post) { 89 90 if o.Posts == nil { 91 o.Posts = make(map[string]*Post) 92 } 93 94 o.Posts[post.Id] = post 95 } 96 97 func (o *PostList) UniqueOrder() { 98 keys := make(map[string]bool) 99 order := []string{} 100 for _, postId := range o.Order { 101 if _, value := keys[postId]; !value { 102 keys[postId] = true 103 order = append(order, postId) 104 } 105 } 106 107 o.Order = order 108 } 109 110 func (o *PostList) Extend(other *PostList) { 111 for postId := range other.Posts { 112 o.AddPost(other.Posts[postId]) 113 } 114 115 for _, postId := range other.Order { 116 o.AddOrder(postId) 117 } 118 119 o.UniqueOrder() 120 } 121 122 func (o *PostList) SortByCreateAt() { 123 sort.Slice(o.Order, func(i, j int) bool { 124 return o.Posts[o.Order[i]].CreateAt > o.Posts[o.Order[j]].CreateAt 125 }) 126 } 127 128 func (o *PostList) Etag() string { 129 130 id := "0" 131 var t int64 = 0 132 133 for _, v := range o.Posts { 134 if v.UpdateAt > t { 135 t = v.UpdateAt 136 id = v.Id 137 } else if v.UpdateAt == t && v.Id > id { 138 t = v.UpdateAt 139 id = v.Id 140 } 141 } 142 143 orderId := "" 144 if len(o.Order) > 0 { 145 orderId = o.Order[0] 146 } 147 148 return Etag(orderId, id, t) 149 } 150 151 func (o *PostList) IsChannelId(channelId string) bool { 152 for _, v := range o.Posts { 153 if v.ChannelId != channelId { 154 return false 155 } 156 } 157 158 return true 159 } 160 161 func PostListFromJson(data io.Reader) *PostList { 162 var o *PostList 163 json.NewDecoder(data).Decode(&o) 164 return o 165 }