/
retrieve_profile.go
108 lines (100 loc) · 2.43 KB
/
retrieve_profile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package character
import (
"encoding/json"
"github.com/kaikourok/lunchtote-backend/entity/model"
"github.com/lib/pq"
)
func (db *CharacterRepository) RetrieveProfile(userId *int, targetId int) (*model.Profile, error) {
row := db.QueryRowx(`
SELECT
id,
name,
nickname,
summary,
profile,
ARRAY(SELECT path FROM characters_profile_images WHERE character = $1),
ARRAY(SELECT tag FROM characters_tags WHERE character = $1),
(SELECT count(*) FROM follows WHERE follower = $1),
(SELECT count(*) FROM follows WHERE followed = $1),
COALESCE(
(
SELECT
json_agg(row_to_json(icon_rows))
FROM
(
SELECT
path
FROM
characters_icons
WHERE
character = $1
ORDER BY
id
LIMIT
30
) icon_rows
)
, '[]'::JSON) AS icons_json,
COALESCE(
(
SELECT
json_agg(row_to_json(character_diaries))
FROM
(
SELECT
nth,
title
FROM
diaries
WHERE
character = $1
ORDER BY
nth
) character_diaries
)
, '[]'::JSON) AS diaries_json,
COALESCE((SELECT true FROM follows WHERE follower = $2 AND followed = $1), false),
COALESCE((SELECT true FROM follows WHERE followed = $2 AND follower = $1), false),
COALESCE((SELECT true FROM mutes WHERE muter = $2 AND muted = $1), false),
COALESCE((SELECT true FROM blocks WHERE blocker = $2 AND blocked = $1), false),
COALESCE((SELECT true FROM blocks WHERE blocked = $2 AND blocker = $1), false)
FROM
characters
WHERE
id = $1 AND
deleted_at IS NULL AND
administrator = false;
`, targetId, userId)
character := model.Profile{}
var iconsJsonReader, diariesJsonReader string
err := row.Scan(
&character.Id,
&character.Name,
&character.Nickname,
&character.Summary,
&character.Profile,
pq.Array(&character.ProfileImages),
pq.Array(&character.Tags),
&character.FollowingNumber,
&character.FollowedNumber,
&iconsJsonReader,
&diariesJsonReader,
&character.IsFollowing,
&character.IsFollowed,
&character.IsMuting,
&character.IsBlocking,
&character.IsBlocked,
)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(iconsJsonReader), &character.Icons)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(diariesJsonReader), &character.ExistingDiaries)
if err != nil {
return nil, err
}
return &character, nil
}