1 | resource "time_static" "base" {} |
2 | |
3 | locals { |
4 | avatars = [ |
5 | |
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 | |
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 | |