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 &copy
    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(&copy)
    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  }