social-network
social-network/test-data.tf
1
resource "time_static" "base" {}
2
3
locals {
4
  avatars = [
5
    # avatars from https://www.dicebear.com/playground
6
    <<EOF
7
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#69d2e7" width="100" height="100" x="0" y="0" /><g transform="translate(1, -5) rotate(4 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#0a5b83"/><g transform="translate(29 33)"><g transform="translate(14, 7) rotate(-16 21 21)"><g transform="translate(0 3)"><path d="M16 8c0 3.31-1.34 6-3 6s-3-2.69-3-6 1.34-6 3-6 3 2.69 3 6ZM32 8c0 3.31-1.34 6-3 6s-3-2.69-3-6 1.34-6 3-6 3 2.69 3 6Z" fill="#ffffff"/></g><g transform="translate(6 25)"><path d="M15 11C4.52 11 2.42 2.82 3.12 2.14 3.82 1.46 8.02 3.5 15 3.5c6.99 0 11.18-2.04 11.88-1.36.7.68-1.4 8.86-11.88 8.86Z" fill="#ffffff"/></g></g></g></g></g></svg>
8
EOF
9
    ,
10
    <<EOF
11
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#f1f4dc" width="100" height="100" x="0" y="0" /><g transform="translate(5, -3) rotate(-2 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#1c799f"/><g transform="translate(29 33)"><g transform="translate(13, 13) rotate(-7 21 21)"><g transform="translate(0 4)"><path d="M14 8c0 2.2-1.34 4-3 4s-3-1.8-3-4 1.34-4 3-4 3 1.8 3 4ZM28.5 5C25.29 5 24 6.36 24 7.04c0 3.4 1.29 1.35 4.5 1.35S33 10.43 33 7.04C33 6.36 31.71 5 28.5 5Z" fill="#ffffff"/></g><g transform="translate(6 24)"><path d="M15.5 10c-5.07 0-9.3-5.23-8.37-5.88.93-.65 3.45 2.15 8.37 2.15 4.92 0 7.44-2.88 8.37-2.15.93.73-3.3 5.88-8.37 5.88Z" fill="#ffffff"/></g></g></g></g></g></svg>
12
EOF
13
    ,
14
    <<EOF
15
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#0a5b83" width="100" height="100" x="0" y="0" /><g transform="translate(4, -5) rotate(-20 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#69d2e7"/><g transform="translate(29 33)"><g transform="translate(3, 12) rotate(11 21 21)"><g transform="translate(0 4)"><path d="M16 8c0 1.66-1.12 3-2.5 3S11 9.66 11 8s1.12-3 2.5-3S16 6.34 16 8ZM31 8c0 1.66-1.12 3-2.5 3S26 9.66 26 8s1.12-3 2.5-3S31 6.34 31 8Z" fill="#ffffff"/></g><g transform="translate(6 24)"><path d="M15 14C1.9 14-.72 1.29.15.23 1.03-.83 6.27 2.11 15 2.11S28.97-.83 29.85.23C30.72 1.3 28.1 14 15 14Z" fill="#ffffff"/></g></g></g></g></g></svg>
16
EOF
17
    ,
18
    <<EOF
19
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#1c799f" width="100" height="100" x="0" y="0" /><g transform="translate(-5, 3) rotate(7 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#0a5b83"/><g transform="translate(29 33)"><g transform="translate(-2, -5) rotate(-15 21 21)"><g transform="translate(0 4)"><path d="M8.5 10c-3.88 0-7.11-4.23-6.4-4.85.71-.62 2.63 1.3 6.4 1.3 3.77 0 5.69-2 6.4-1.3S12.38 10 8.5 10ZM33.5 10c-3.88 0-7.11-4.23-6.4-4.85.71-.62 2.63 1.3 6.4 1.3 3.77 0 5.69-2 6.4-1.3S37.38 10 33.5 10Z" fill="#ffffff"/></g><g transform="translate(6 24)"><path d="M15 11C4.52 11 2.42 2.82 3.12 2.14 3.82 1.46 8.02 3.5 15 3.5c6.99 0 11.18-2.04 11.88-1.36.7.68-1.4 8.86-11.88 8.86Z" fill="#ffffff"/></g></g></g></g></g></svg>
20
EOF
21
    ,
22
    <<EOF
23
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#f88c49" width="100" height="100" x="0" y="0" /><g transform="translate(1, 2) rotate(-14 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#1c799f"/><g transform="translate(29 33)"><g transform="translate(4, 0) rotate(-17 21 21)"><g transform="translate(0 3)"><path d="M8.5 6C5.29 6 4 7.36 4 8.04c0 3.4 1.29 1.35 4.5 1.35S13 11.43 13 8.04C13 7.36 11.71 6 8.5 6ZM33.5 6C30.29 6 29 7.36 29 8.04c0 3.4 1.29 1.35 4.5 1.35S38 11.43 38 8.04C38 7.36 36.71 6 33.5 6Z" fill="#ffffff"/></g><g transform="translate(6 25)"><path d="M15 11C4.52 11 2.42 2.82 3.12 2.14 3.82 1.46 8.02 3.5 15 3.5c6.99 0 11.18-2.04 11.88-1.36.7.68-1.4 8.86-11.88 8.86Z" fill="#ffffff"/></g></g></g></g></g></svg>
24
EOF
25
    ,
26
    <<EOF
27
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#0a5b83" width="100" height="100" x="0" y="0" /><g transform="translate(1, -3) rotate(-14 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#69d2e7"/><g transform="translate(29 33)"><g transform="translate(-15, 5) rotate(10 21 21)"><g transform="translate(0 3)"><path d="M13 8c0 2.2-1.34 4-3 4s-3-1.8-3-4 1.34-4 3-4 3 1.8 3 4ZM35 8c0 2.2-1.34 4-3 4s-3-1.8-3-4 1.34-4 3-4 3 1.8 3 4Z" fill="#ffffff"/></g><g transform="translate(6 25)"><path d="M15 14C1.9 14-.72 1.29.15.23 1.03-.83 6.27 2.11 15 2.11S28.97-.83 29.85.23C30.72 1.3 28.1 14 15 14Z" fill="#ffffff"/></g></g></g></g></g></svg>
28
EOF
29
    ,
30
    <<EOF
31
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#69d2e7" width="100" height="100" x="0" y="0" /><g transform="translate(-4, 1) rotate(-7 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#1c799f"/><g transform="translate(29 33)"><g transform="translate(6, 4) rotate(0 21 21)"><g transform="translate(0 3)"><path d="M9.5 10c-3.88 0-7.11-4.23-6.4-4.85.71-.62 2.63 1.3 6.4 1.3 3.77 0 5.69-2 6.4-1.3S13.38 10 9.5 10ZM32.5 10c-3.88 0-7.11-4.23-6.4-4.85.71-.62 2.63 1.3 6.4 1.3 3.77 0 5.69-2 6.4-1.3S36.38 10 32.5 10Z" fill="#ffffff"/></g><g transform="translate(6 25)"><path d="M15 11C4.52 11 2.42 2.82 3.12 2.14 3.82 1.46 8.02 3.5 15 3.5c6.99 0 11.18-2.04 11.88-1.36.7.68-1.4 8.86-11.88 8.86Z" fill="#ffffff"/></g></g></g></g></g></svg>
32
EOF
33
    ,
34
    <<EOF
35
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#1c799f" width="100" height="100" x="0" y="0" /><g transform="translate(-4, -5) rotate(-7 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#0a5b83"/><g transform="translate(29 33)"><g transform="translate(13, -7) rotate(-6 21 21)"><g transform="translate(0 2)"><path d="M6 8.36S6 4 10 4s4 4.36 4 4.36v2.91s0 .73-.67.73c-.66 0-.66-2.9-3.33-2.9S7.33 12 6.67 12C6 12 6 11.27 6 11.27v-2.9ZM28 8.36S28 4 32 4s4 4.36 4 4.36v2.91s0 .73-.67.73c-.66 0-.66-2.9-3.33-2.9S29.33 12 28.67 12c-.67 0-.67-.73-.67-.73v-2.9Z" fill="#ffffff"/></g><g transform="translate(6 26)"><path d="M15.5 10c-5.07 0-9.3-5.23-8.37-5.88.93-.65 3.45 2.15 8.37 2.15 4.92 0 7.44-2.88 8.37-2.15.93.73-3.3 5.88-8.37 5.88Z" fill="#ffffff"/></g></g></g></g></g></svg>
36
EOF
37
    ,
38
    <<EOF
39
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none" shape-rendering="auto" width="512" height="512"><mask id="viewboxMask"><rect width="100" height="100" rx="0" ry="0" x="0" y="0" fill="#fff" /></mask><g mask="url(#viewboxMask)"><rect fill="#0a5b83" width="100" height="100" x="0" y="0" /><g transform="translate(-1, -5) rotate(11 50 70)"><path d="M95 53.33C95 29.4 74.85 10 50 10S5 29.4 5 53.33V140h90V53.33Z" fill="#f88c49"/><g transform="translate(29 33)"><g transform="translate(-7, 5) rotate(-18 21 21)"><g transform="translate(0 2)"><path d="M16 8c0 2.2-1.34 4-3 4s-3-1.8-3-4 1.34-4 3-4 3 1.8 3 4ZM32 8c0 2.2-1.34 4-3 4s-3-1.8-3-4 1.34-4 3-4 3 1.8 3 4Z" fill="#ffffff"/></g><g transform="translate(6 26)"><path d="M15.2 3.84c0-.67-4.2-2-4.2-2.67 0-.66 7 .67 7 2.67S13.8 6.5 13.8 6.5s4.2.67 4.2 2.66c0 2-7 3.33-7 2.67 0-.67 4.2-2 4.2-2.67 0-.66-3.5-1.33-3.5-2.66s3.5-2 3.5-2.66Z" fill="#ffffff"/></g></g></g></g></g></svg>
40
EOF
41
  ]
42
  baseTimestamp = time_static.base.unix * 1000 - 24 * 60 * 60 * 1000
43
  # usernames generated with faker.js
44
  users = [
45
    { name : "Test User", avatar : 0, friends : [1, 2, 3, 4, 5, 6] },
46
    { name : "Lisa Ondricka", avatar : 1, friends : [5, 7, 8] },
47
    { name : "Chasity Waters", avatar : 2, friends : [4, 5, 6] },
48
    { name : "Adrianna McGlynn", avatar : 3, friends : [5, 7, 8] },
49
    { name : "Imani Turcotte", avatar : 4, friends : [7] },
50
    { name : "Stefan Bruen", avatar : 5, friends : [7] },
51
    { name : "Kari Trantow", avatar : 6, friends : [7, 8] },
52
    { name : "Lora Berge", avatar : 7, friends : [] },
53
    { name : "Jo Lebsack", avatar : 8, friends : [] },
54
  ]
55
  posts = [
56
    { user : 0, text : "Lorem ipsum 1", secondsAfterBase : 10 },
57
    { user : 1, text : "Lorem ipsum 2", secondsAfterBase : 50 },
58
    { user : 2, text : "Lorem ipsum 3", secondsAfterBase : 100 },
59
    { user : 0, text : "Lorem ipsum 4", secondsAfterBase : 130 },
60
    { user : 1, text : "Lorem ipsum 5", secondsAfterBase : 250 },
61
    { user : 0, text : "Lorem ipsum 6", secondsAfterBase : 500 },
62
    { user : 3, text : "Lorem ipsum 7", secondsAfterBase : 600 },
63
    { user : 0, text : "Lorem ipsum 8", secondsAfterBase : 700 },
64
    { user : 0, text : "Lorem ipsum 9", secondsAfterBase : 800 },
65
    { user : 0, text : "Lorem ipsum 10", secondsAfterBase : 900 },
66
    { user : 0, text : "Lorem ipsum 11", secondsAfterBase : 1000 },
67
    { user : 0, text : "Lorem ipsum 12", secondsAfterBase : 1100 },
68
  ]
69
  comments = [
70
    { post : 0, user : 1, text : "Comment ipsum 1", secondsAfterBase : 100 },
71
    { post : 0, user : 0, text : "Comment ipsum 2", secondsAfterBase : 200 },
72
    { post : 0, user : 1, text : "Comment ipsum 3", secondsAfterBase : 300 },
73
    { post : 1, user : 4, text : "Comment ipsum 4", secondsAfterBase : 400 },
74
    { post : 1, user : 2, text : "Comment ipsum 5", secondsAfterBase : 800 },
75
    { post : 3, user : 7, text : "Comment ipsum 6", secondsAfterBase : 900 },
76
    { post : 3, user : 8, text : "Comment ipsum 7", secondsAfterBase : 950 },
77
    { post : 4, user : 3, text : "Comment ipsum 8", secondsAfterBase : 990 },
78
  ]
79
}
80
81
resource "random_uuid" "postId" {
82
  count = length(local.posts)
83
}
84
85
resource "random_uuid" "commentId" {
86
  count = length(local.comments)
87
}
88
89
resource "aws_dynamodb_table_item" "post" {
90
  count      = length(local.posts)
91
  table_name = aws_dynamodb_table.post.name
92
  hash_key   = aws_dynamodb_table.post.hash_key
93
  item       = <<ITEM
94
{
95
	"id": {"S": "${random_uuid.postId[count.index].id}"},
96
	"userId": {"S": "${aws_cognito_user.user[local.posts[count.index].user].sub}"},
97
	"text": {"S": "${local.posts[count.index].text}"},
98
	"date": {"N": "${tostring(local.baseTimestamp + local.posts[count.index].secondsAfterBase * 1000)}"}
99
}
100
ITEM
101
}
102
103
resource "aws_dynamodb_table_item" "comment" {
104
  count      = length(local.comments)
105
  table_name = aws_dynamodb_table.comment.name
106
  hash_key   = aws_dynamodb_table.comment.hash_key
107
  item       = <<ITEM
108
{
109
	"id": {"S": "${random_uuid.commentId[count.index].id}"},
110
	"userId": {"S": "${aws_cognito_user.user[local.comments[count.index].user].sub}"},
111
	"postId": {"S": "${random_uuid.postId[local.comments[count.index].post].id}"},
112
	"text": {"S": "${local.comments[count.index].text}"},
113
	"date": {"N": "${tostring(local.baseTimestamp + local.comments[count.index].secondsAfterBase * 1000)}"}
114
}
115
ITEM
116
}
117
118
resource "aws_cognito_user" "user" {
119
  count        = length(local.users)
120
  user_pool_id = aws_cognito_user_pool.pool.id
121
  username     = "user${count.index == 0 ? "" : count.index}"
122
  attributes = {
123
    email = "user${count.index == 0 ? "" : count.index}@example.com"
124
  }
125
  password = "Password.1"
126
}
127
128
resource "aws_dynamodb_table_item" "user" {
129
  count      = length(local.users)
130
  table_name = aws_dynamodb_table.user.name
131
  hash_key   = aws_dynamodb_table.user.hash_key
132
  item       = <<ITEM
133
{
134
	"id": {"S": "${aws_cognito_user.user[count.index].sub}"},
135
	"name": {"S": "${local.users[count.index].name}"},
136
	"avatar": {"S": "${trimspace(replace(local.avatars[local.users[count.index].avatar], "\"", "\\\""))}"}
