github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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 } else { 62 return string(b) 63 } 64 } 65 66 func (o *PostList) MakeNonNil() { 67 if o.Order == nil { 68 o.Order = make([]string, 0) 69 } 70 71 if o.Posts == nil { 72 o.Posts = make(map[string]*Post) 73 } 74 75 for _, v := range o.Posts { 76 v.MakeNonNil() 77 } 78 } 79 80 func (o *PostList) AddOrder(id string) { 81 82 if o.Order == nil { 83 o.Order = make([]string, 0, 128) 84 } 85 86 o.Order = append(o.Order, id) 87 } 88 89 func (o *PostList) AddPost(post *Post) { 90 91 if o.Posts == nil { 92 o.Posts = make(map[string]*Post) 93 } 94 95 o.Posts[post.Id] = post 96 } 97 98 func (o *PostList) UniqueOrder() { 99 keys := make(map[string]bool) 100 order := []string{} 101 for _, postId := range o.Order { 102 if _, value := keys[postId]; !value { 103 keys[postId] = true 104 order = append(order, postId) 105 } 106 } 107 108 o.Order = order 109 } 110 111 func (o *PostList) Extend(other *PostList) { 112 for postId := range other.Posts { 113 o.AddPost(other.Posts[postId]) 114 } 115 116 for _, postId := range other.Order { 117 o.AddOrder(postId) 118 } 119 120 o.UniqueOrder() 121 } 122 123 func (o *PostList) SortByCreateAt() { 124 sort.Slice(o.Order, func(i, j int) bool { 125 return o.Posts[o.Order[i]].CreateAt > o.Posts[o.Order[j]].CreateAt 126 }) 127 } 128 129 func (o *PostList) Etag() string { 130 131 id := "0" 132 var t int64 = 0 133 134 for _, v := range o.Posts { 135 if v.UpdateAt > t { 136 t = v.UpdateAt 137 id = v.Id 138 } else if v.UpdateAt == t && v.Id > id { 139 t = v.UpdateAt 140 id = v.Id 141 } 142 } 143 144 orderId := "" 145 if len(o.Order) > 0 { 146 orderId = o.Order[0] 147 } 148 149 return Etag(orderId, id, t) 150 } 151 152 func (o *PostList) IsChannelId(channelId string) bool { 153 for _, v := range o.Posts { 154 if v.ChannelId != channelId { 155 return false 156 } 157 } 158 159 return true 160 } 161 162 func PostListFromJson(data io.Reader) *PostList { 163 var o *PostList 164 json.NewDecoder(data).Decode(&o) 165 return o 166 }