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("edChirp.Chirp, r, prefixQuotedChirpMeta); populateErr != nil { 47 return populateErr 48 } 49 if populateErr := db.PopulateByName("edChirp.Stats, r, prefixQuotedChirpStatsMeta); populateErr != nil { 50 return populateErr 51 } 52 if populateErr := db.PopulateByName("edChirp.User, r, prefixQuotedUserMeta); populateErr != nil { 53 return populateErr 54 } 55 if populateErr := db.PopulateByName("edChirp.UserInfo, r, prefixQuotedUserInfoMeta); populateErr != nil { 56 return populateErr 57 } 58 cf.Quoted = "edChirp 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 }