go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/projects/chirp/pkg/model/chirp_full.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package model
     9  
    10  import (
    11  	"go.charczuk.com/sdk/apputil"
    12  	"go.charczuk.com/sdk/db"
    13  )
    14  
    15  // ChirpFull is a hydrated chirp with all the extra stuff on it.
    16  type ChirpFull struct {
    17  	Chirp
    18  	User     apputil.User
    19  	UserInfo UserInfo
    20  	Status   ChirpStatus
    21  	Stats    ChirpStats
    22  	ReplyTo  *ChirpFull
    23  	Quoted   *ChirpFull
    24  }
    25  
    26  // Populate implements db.Populatable and allows us to add more complicated
    27  // logic for populating the struct from database rows.
    28  func (cf *ChirpFull) Populate(r db.Rows) error {
    29  	if populateErr := db.PopulateByName(&cf.Chirp, r, prefixChirpMeta); populateErr != nil {
    30  		return populateErr
    31  	}
    32  	if populateErr := db.PopulateByName(&cf.Status, r, prefixChirpStatusMeta); populateErr != nil {
    33  		return populateErr
    34  	}
    35  	if populateErr := db.PopulateByName(&cf.Stats, r, prefixChirpStatsMeta); populateErr != nil {
    36  		return populateErr
    37  	}
    38  	if populateErr := db.PopulateByName(&cf.User, r, prefixChirpUserMeta); populateErr != nil {
    39  		return populateErr
    40  	}
    41  	if populateErr := db.PopulateByName(&cf.UserInfo, r, prefixChirpUserInfoMeta); populateErr != nil {
    42  		return populateErr
    43  	}
    44  	if cf.QuotedID != nil && !cf.QuotedID.IsZero() {
    45  		var quotedChirp ChirpFull
    46  		if populateErr := db.PopulateByName(&quotedChirp.Chirp, r, prefixQuotedChirpMeta); populateErr != nil {
    47  			return populateErr
    48  		}
    49  		if populateErr := db.PopulateByName(&quotedChirp.Stats, r, prefixQuotedChirpStatsMeta); populateErr != nil {
    50  			return populateErr
    51  		}
    52  		if populateErr := db.PopulateByName(&quotedChirp.User, r, prefixQuotedUserMeta); populateErr != nil {
    53  			return populateErr
    54  		}
    55  		if populateErr := db.PopulateByName(&quotedChirp.UserInfo, r, prefixQuotedUserInfoMeta); populateErr != nil {
    56  			return populateErr
    57  		}
    58  		cf.Quoted = &quotedChirp
    59  	}
    60  	if cf.ReplyID != nil && !cf.ReplyID.IsZero() {
    61  		var replyChirp ChirpFull
    62  		if populateErr := db.PopulateByName(&replyChirp.Chirp, r, prefixReplyChirpMeta); populateErr != nil {
    63  			return populateErr
    64  		}
    65  		if populateErr := db.PopulateByName(&replyChirp.Stats, r, prefixReplyChirpStatsMeta); populateErr != nil {
    66  			return populateErr
    67  		}
    68  		if populateErr := db.PopulateByName(&replyChirp.User, r, prefixReplyUserMeta); populateErr != nil {
    69  			return populateErr
    70  		}
    71  		if populateErr := db.PopulateByName(&replyChirp.UserInfo, r, prefixReplyUserInfoMeta); populateErr != nil {
    72  			return populateErr
    73  		}
    74  		cf.ReplyTo = &replyChirp
    75  	}
    76  	return nil
    77  }
    78  
    79  var (
    80  	prefixChirpMeta         = db.TypeMetaFor(Chirp{}).CopyWithColumnPrefix("chirp_")
    81  	prefixChirpStatusMeta   = db.TypeMetaFor(ChirpStatus{}).CopyWithColumnPrefix("chirp_status_")
    82  	prefixChirpStatsMeta    = db.TypeMetaFor(ChirpStats{}).CopyWithColumnPrefix("chirp_stats_")
    83  	prefixChirpUserMeta     = db.TypeMetaFor(apputil.User{}).CopyWithColumnPrefix("chirp_user_")
    84  	prefixChirpUserInfoMeta = db.TypeMetaFor(UserInfo{}).CopyWithColumnPrefix("chirp_userinfo_")
    85  
    86  	prefixQuotedChirpMeta      = db.TypeMetaFor(Chirp{}).CopyWithColumnPrefix("quoted_")
    87  	prefixQuotedChirpStatsMeta = db.TypeMetaFor(ChirpStats{}).CopyWithColumnPrefix("quoted_stats_")
    88  	prefixQuotedUserMeta       = db.TypeMetaFor(apputil.User{}).CopyWithColumnPrefix("quoted_user_")
    89  	prefixQuotedUserInfoMeta   = db.TypeMetaFor(UserInfo{}).CopyWithColumnPrefix("quoted_userinfo_")
    90  
    91  	prefixReplyChirpMeta      = db.TypeMetaFor(Chirp{}).CopyWithColumnPrefix("reply_")
    92  	prefixReplyChirpStatsMeta = db.TypeMetaFor(ChirpStats{}).CopyWithColumnPrefix("reply_stats_")
    93  	prefixReplyUserMeta       = db.TypeMetaFor(apputil.User{}).CopyWithColumnPrefix("reply_user_")
    94  	prefixReplyUserInfoMeta   = db.TypeMetaFor(UserInfo{}).CopyWithColumnPrefix("reply_userinfo_")
    95  )
    96  
    97  type ChirpStatus struct {
    98  	IsLiked     bool `db:"is_liked,readonly"`
    99  	IsRetweeted bool `db:"is_retweeted,readonly"`
   100  }