137
}
138
ITEM
139
}
140
141
locals {
142
  friend_pairs = flatten([for i, u in local.users : [
143
    for f in u.friends : { "user1" = i, "user2" = f }
144
  ]])
145
}
146
147
resource "aws_dynamodb_table_item" "friend" {
148
  count      = length(local.friend_pairs)
149
  table_name = aws_dynamodb_table.friend.name
150
  hash_key   = aws_dynamodb_table.friend.hash_key
151
  range_key  = aws_dynamodb_table.friend.range_key
152
  item       = <<ITEM
153
{
154
	"userId1": {"S": "${aws_cognito_user.user[local.friend_pairs[count.index]["user1"]].sub}"},
155
	"userId2": {"S": "${aws_cognito_user.user[local.friend_pairs[count.index]["user2"]].sub}"}
156
}
157
ITEM
158
}
159
resource "aws_dynamodb_table_item" "friend_reverse" {
160
  count      = length(local.friend_pairs)
161
  table_name = aws_dynamodb_table.friend.name
162
  hash_key   = aws_dynamodb_table.friend.hash_key
163
  range_key  = aws_dynamodb_table.friend.range_key
164
  item       = <<ITEM
165
{
166
	"userId1": {"S": "${aws_cognito_user.user[local.friend_pairs[count.index]["user2"]].sub}"},
167
	"userId2": {"S": "${aws_cognito_user.user[local.friend_pairs[count.index]["user1"]].sub}"}
168
}
169
ITEM
170
}
171