Commit 895b975d6571eab144212dd98e8782a0504c4a46

Authored by Andrew Buss
1 parent b816d0356c
Exists in master

Removed references to api.py.

Showing 1 changed file with 4 additions and 4 deletions Inline Diff

DesignUseCases.tex View file @ 895b975
\documentclass[letterpaper]{scrartcl} % or whatever 1 1 \documentclass[letterpaper]{scrartcl} % or whatever
\usepackage{tgpagella} 2 2 \usepackage{tgpagella}
\setkomafont{disposition}{\normalfont\bfseries} 3 3 \setkomafont{disposition}{\normalfont\bfseries}
%\usepackage[markuppercase]{scrpage2} 4 4 %\usepackage[markuppercase]{scrpage2}
\title{\huge Design Use Cases} 5 5 \title{\huge Design Use Cases}
\date{\today} 6 6 \date{\today}
\author{\Large Students With A Goal (S.W.A.G.)} 7 7 \author{\Large Students With A Goal (S.W.A.G.)}
\usepackage[pass]{geometry} 8 8 \usepackage[pass]{geometry}
\usepackage{hyperref} 9 9 \usepackage{hyperref}
\usepackage{graphicx} 10 10 \usepackage{graphicx}
\usepackage{enumitem} 11 11 \usepackage{enumitem}
\setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf} 12 12 \setlist[description]{style=multiline,leftmargin=3cm,font=\normalfont\textbf}
\setlistdepth{9} 13 13 \setlistdepth{9}
14 14
\setlist[itemize,1]{label=$\bullet$} 15 15 \setlist[itemize,1]{label=$\bullet$}
\setlist[itemize,2]{label=$\bullet$} 16 16 \setlist[itemize,2]{label=$\bullet$}
\setlist[itemize,3]{label=$\bullet$} 17 17 \setlist[itemize,3]{label=$\bullet$}
\setlist[itemize,4]{label=$\bullet$} 18 18 \setlist[itemize,4]{label=$\bullet$}
\setlist[itemize,5]{label=$\bullet$} 19 19 \setlist[itemize,5]{label=$\bullet$}
\setlist[itemize,6]{label=$\bullet$} 20 20 \setlist[itemize,6]{label=$\bullet$}
\setlist[itemize,7]{label=$\bullet$} 21 21 \setlist[itemize,7]{label=$\bullet$}
\setlist[itemize,8]{label=$\bullet$} 22 22 \setlist[itemize,8]{label=$\bullet$}
\setlist[itemize,9]{label=$\bullet$} 23 23 \setlist[itemize,9]{label=$\bullet$}
\renewlist{itemize}{itemize}{9} 24 24 \renewlist{itemize}{itemize}{9}
\begin{document} 25 25 \begin{document}
\maketitle 26 26 \maketitle
\begin{center} 27 27 \begin{center}
\includegraphics[width=12cm]{../swag_logo.png}\\ 28 28 \includegraphics[width=12cm]{../swag_logo.png}\\
29 29
\begin{tabular}{l r} 30 30 \begin{tabular}{l r}
Melody Jeng & System Architect \\ 31 31 Melody Jeng & System Architect \\
Arno Gau & Senior System Analyst \\ 32 32 Arno Gau & Senior System Analyst \\
Rachel Lee & Software Development Lead \\ 33 33 Rachel Lee & Software Development Lead \\
Laura Hawkins & Project Manager \\ 34 34 Laura Hawkins & Project Manager \\
Rohan Rangray & Algorithms Specialist\\ 35 35 Rohan Rangray & Algorithms Specialist\\
Andrew Buss & Database Specialist \\ 36 36 Andrew Buss & Database Specialist \\
Phuong Tran & Quality Assurance Lead \\ 37 37 Phuong Tran & Quality Assurance Lead \\
Chung Kang Wang & Business Analyst\\ 38 38 Chung Kang Wang & Business Analyst\\
Masud Rahman & User Interface Specialist\\ 39 39 Masud Rahman & User Interface Specialist\\
Kevin Mach & User Interface Specialist\\ 40 40 Kevin Mach & User Interface Specialist\\
\end{tabular} 41 41 \end{tabular}
\end{center} 42 42 \end{center}
\newpage 43 43 \newpage
\tableofcontents 44 44 \tableofcontents
\newpage 45 45 \newpage
\section{Accounts} 46 46 \section{Accounts}
\subsection{[A1] User Registration} 47 47 \subsection{[A1] User Registration}
\begin{description}[style=multiline,leftmargin=3cm] 48 48 \begin{description}[style=multiline,leftmargin=3cm]
\item[Description]{To create and save decks, the system requires the user 49 49 \item[Description]{To create and save decks, the system requires the user
to create an account prior. The user will be able to create an account 50 50 to create an account prior. The user will be able to create an account
through registering.} 51 51 through registering.}
\item[Desired Outcome]{An account will be created for the user from the 52 52 \item[Desired Outcome]{An account will be created for the user from the
specified username, password, email. The user will be able to log into 53 53 specified username, password, email. The user will be able to log into
the aforementioned account.} 54 54 the aforementioned account.}
\\ 55 55 \\
\item[User Goals]{The user shall have an account to participate in the 56 56 \item[User Goals]{The user shall have an account to participate in the
website's activities.} 57 57 website's activities.}
58 58
\item[Primary Actor]{User (student)} 59 59 \item[Primary Actor]{User (student)}
60 60
\item[Dependency Use Cases]{None} 61 61 \item[Dependency Use Cases]{None}
\\ 62 62 \\
\item[Priority Level]{``Must''} 63 63 \item[Priority Level]{``Must''}
64 64
\item[Status]{Not Implemented} 65 65 \item[Status]{Not Implemented}
66 66
\item[Pre-conditions] 67 67 \item[Pre-conditions]
68 68
\item[Post-conditions] 69 69 \item[Post-conditions]
70 70
\begin{itemize} 71 71 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 72 72 \itemsep1pt\parskip0pt\parsep0pt
\item 73 73 \item
{The user has an account registered with the system.} 74 74 {The user has an account registered with the system.}
\end{itemize} 75 75 \end{itemize}
76 76
\item[Trigger]{The user wants to create an account.} 77 77 \item[Trigger]{The user wants to create an account.}
78 78
\item[Workflow] 79 79 \item[Workflow]
80 80
\begin{enumerate} 81 81 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 82 82 \itemsep1pt\parskip0pt\parsep0pt
\item 83 83 \item
{The user shall click the sign up button.} 84 84 {The user shall click the sign up button.}
\item 85 85 \item
{The client renders a registration form and displays it to the user} 86 86 {The client renders a registration form and displays it to the user}
\item 87 87 \item
{The user fills the form} 88 88 {The user fills the form}
\item 89 89 \item
{The client checks that the provided email is not invalid, and that 90 90 {The client checks that the provided email is not invalid, and that
the password is not valid. If anything is not valid, it displays an 91 91 the password is not valid. If anything is not valid, it displays an
error and returns this to the user. } 92 92 error and returns this to the user. }
\item 93 93 \item
{If the form is valid, the client POSTs the form in JSON format to the 94 94 {If the form is valid, the client POSTs the form in JSON format to the
server API at /api/users/me.} 95 95 server API at /api/users/me.}
\item 96 96 \item
{The server deserializes and validates the data. If it's not valid, it 97 97 {The server deserializes and validates the data. If it's not valid, it
returns an error to the client.} 98 98 returns an error to the client.}
\item 99 99 \item
{The server creates a new User object from the provided data, filling 100 100 {The server creates a new User object from the provided data, filling
in the appropriate fields} 101 101 in the appropriate fields}
\item 102 102 \item
{The server saves the user object} 103 103 {The server saves the user object}
\item 104 104 \item
{The server marks the user's email as unverified} 105 105 {The server marks the user's email as unverified}
\item 106 106 \item
{The server sends an email to the user's address with a link to 107 107 {The server sends an email to the user's address with a link to
validate the user's email address.} 108 108 validate the user's email address.}
\item 109 109 \item
{The server responds with success and logs the user in on a new 110 110 {The server responds with success and logs the user in on a new
session for the user. } 111 111 session for the user. }
\item 112 112 \item
{The client reports success to the user and stores the sessionid for 113 113 {The client reports success to the user and stores the sessionid for
future requests.} 114 114 future requests.}
\end{enumerate} 115 115 \end{enumerate}
116 116
{} 117 117 {}
{Verification Workflow:} 118 118 {Verification Workflow:}
119 119
\begin{enumerate} 120 120 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 121 121 \itemsep1pt\parskip0pt\parsep0pt
\item 122 122 \item
{The user receives an email with a link to verify their email. The 123 123 {The user receives an email with a link to verify their email. The
user clicks the link} 124 124 user clicks the link}
\item 125 125 \item
{The client submits the verification code to the server} 126 126 {The client submits the verification code to the server}
\item 127 127 \item
{The server validates the code. If the code is not valid, it returns 128 128 {The server validates the code. If the code is not valid, it returns
an error to the client.} 129 129 an error to the client.}
\item 130 130 \item
{The server marks the user's email as valid and saves the User object 131 131 {The server marks the user's email as valid and saves the User object
again. The user's account is now active} 132 132 again. The user's account is now active}
\item 133 133 \item
{The client reports success. } 134 134 {The client reports success. }
\end{enumerate} 135 135 \end{enumerate}
136 136
\end{description} 137 137 \end{description}
138 138
\newpage 139 139 \newpage
\subsection{\texorpdfstring{{{[}A2{]} User 140 140 \subsection{\texorpdfstring{{{[}A2{]} User
Login}}{{[}A2{]} User Login}} 141 141 Login}}{{[}A2{]} User Login}}
142 142
\begin{description} 143 143 \begin{description}
\item[Description]{User is able to login to personal account.} 144 144 \item[Description]{User is able to login to personal account.}
145 145
\item[Desired Outcome]{The user shall be able to provide their username and 146 146 \item[Desired Outcome]{The user shall be able to provide their username and
password to access their courses and flash cards. The user shall gain 147 147 password to access their courses and flash cards. The user shall gain
access to the list of the courses they have added, and be able to review 148 148 access to the list of the courses they have added, and be able to review
the flash cards they have added to their decks.} 149 149 the flash cards they have added to their decks.}
\\ 150 150 \\
\item[User Goals]{The user wants to resume use of the site on another 151 151 \item[User Goals]{The user wants to resume use of the site on another
device, or use the site after logging out.} 152 152 device, or use the site after logging out.}
153 153
\item[Primary Actor]{User (student)} 154 154 \item[Primary Actor]{User (student)}
155 155
\item[Dependency Use Cases]{{[}A1{]} User Registration} 156 156 \item[Dependency Use Cases]{{[}A1{]} User Registration}
\\ 157 157 \\
\item[Priority Level]{``Must''} 158 158 \item[Priority Level]{``Must''}
159 159
\item[Status]{Not Implemented} 160 160 \item[Status]{Not Implemented}
161 161
\item[Pre-conditions] 162 162 \item[Pre-conditions]
163 163
\begin{itemize} 164 164 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 165 165 \itemsep1pt\parskip0pt\parsep0pt
\item 166 166 \item
{The user has created an account before.} 167 167 {The user has created an account before.}
\end{itemize} 168 168 \end{itemize}
169 169
\item[Post-conditions] 170 170 \item[Post-conditions]
171 171
\begin{itemize} 172 172 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 173 173 \itemsep1pt\parskip0pt\parsep0pt
\item 174 174 \item
{The user can navigate the site and see their data.} 175 175 {The user can navigate the site and see their data.}
\end{itemize} 176 176 \end{itemize}
177 177
\item[Trigger]{The User shall enter their email and password into the Login 178 178 \item[Trigger]{The User shall enter their email and password into the Login
form. The user then submits this information by clicking the ``Login'' 179 179 form. The user then submits this information by clicking the ``Login''
button or pressing the return key.} 180 180 button or pressing the return key.}
181 181
\item[Workflow] 182 182 \item[Workflow]
183 183
\begin{enumerate} 184 184 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 185 185 \itemsep1pt\parskip0pt\parsep0pt
\item 186 186 \item
{api.py verifies that the User has submitted an email and password} 187 187 {The server verifies that the User has submitted an email and password}
\item 188 188 \item
{api.py authenticates the User's email and password and checks if the 189 189 {The server authenticates the User's email and password and checks if the
User is active} 190 190 User is active}
\item 191 191 \item
{api.py logs the User in using the Django login feature} 192 192 {The server logs the User in using the Django login feature}
\item 193 193 \item
{Front-end displays the home page for the User} 194 194 {Front-end displays the home page for the User}
\end{enumerate} 195 195 \end{enumerate}
\end{description} 196 196 \end{description}
\newpage 197 197 \newpage
198 198
\subsection{{[}A3{]} Add a Class} 199 199 \subsection{{[}A3{]} Add a Class}
\begin{description} 200 200 \begin{description}
\item[Description]{The user shall be able to add a class and access the 201 201 \item[Description]{The user shall be able to add a class and access the
flashcards associated with that class.} 202 202 flashcards associated with that class.}
203 203
\item[Desired Outcome]{The class shall be linked with the student's account 204 204 \item[Desired Outcome]{The class shall be linked with the student's account
and the student shall have the ability to read and publish flashcards 205 205 and the student shall have the ability to read and publish flashcards
for this class.} 206 206 for this class.}
\\ 207 207 \\
\item[User Goals]{The user wants to publish flashcards for this class, and 208 208 \item[User Goals]{The user wants to publish flashcards for this class, and
reads the flashcards for this class that are published by other users.} 209 209 reads the flashcards for this class that are published by other users.}
210 210
\item[Primary Actor]{User (student)} 211 211 \item[Primary Actor]{User (student)}
212 212
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 213 213 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 214 214 Login}
\\ 215 215 \\
\item[Priority Level]{``Must''} 216 216 \item[Priority Level]{``Must''}
217 217
\item[Status]{Not implemented} 218 218 \item[Status]{Not implemented}
219 219
\item[Pre-conditions] 220 220 \item[Pre-conditions]
221 221
\begin{itemize} 222 222 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 223 223 \itemsep1pt\parskip0pt\parsep0pt
\item 224 224 \item
{The user has created an account.} 225 225 {The user has created an account.}
\item 226 226 \item
{The user is logged in to his/her account} 227 227 {The user is logged in to his/her account}
\item 228 228 \item
{The user has been whitelisted by the instructor of the class, if 229 229 {The user has been whitelisted by the instructor of the class, if
required.} 230 230 required.}
\end{itemize} 231 231 \end{itemize}
232 232
\item[Post-conditions] 233 233 \item[Post-conditions]
234 234
\begin{itemize} 235 235 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 236 236 \itemsep1pt\parskip0pt\parsep0pt
\item 237 237 \item
{The user can read the flashcards being published for the class and 238 238 {The user can read the flashcards being published for the class and
add them to his/her deck.} 239 239 add them to his/her deck.}
\item 240 240 \item
{The user can publish flashcards to be viewed and added by other users 241 241 {The user can publish flashcards to be viewed and added by other users
in the same class.} 242 242 in the same class.}
\end{itemize} 243 243 \end{itemize}
244 244
\item[Trigger]{The user clicks an ``Add Class'' button to add a class to 245 245 \item[Trigger]{The user clicks an ``Add Class'' button to add a class to
his/her list of ``Enrolled Classes''} 246 246 his/her list of ``Enrolled Classes''}
247 247
\item[Workflow] 248 248 \item[Workflow]
249 249
\begin{enumerate} 250 250 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 251 251 \itemsep1pt\parskip0pt\parsep0pt
\item 252 252 \item
{The client shall show a dialog to search for classes.} 253 253 {The client shall show a dialog to search for classes.}
\item 254 254 \item
{The user begins to type their class name or number} 255 255 {The user begins to type their class name or number}
\item 256 256 \item
{The text box will show suggestions as a user types} 257 257 {The text box will show suggestions as a user types}
\end{enumerate} 258 258 \end{enumerate}
259 259
\begin{itemize} 260 260 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 261 261 \itemsep1pt\parskip0pt\parsep0pt
\item 262 262 \item
{Implementation unspecified at present; need to do further research 263 263 {Implementation unspecified at present; need to do further research
(django-autocomplete-lite?)} 264 264 (django-autocomplete-lite?)}
\end{itemize} 265 265 \end{itemize}
266 266
\begin{enumerate} 267 267 \begin{enumerate}
\setcounter{enumi}{3} 268 268 \setcounter{enumi}{3}
\itemsep1pt\parskip0pt\parsep0pt 269 269 \itemsep1pt\parskip0pt\parsep0pt
\item 270 270 \item
{The user shall select a class by clicking an ``Add Class'' button 271 271 {The user shall select a class by clicking an ``Add Class'' button
associated with a specific class} 272 272 associated with a specific class}
\item 273 273 \item
{The client shall submit a POST request to /api/users/me/sections with 274 274 {The client shall submit a POST request to /api/users/me/sections with
the course ID that they would like to add. } 275 275 the course ID that they would like to add. }
\item 276 276 \item
{The server shall check if there is a whitelist for the class that the 277 277 {The server shall check if there is a whitelist for the class that the
user is trying to add} 278 278 user is trying to add}
\item 279 279 \item
{If there is a whitelist, the server shall check if the user is on the 280 280 {If there is a whitelist, the server shall check if the user is on the
whitelist} 281 281 whitelist}
\item 282 282 \item
{If the class does not have a whitelist or if the user is in the 283 283 {If the class does not have a whitelist or if the user is in the
whitelist for that class, the system shall add the section to the 284 284 whitelist for that class, the system shall add the section to the
user's list of classes. } 285 285 user's list of classes. }
\end{enumerate} 286 286 \end{enumerate}
\end{description} 287 287 \end{description}
{} 288 288 {}
289 289
\newpage 290 290 \newpage
291 291
{} 292 292 {}
293 293
\subsection{\texorpdfstring{{{[}A4{]} }{Drop a 294 294 \subsection{\texorpdfstring{{{[}A4{]} }{Drop a
Class}}{{[}A4{]} Drop a Class}} 295 295 Class}}{{[}A4{]} Drop a Class}}
296 296
\begin{description} 297 297 \begin{description}
\item[Description]{The user can remove themselves from a course he/she is 298 298 \item[Description]{The user can remove themselves from a course he/she is
registered to} 299 299 registered to}
300 300
\item[Desired Outcome]{The user has dropped the class and no longer need 301 301 \item[Desired Outcome]{The user has dropped the class and no longer need
access to the flashcards for said class. This means they can no longer 302 302 access to the flashcards for said class. This means they can no longer
see the flashcards associated to the class that they dropped } 303 303 see the flashcards associated to the class that they dropped }
\\ 304 304 \\
\item[User Goals]{The user shall not have access to a class and the 305 305 \item[User Goals]{The user shall not have access to a class and the
flashcards associated with that class. They will no longer see the class 306 306 flashcards associated with that class. They will no longer see the class
listed in their list of ``Enrolled Classes''} 307 307 listed in their list of ``Enrolled Classes''}
308 308
\item[Primary Actor]{User (student)} 309 309 \item[Primary Actor]{User (student)}
310 310
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 311 311 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 312 312 Login, {[}A3{]} Add a Class}
\\ 313 313 \\
\item[Priority Level]{ ``Should''} 314 314 \item[Priority Level]{ ``Should''}
315 315
\item[Status]{Not Implemented } 316 316 \item[Status]{Not Implemented }
317 317
\item[Pre-conditions] 318 318 \item[Pre-conditions]
319 319
\begin{itemize} 320 320 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 321 321 \itemsep1pt\parskip0pt\parsep0pt
\item 322 322 \item
{User has a valid account.} 323 323 {User has a valid account.}
\item 324 324 \item
{User is logged in.} 325 325 {User is logged in.}
\item 326 326 \item
{User has enrolled in classes.} 327 327 {User has enrolled in classes.}
\end{itemize} 328 328 \end{itemize}
329 329
\item[Post-conditions]{} 330 330 \item[Post-conditions]{}
331 331
\begin{itemize} 332 332 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 333 333 \itemsep1pt\parskip0pt\parsep0pt
\item 334 334 \item
{User shall no longer have access to dropped class, or associated 335 335 {User shall no longer have access to dropped class, or associated
flashcards} 336 336 flashcards}
\end{itemize} 337 337 \end{itemize}
338 338
\item[Trigger]{User clicked button to drop class.} 339 339 \item[Trigger]{User clicked button to drop class.}
340 340
\item[Workflow] 341 341 \item[Workflow]
342 342
\begin{enumerate} 343 343 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 344 344 \itemsep1pt\parskip0pt\parsep0pt
\item 345 345 \item
{The user shall click ``Drop'' (or equivalent) button.} 346 346 {The user shall click ``Drop'' (or equivalent) button.}
\item 347 347 \item
{The client shall display a dialogue box which will say ``Are you 348 348 {The client shall display a dialogue box which will say ``Are you
sure you want to drop this class?''} 349 349 sure you want to drop this class?''}
\item 350 350 \item
{The user shall click ``Yes'' to confirm that they want to drop the 351 351 {The user shall click ``Yes'' to confirm that they want to drop the
class} 352 352 class}
\item 353 353 \item
{The client shall submit a DELETE request to 354 354 {The client shall submit a DELETE request to
/api/users/me/sections/\textless{}section ID number\textgreater{}.} 355 355 /api/users/me/sections/\textless{}section ID number\textgreater{}.}
\item 356 356 \item
{If the user is not already enrolled in the section, the server will 357 357 {If the user is not already enrolled in the section, the server will
return a 404 Not Found error, which the client shall handle. (The 358 358 return a 404 Not Found error, which the client shall handle. (The
client should not show an error to the user)} 359 359 client should not show an error to the user)}
\item 360 360 \item
{The server shall remove the selected class from a user's list of 361 361 {The server shall remove the selected class from a user's list of
classes. } 362 362 classes. }
\item 363 363 \item
{The server shall return success to the client} 364 364 {The server shall return success to the client}
\end{enumerate} 365 365 \end{enumerate}
\end{description} 366 366 \end{description}
\newpage 367 367 \newpage
368 368
{} 369 369 {}
370 370
\subsection{\texorpdfstring{{{[}A5{]} Password 371 371 \subsection{\texorpdfstring{{{[}A5{]} Password
change}}{{[}A5{]} Password change}} 372 372 change}}{{[}A5{]} Password change}}
373 373
\begin{description} 374 374 \begin{description}
\item[Description]{The user shall be able to change the password for their 375 375 \item[Description]{The user shall be able to change the password for their
account in the account settings. This requires that they are logged in. 376 376 account in the account settings. This requires that they are logged in.
} 377 377 }
378 378
\item[Desired Outcome]{The user's password shall be changed and the user 379 379 \item[Desired Outcome]{The user's password shall be changed and the user
shall be able to log in with the new password in the future} 380 380 shall be able to log in with the new password in the future}
\\\\ 381 381 \\\\
\item[User Goals]{The user wants to use a different password in the future} 382 382 \item[User Goals]{The user wants to use a different password in the future}
383 383
\item[Primary Actor]{User (student)} 384 384 \item[Primary Actor]{User (student)}
385 385
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 386 386 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 387 387 Login}
\\ 388 388 \\
\item[Details]{The user provides their current password and a new password 389 389 \item[Details]{The user provides their current password and a new password
in a form. If the current password is correct, the system updates their 390 390 in a form. If the current password is correct, the system updates their
password to the requested new password.} 391 391 password to the requested new password.}
392 392
\item[Priority Level]{``Must''} 393 393 \item[Priority Level]{``Must''}
394 394
\item[Status]{Not }{implemented} 395 395 \item[Status]{Not }{implemented}
396 396
\item[Pre-conditions] 397 397 \item[Pre-conditions]
398 398
\begin{itemize} 399 399 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 400 400 \itemsep1pt\parskip0pt\parsep0pt
\item 401 401 \item
{The user has created an account} 402 402 {The user has created an account}
\item 403 403 \item
{The user has logged in } 404 404 {The user has logged in }
\item 405 405 \item
{The user knows their current password} 406 406 {The user knows their current password}
\end{itemize} 407 407 \end{itemize}
408 408
\item[Post-conditions] 409 409 \item[Post-conditions]
410 410
\begin{itemize} 411 411 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 412 412 \itemsep1pt\parskip0pt\parsep0pt
\item 413 413 \item
{The user's password is changed} 414 414 {The user's password is changed}
\item 415 415 \item
{The user can log in with the new password} 416 416 {The user can log in with the new password}
\end{itemize} 417 417 \end{itemize}
418 418
\item[Trigger]{User clicks ``Change Password'' button in Accounts page} 419 419 \item[Trigger]{User clicks ``Change Password'' button in Accounts page}
420 420
\item[Workflow] 421 421 \item[Workflow]
422 422
\begin{enumerate} 423 423 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 424 424 \itemsep1pt\parskip0pt\parsep0pt
\item 425 425 \item
{The user shall press the ``Change Password'' button} 426 426 {The user shall press the ``Change Password'' button}
\item 427 427 \item
{The client shall render a form that requires the user to enter their 428 428 {The client shall render a form that requires the user to enter their
old password and new password} 429 429 old password and new password}
\item 430 430 \item
{The user shall enter their current password and the desired new 431 431 {The user shall enter their current password and the desired new
password} 432 432 password}
\item 433 433 \item
{The client shall verify that no fields are blank} 434 434 {The client shall verify that no fields are blank}
\item 435 435 \item
{The client shall submit the data to the server by sending a PATCH 436 436 {The client shall submit the data to the server by sending a PATCH
request to /api/users/me containing ``old\_password'' and 437 437 request to /api/users/me containing ``old\_password'' and
``new\_password'' values.} 438 438 ``new\_password'' values.}
\item 439 439 \item
{The server shall validate the pre-existing password} 440 440 {The server shall validate the pre-existing password}
\item 441 441 \item
{If server cannot validate the pre-existing password, the client will 442 442 {If server cannot validate the pre-existing password, the client will
render the same form with a message informing the user that the 443 443 render the same form with a message informing the user that the
pre-existing password that they have provided is incorrect} 444 444 pre-existing password that they have provided is incorrect}
\item 445 445 \item
{If the server successfully validates the pre-existing password, the 446 446 {If the server successfully validates the pre-existing password, the
system shall change the user's password} 447 447 system shall change the user's password}
\item 448 448 \item
{The client shall return a success to the user} 449 449 {The client shall return a success to the user}
\end{enumerate} 450 450 \end{enumerate}
\end{description} 451 451 \end{description}
{} 452 452 {}
453 453
\newpage 454 454 \newpage
455 455
{} 456 456 {}
457 457
\subsection{\texorpdfstring{{{[}A6{]} Password reset 458 458 \subsection{\texorpdfstring{{{[}A6{]} Password reset
}}{{[}A6{]} Password reset }} 459 459 }}{{[}A6{]} Password reset }}
460 460
\begin{description} 461 461 \begin{description}
\item[Description]{The user shall be able to reset their password without 462 462 \item[Description]{The user shall be able to reset their password without
being logged in } 463 463 being logged in }
464 464
\item[Desired Outcome]{The user's password shall be changed to one that 465 465 \item[Desired Outcome]{The user's password shall be changed to one that
they remember} 466 466 they remember}
\\ 467 467 \\
\item[User Goals]{The user does not know their current password but wants 468 468 \item[User Goals]{The user does not know their current password but wants
to log into the site} 469 469 to log into the site}
470 470
\item[Primary Actor]{User (student)} 471 471 \item[Primary Actor]{User (student)}
472 472
\item[Dependency Use Cases]{{[}A1{]} User Registration} 473 473 \item[Dependency Use Cases]{{[}A1{]} User Registration}
\\ 474 474 \\
\item[Details]{The user provides their email in a password reset form. If 475 475 \item[Details]{The user provides their email in a password reset form. If
the address is valid, the site sends a password reset link with a random 476 476 the address is valid, the site sends a password reset link with a random
token to that address. If the address is invalid, the site does not send 477 477 token to that address. If the address is invalid, the site does not send
a link. For security reasons, we do not reveal to the user whether the 478 478 a link. For security reasons, we do not reveal to the user whether the
email address was valid, and we expire the link after 24 hours. When a 479 479 email address was valid, and we expire the link after 24 hours. When a
user visits the link emailed to them, they are able to specify a new 480 480 user visits the link emailed to them, they are able to specify a new
password in a form. When they submit the form, their password is updated 481 481 password in a form. When they submit the form, their password is updated
if the token is correct. } 482 482 if the token is correct. }
483 483
\item[Priority Level]{``Must''} 484 484 \item[Priority Level]{``Must''}
485 485
\item[Status]{Not i}{mplemented} 486 486 \item[Status]{Not i}{mplemented}
487 487
\item[Pre-conditions] 488 488 \item[Pre-conditions]
489 489
\begin{itemize} 490 490 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 491 491 \itemsep1pt\parskip0pt\parsep0pt
\item 492 492 \item
{The user has created an account before} 493 493 {The user has created an account before}
\item 494 494 \item
{The user knows the email address attached to their account} 495 495 {The user knows the email address attached to their account}
\end{itemize} 496 496 \end{itemize}
497 497
\item[Post-conditions] 498 498 \item[Post-conditions]
499 499
\begin{itemize} 500 500 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 501 501 \itemsep1pt\parskip0pt\parsep0pt
\item 502 502 \item
{The user's password is changed} 503 503 {The user's password is changed}
\item 504 504 \item
{The user can log in with the new password} 505 505 {The user can log in with the new password}
\end{itemize} 506 506 \end{itemize}
507 507
\item[Trigger]{User clicks ``Forgot Password'' button on the login page} 508 508 \item[Trigger]{User clicks ``Forgot Password'' button on the login page}
509 509
\item[Workflow, requesting password reset] 510 510 \item[Workflow, requesting password reset]
511 511
\begin{enumerate} 512 512 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 513 513 \itemsep1pt\parskip0pt\parsep0pt
\item 514 514 \item
{The user shall click ``Forgot Password'' (or equivalent) button} 515 515 {The user shall click ``Forgot Password'' (or equivalent) button}
\item 516 516 \item
{The client shall prompt the user for their current email} 517 517 {The client shall prompt the user for their current email}
\item 518 518 \item
{The user shall submit their email address} 519 519 {The user shall submit their email address}
\item 520 520 \item
{The client shall validate that the email address is formatted 521 521 {The client shall validate that the email address is formatted
correctly} 522 522 correctly}
\item 523 523 \item
{The client shall submit the email address to the server in a POST 524 524 {The client shall submit the email address to the server in a POST
request to /api/reset\_password with an ``email'' value} 525 525 request to /api/reset\_password with an ``email'' value}
\item 526 526 \item
{The server shall check if an account exists with the email entered by 527 527 {The server shall check if an account exists with the email entered by
the user} 528 528 the user}
\item 529 529 \item
{If no such account exists, the server shall return an error to the 530 530 {If no such account exists, the server shall return an error to the
frontend, which will display it to the user} 531 531 frontend, which will display it to the user}
\item 532 532 \item
{If the account does exist, the server will:} 533 533 {If the account does exist, the server will:}
\end{enumerate} 534 534 \end{enumerate}
535 535
\begin{enumerate} 536 536 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 537 537 \itemsep1pt\parskip0pt\parsep0pt
\item 538 538 \item
{Create a new password reset token for the user} 539 539 {Create a new password reset token for the user}
\item 540 540 \item
{Send an email to the user with a link containing the token and the 541 541 {Send an email to the user with a link containing the token and the
user's ID} 542 542 user's ID}
\end{enumerate} 543 543 \end{enumerate}
544 544
\item[Workflow, resetting password] 545 545 \item[Workflow, resetting password]
546 546
\begin{enumerate} 547 547 \begin{enumerate}
\setcounter{enumi}{8} 548 548 \setcounter{enumi}{8}
\itemsep1pt\parskip0pt\parsep0pt 549 549 \itemsep1pt\parskip0pt\parsep0pt
\item 550 550 \item
{The user shall click the link in the email and visit 551 551 {The user shall click the link in the email and visit
/app/password\_reset} 552 552 /app/password\_reset}
\item 553 553 \item
{The client shall render a form that will prompt the user for a new 554 554 {The client shall render a form that will prompt the user for a new
password} 555 555 password}
\item 556 556 \item
{The user shall provide a new password in the form} 557 557 {The user shall provide a new password in the form}
\item 558 558 \item
{The client shall submit the password to the server} 559 559 {The client shall submit the password to the server}
\item 560 560 \item
{If the user tries to submit without a password in the text field, the 561 561 {If the user tries to submit without a password in the text field, the
client shall display a message saying ``Password cannot be blank.''} 562 562 client shall display a message saying ``Password cannot be blank.''}
\item 563 563 \item
{The server first verifies that the token is valid for the user} 564 564 {The server first verifies that the token is valid for the user}
\item 565 565 \item
{The server then verifies that the user's new password is non-blank} 566 566 {The server then verifies that the user's new password is non-blank}
\item 567 567 \item
{If neither of the above verifications fail, the server shall change 568 568 {If neither of the above verifications fail, the server shall change
the password associated with the user's email. } 569 569 the password associated with the user's email. }
\end{enumerate} 570 570 \end{enumerate}
\end{description} 571 571 \end{description}
\newpage 572 572 \newpage
573 573
{} 574 574 {}
575 575
\subsection{\texorpdfstring{{{[}A7{]} Limit Student Access to Courses 576 576 \subsection{\texorpdfstring{{{[}A7{]} Limit Student Access to Courses
}}{{[}A7{]} Limit Student Access to Courses }} 577 577 }}{{[}A7{]} Limit Student Access to Courses }}
578 578
\begin{description} 579 579 \begin{description}
\item[Description]{The instructor shall be able to limit access to the 580 580 \item[Description]{The instructor shall be able to limit access to the
courses that he is in charge of by whitelisting only those students that 581 581 courses that he is in charge of by whitelisting only those students that
are actually in the class.} 582 582 are actually in the class.}
583 583
\item[Desired Outcome]{The class will have limited access and only those 584 584 \item[Desired Outcome]{The class will have limited access and only those
users who are whitelisted may enroll in the class.} 585 585 users who are whitelisted may enroll in the class.}
\\ 586 586 \\
\item[User Goals]{The instructor wants to limit access to his class so only 587 587 \item[User Goals]{The instructor wants to limit access to his class so only
the students who are actually in his class participate, and nobody 588 588 the students who are actually in his class participate, and nobody
else.} 589 589 else.}
590 590
{Primary Actor: }{User (instructor)} 591 591 {Primary Actor: }{User (instructor)}
592 592
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 593 593 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login} 594 594 Login}
\\ 595 595 \\
\item[Priority Level]{``Should''} 596 596 \item[Priority Level]{``Should''}
597 597
\item[Status]{Not Implemented} 598 598 \item[Status]{Not Implemented}
599 599
\item[Pre-conditions] 600 600 \item[Pre-conditions]
601 601
\begin{itemize} 602 602 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 603 603 \itemsep1pt\parskip0pt\parsep0pt
\item 604 604 \item
{User has valid instructor's account} 605 605 {User has valid instructor's account}
\end{itemize} 606 606 \end{itemize}
607 607
\item[Post-conditions] 608 608 \item[Post-conditions]
609 609
\begin{itemize} 610 610 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 611 611 \itemsep1pt\parskip0pt\parsep0pt
\item 612 612 \item
{Only those users who were whitelisted may add the class.} 613 613 {Only those users who were whitelisted may add the class.}
\end{itemize} 614 614 \end{itemize}
615 615
\item[Trigger]{The instructor emails the administrator and requests to 616 616 \item[Trigger]{The instructor emails the administrator and requests to
limit access to his class.} 617 617 limit access to his class.}
618 618
\item[Workflow] 619 619 \item[Workflow]
620 620
\begin{enumerate} 621 621 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 622 622 \itemsep1pt\parskip0pt\parsep0pt
\item 623 623 \item
{The instructor emails the administrators from his UCSD email address 624 624 {The instructor emails the administrators from his UCSD email address
and requests to limit access to his course. He provides a list of 625 625 and requests to limit access to his course. He provides a list of
emails of the students that are to be whitelisted.} 626 626 emails of the students that are to be whitelisted.}
\item 627 627 \item
{The administrators visit a custom admin page, select the course, and 628 628 {The administrators visit a custom admin page, select the course, and
paste the list of emails. They submit the page directly (no separate 629 629 paste the list of emails. They submit the page directly (no separate
frontend here) to the server.} 630 630 frontend here) to the server.}
\item 631 631 \item
{The server shall create a WhitelistedAddress for each provided email, 632 632 {The server shall create a WhitelistedAddress for each provided email,
attaching it to the section taught by the instructor.} 633 633 attaching it to the section taught by the instructor.}
\item 634 634 \item
{The server shall add any existing users whose email addresses appear 635 635 {The server shall add any existing users whose email addresses appear
in the whitelist to the class. } 636 636 in the whitelist to the class. }
\end{enumerate} 637 637 \end{enumerate}
\end{description} 638 638 \end{description}
\newpage 639 639 \newpage
640 640
\subsection{\texorpdfstring{{{[}A8{]} User 641 641 \subsection{\texorpdfstring{{{[}A8{]} User
Logout}}{{[}A8{]} User Logout}} 642 642 Logout}}{{[}A8{]} User Logout}}
643 643
\begin{description} 644 644 \begin{description}
\item[Description]{The user shall be able to log out of his/her account on 645 645 \item[Description]{The user shall be able to log out of his/her account on
the site.} 646 646 the site.}
647 647
\item[Desired Outcome]{The user's information and data will no longer be 648 648 \item[Desired Outcome]{The user's information and data will no longer be
accessible after logging out. } 649 649 accessible after logging out. }
\\ 650 650 \\
\item[User Goals]{The user is done with his/her session of using the 651 651 \item[User Goals]{The user is done with his/her session of using the
website, and wants to make sure others cannot access the data in his/her 652 652 website, and wants to make sure others cannot access the data in his/her
account.} 653 653 account.}
654 654
\item[Primary Actor]{User (student)} 655 655 \item[Primary Actor]{User (student)}
656 656
\item[Dependency Use Cases] None 657 657 \item[Dependency Use Cases] None
\\ 658 658 \\
\item[Priority Level]{``Must''} 659 659 \item[Priority Level]{``Must''}
660 660
\item[Status]{Implemented} 661 661 \item[Status]{Implemented}
662 662
\item[Pre-conditions]{The user is logged into their account} 663 663 \item[Pre-conditions]{The user is logged into their account}
664 664
\item[Post-conditions]{}{The user's data can no longer be accessed.} 665 665 \item[Post-conditions]{}{The user's data can no longer be accessed.}
666 666
\item[Trigger]{User clicks ``Logout'' button} 667 667 \item[Trigger]{User clicks ``Logout'' button}
668 668
\item[Workflow] 669 669 \item[Workflow]
670 670
\begin{enumerate} 671 671 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 672 672 \itemsep1pt\parskip0pt\parsep0pt
\item 673 673 \item
{api.py logs the User out using the Django logout feature} 674 674 {The server logs the User out using the Django logout feature}
\item 675 675 \item
{Front-end displays application login page} 676 676 {Front-end displays application login page}
\end{enumerate} 677 677 \end{enumerate}
678 678
\end{description} 679 679 \end{description}
680 680
\newpage 681 681 \newpage
682 682
683 683
684 684
\subsection{\texorpdfstring{{{[}A9{]} Contact 685 685 \subsection{\texorpdfstring{{{[}A9{]} Contact
Admin}}{{[}A9{]} Contact Admin}} 686 686 Admin}}{{[}A9{]} Contact Admin}}
687 687
\begin{description} 688 688 \begin{description}
\item[Description]{The user shall be able to contact the admin.} 689 689 \item[Description]{The user shall be able to contact the admin.}
690 690
\item[Desired Outcome]{The user shall send a message to the admin; the 691 691 \item[Desired Outcome]{The user shall send a message to the admin; the
admin shall receive the message.} 692 692 admin shall receive the message.}
693 693
{User Goals:}{The user sends a message to the admin.} 694 694 {User Goals:}{The user sends a message to the admin.}
695 695
\item[Primary Actor]{User} 696 696 \item[Primary Actor]{User}
697 697
\item[Dependency Use Cases]{None} 698 698 \item[Dependency Use Cases]{None}
\\ 699 699 \\
\item[Priority Level]{``Must''} 700 700 \item[Priority Level]{``Must''}
701 701
\item[Status]{Not implemented} 702 702 \item[Status]{Not implemented}
703 703
\item[Pre-conditions]{None.} 704 704 \item[Pre-conditions]{None.}
705 705
\item[Post-conditions]{The admin receives the user's message.} 706 706 \item[Post-conditions]{The admin receives the user's message.}
707 707
\item[Trigger]{User has navigated to our website. } 708 708 \item[Trigger]{User has navigated to our website. }
709 709
\item[Workflow] 710 710 \item[Workflow]
711 711
\begin{enumerate} 712 712 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 713 713 \itemsep1pt\parskip0pt\parsep0pt
\item 714 714 \item
{The frontend displays the admin email address on every page in the 715 715 {The frontend displays the admin email address on every page in the
application.} 716 716 application.}
\end{enumerate} 717 717 \end{enumerate}
\end{description} 718 718 \end{description}
\newpage 719 719 \newpage
720 720
{} 721 721 {}
\section{Flashcards} 722 722 \section{Flashcards}
\subsection{\texorpdfstring{{{[}F1{]} Push Flashcard 723 723 \subsection{\texorpdfstring{{{[}F1{]} Push Flashcard
}}{{[}F1{]} Push Flashcard }} 724 724 }}{{[}F1{]} Push Flashcard }}
725 725
\begin{description} 726 726 \begin{description}
\item[Description]{The user shall be able to create a flashcard with their 727 727 \item[Description]{The user shall be able to create a flashcard with their
input. } 728 728 input. }
729 729
\item[Desired Outcome]{The user shall have the flashcard added to their own 730 730 \item[Desired Outcome]{The user shall have the flashcard added to their own
deck and the Live Feed. } 731 731 deck and the Live Feed. }
\\ 732 732 \\
\item[User Goals]{The user will see their flashcard in their deck and the 733 733 \item[User Goals]{The user will see their flashcard in their deck and the
flashcard will be shared with others. } 734 734 flashcard will be shared with others. }
735 735
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 736 736 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 737 737 Login, {[}A3{]} Add a Class}
\\ 738 738 \\
\item[Pre-conditions] 739 739 \item[Pre-conditions]
740 740
\begin{itemize} 741 741 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 742 742 \itemsep1pt\parskip0pt\parsep0pt
\item 743 743 \item
{The User has an account } 744 744 {The User has an account }
\item 745 745 \item
{The User has added at least one class} 746 746 {The User has added at least one class}
\item 747 747 \item
{The User is on the class' page} 748 748 {The User is on the class' page}
\end{itemize} 749 749 \end{itemize}
750 750
\item[Post-conditions] 751 751 \item[Post-conditions]
752 752
\begin{itemize} 753 753 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 754 754 \itemsep1pt\parskip0pt\parsep0pt
\item 755 755 \item
{The User has flashcard added to their deck} 756 756 {The User has flashcard added to their deck}
\item 757 757 \item
{The Flashcard is shown in the Live Feed} 758 758 {The Flashcard is shown in the Live Feed}
\item 759 759 \item
{Other users can add this flashcard to their decks} 760 760 {Other users can add this flashcard to their decks}
\end{itemize} 761 761 \end{itemize}
762 762
\item[Trigger]{} 763 763 \item[Trigger]{}
764 764
\begin{itemize} 765 765 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 766 766 \itemsep1pt\parskip0pt\parsep0pt
\item 767 767 \item
{The User has clicked on the button ``Make New Flashcard''.} 768 768 {The User has clicked on the button ``Make New Flashcard''.}
\item 769 769 \item
{The Server receives a POST request containing the flashcard data.} 770 770 {The Server receives a POST request containing the flashcard data.}
\end{itemize} 771 771 \end{itemize}
772 772
\item[Workflow] 773 773 \item[Workflow]
774 774
\begin{enumerate} 775 775 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 776 776 \itemsep1pt\parskip0pt\parsep0pt
\item 777 777 \item
{The User is at the live feed for the class.} 778 778 {The User is at the live feed for the class.}
\item 779 779 \item
{The User shall click on the button}{Push 780 780 {The User shall click on the button}{Push
Flashcard} 781 781 Flashcard}
\item 782 782 \item
{The 783 783 {The
}{Client}{shall 784 784 }{Client}{shall
present a dialog box for inputting the flashcard text to the User.} 785 785 present a dialog box for inputting the flashcard text to the User.}
\item 786 786 \item
{The User shall input the flashcard text.} 787 787 {The User shall input the flashcard text.}
\item 788 788 \item
{Optionally, the User shall mark keywords in the flashcard text.} 789 789 {Optionally, the User shall mark keywords in the flashcard text.}
\item 790 790 \item
{If the User creates this flashcard outside of the lecture time, he 791 791 {If the User creates this flashcard outside of the lecture time, he
will get the option to change the material date.} 792 792 will get the option to change the material date.}
\item 793 793 \item
{The User shall click on the `Submit' button to submit the flashcard 794 794 {The User shall click on the `Submit' button to submit the flashcard
text, blanks, and material date, in JSON form as a POST request.} 795 795 text, blanks, and material date, in JSON form as a POST request.}
\item 796 796 \item
{The Server shall obtain the flashcard information by deserializing 797 797 {The Server shall obtain the flashcard information by deserializing
the JSON in the POST request.} 798 798 the JSON in the POST request.}
\item 799 799 \item
{The Server shall create a new record for this flashcard in the 800 800 {The Server shall create a new record for this flashcard in the
Flashcards table in the database.} 801 801 Flashcards table in the database.}
\item 802 802 \item
{The Server shall publish the newly created card to the live feed of 803 803 {The Server shall publish the newly created card to the live feed of
the class.} 804 804 the class.}
\end{enumerate} 805 805 \end{enumerate}
\end{description} 806 806 \end{description}
{Alternative Workflow:} 807 807 {Alternative Workflow:}
808 808
\begin{enumerate} 809 809 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 810 810 \itemsep1pt\parskip0pt\parsep0pt
\item 811 811 \item
{The User shall view a flashcard that he/she did not create} 812 812 {The User shall view a flashcard that he/she did not create}
\item 813 813 \item
{The User shall click ``Edit''} 814 814 {The User shall click ``Edit''}
\item 815 815 \item
{The client shall present a dialog box for editing the existing 816 816 {The client shall present a dialog box for editing the existing
flashcard text} 817 817 flashcard text}
\item 818 818 \item
{The User shall make edits} 819 819 {The User shall make edits}
\item 820 820 \item
{The User shall click ``save''} 821 821 {The User shall click ``save''}
\item 822 822 \item
{The client shall send a POST request} 823 823 {The client shall send a POST request}
\item 824 824 \item
{The server shall remove the original card from user's deck} 825 825 {The server shall remove the original card from user's deck}
\item 826 826 \item
{The Server shall obtain the flashcard information by deserializing 827 827 {The Server shall obtain the flashcard information by deserializing
the JSON in the POST request.} 828 828 the JSON in the POST request.}
\item 829 829 \item
{The Server shall create a new record for this flashcard in the 830 830 {The Server shall create a new record for this flashcard in the
Flashcards table in the database.} 831 831 Flashcards table in the database.}
\item 832 832 \item
{The Server shall publish the newly created card to the live feed of 833 833 {The Server shall publish the newly created card to the live feed of
the class.} 834 834 the class.}
\end{enumerate} 835 835 \end{enumerate}
836 836
\newpage 837 837 \newpage
838 838
{} 839 839 {}
840 840
\subsection{\texorpdfstring{{{[}F2{]} Edit 841 841 \subsection{\texorpdfstring{{{[}F2{]} Edit
Flashcard}}{{[}F2{]} Edit Flashcard}} 842 842 Flashcard}}{{[}F2{]} Edit Flashcard}}
843 843
\begin{description} 844 844 \begin{description}
\item[Description]{The user shall be able to edit the text on their own 845 845 \item[Description]{The user shall be able to edit the text on their own
flashcard } 846 846 flashcard }
847 847
\item[Desired Outcome]{Flashcard is edited and saved appropriately} 848 848 \item[Desired Outcome]{Flashcard is edited and saved appropriately}
\\ 849 849 \\
\item[User Goals]{To be able to change text on a flashcard} 850 850 \item[User Goals]{To be able to change text on a flashcard}
851 851
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 852 852 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull 853 853 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull
Flashcard} 854 854 Flashcard}
855 855
\item[Pre-conditions] 856 856 \item[Pre-conditions]
857 857
\begin{itemize} 858 858 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 859 859 \itemsep1pt\parskip0pt\parsep0pt
\item 860 860 \item
{Flashcard is created} 861 861 {Flashcard is created}
\item 862 862 \item
{Flashcard in user's deck} 863 863 {Flashcard in user's deck}
\item 864 864 \item
{Flashcard is viewable} 865 865 {Flashcard is viewable}
\end{itemize} 866 866 \end{itemize}
867 867
\item[Post-conditions] 868 868 \item[Post-conditions]
869 869
\begin{itemize} 870 870 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 871 871 \itemsep1pt\parskip0pt\parsep0pt
\item 872 872 \item
{Flashcard is edited} 873 873 {Flashcard is edited}
\end{itemize} 874 874 \end{itemize}
875 875
\item[Trigger]{User has clicked ``Edit'' button when viewing a specific 876 876 \item[Trigger]{User has clicked ``Edit'' button when viewing a specific
flashcard} 877 877 flashcard}
878 878
\item[Workflow] 879 879 \item[Workflow]
880 880
\begin{enumerate} 881 881 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 882 882 \itemsep1pt\parskip0pt\parsep0pt
\item 883 883 \item
{The user shall view their deck} 884 884 {The user shall view their deck}
\item 885 885 \item
{The client shall present user with a grid view of cards in 886 886 {The client shall present user with a grid view of cards in
chronological creation order} 887 887 chronological creation order}
\item 888 888 \item
{The user shall select a flashcard and click `Edit'} 889 889 {The user shall select a flashcard and click `Edit'}
\item 890 890 \item
{The client shall produce an editable dialog box containing flashcard 891 891 {The client shall produce an editable dialog box containing flashcard
text} 892 892 text}
\item 893 893 \item
{The user shall make desired changes} 894 894 {The user shall make desired changes}
\item 895 895 \item
{The user shall click `Save'} 896 896 {The user shall click `Save'}
\item 897 897 \item
{The client shall generate a POST request for a new flashcard and send 898 898 {The client shall generate a POST request for a new flashcard and send
it to the server} 899 899 it to the server}
\item 900 900 \item
{If the user changed only the blanks of the cards, the server shall 901 901 {If the user changed only the blanks of the cards, the server shall
create a new FlashcardMask object and update the appropriate 902 902 create a new FlashcardMask object and update the appropriate
UserFlashcard object with a reference to it.} 903 903 UserFlashcard object with a reference to it.}
\item 904 904 \item
{If the user changed the text of the card, the server will instead:} 905 905 {If the user changed the text of the card, the server will instead:}
\end{enumerate} 906 906 \end{enumerate}
907 907
\begin{enumerate} 908 908 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 909 909 \itemsep1pt\parskip0pt\parsep0pt
\item 910 910 \item
{create a new flashcard for the section} 911 911 {create a new flashcard for the section}
\item 912 912 \item
{push it to the feed} 913 913 {push it to the feed}
\item 914 914 \item
{add it to the user's deck} 915 915 {add it to the user's deck}
\item 916 916 \item
{hide the old card from the user} 917 917 {hide the old card from the user}
\item 918 918 \item
{and return the new card to the user} 919 919 {and return the new card to the user}
\end{enumerate} 920 920 \end{enumerate}
\end{description} 921 921 \end{description}
{} 922 922 {}
923 923
\newpage 924 924 \newpage
925 925
{} 926 926 {}
927 927
\subsection{\texorpdfstring{{{[}F3{]} Pull 928 928 \subsection{\texorpdfstring{{{[}F3{]} Pull
Flashcard}}{{[}F3{]} Pull Flashcard}} 929 929 Flashcard}}{{[}F3{]} Pull Flashcard}}
\begin{description} 930 930 \begin{description}
\item[Description]{The User shall be able to add flash cards to their own 931 931 \item[Description]{The User shall be able to add flash cards to their own
deck from the Live Feed. } 932 932 deck from the Live Feed. }
933 933
\item[Desired Outcome]{The User shall have the flashcard added to their own 934 934 \item[Desired Outcome]{The User shall have the flashcard added to their own
deck } 935 935 deck }
\\ 936 936 \\
\item[User Goals]{The user will be able to review that flashcard. } 937 937 \item[User Goals]{The user will be able to review that flashcard. }
938 938
\item[Primary Actor]{User (student)} 939 939 \item[Primary Actor]{User (student)}
940 940
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 941 941 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashard} 942 942 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashard}
\\ 943 943 \\
\item[Priority Level]{``Must'' } 944 944 \item[Priority Level]{``Must'' }
945 945
\item[Status]{Not Implemented} 946 946 \item[Status]{Not Implemented}
947 947
\item[Pre-conditions] 948 948 \item[Pre-conditions]
949 949
\begin{itemize} 950 950 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 951 951 \itemsep1pt\parskip0pt\parsep0pt
\item 952 952 \item
{Flashcard has been created } 953 953 {Flashcard has been created }
\item 954 954 \item
{That flashcard is in the Live Feed} 955 955 {That flashcard is in the Live Feed}
\end{itemize} 956 956 \end{itemize}
957 957
\item[Post-conditions] 958 958 \item[Post-conditions]
959 959
\begin{itemize} 960 960 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 961 961 \itemsep1pt\parskip0pt\parsep0pt
\item 962 962 \item
{User shall have that flashcard added to their deck} 963 963 {User shall have that flashcard added to their deck}
\item 964 964 \item
{User can review this flashcard later} 965 965 {User can review this flashcard later}
\end{itemize} 966 966 \end{itemize}
967 967
\item[Trigger]{User has clicked on the flashcard in the Live Feed.} 968 968 \item[Trigger]{User has clicked on the flashcard in the Live Feed.}
969 969
\item[Workflow] 970 970 \item[Workflow]
971 971
\begin{enumerate} 972 972 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 973 973 \itemsep1pt\parskip0pt\parsep0pt
\item 974 974 \item
{The User is in the Live Feed.} 975 975 {The User is in the Live Feed.}
\item 976 976 \item
{User shall click on the ``Pull Flashcard'' button on a Flashcard in 977 977 {User shall click on the ``Pull Flashcard'' button on a Flashcard in
the Feed.} 978 978 the Feed.}
\item 979 979 \item
{The Client shall make the pulled Flashcard disappear from the Live 980 980 {The Client shall make the pulled Flashcard disappear from the Live
Feed} 981 981 Feed}
\item 982 982 \item
{The Client shall make the pulled Flashcard appear in the User's Deck 983 983 {The Client shall make the pulled Flashcard appear in the User's Deck
on the sidebar.} 984 984 on the sidebar.}
\item 985 985 \item
{The Client shall submit a POST request to 986 986 {The Client shall submit a POST request to
/api/flashcards/\textless{}flashcard id\textgreater{}/pull} 987 987 /api/flashcards/\textless{}flashcard id\textgreater{}/pull}
\item 988 988 \item
{The server shall create a UserFlashcard object to represent that the 989 989 {The server shall create a UserFlashcard object to represent that the
user's deck contains the card.} 990 990 user's deck contains the card.}
\item 991 991 \item
{The server shall notify connected clients about the new card rating, 992 992 {The server shall notify connected clients about the new card rating,
if any} 993 993 if any}
\item 994 994 \item
{Connected clients will take the new rating into account when next 995 995 {Connected clients will take the new rating into account when next
rearranging the feed.} 996 996 rearranging the feed.}
\end{enumerate} 997 997 \end{enumerate}
\end{description} 998 998 \end{description}
\newpage 999 999 \newpage
1000 1000
{} 1001 1001 {}
1002 1002
\subsection{\texorpdfstring{{{[}F4{]} Flag Inappropriate 1003 1003 \subsection{\texorpdfstring{{{[}F4{]} Flag Inappropriate
Cards}}{{[}F4{]} Flag Inappropriate Cards}} 1004 1004 Cards}}{{[}F4{]} Flag Inappropriate Cards}}
1005 1005
\begin{description} 1006 1006 \begin{description}
\item[Description]{Cards may be flagged indicating inappropriate content} 1007 1007 \item[Description]{Cards may be flagged indicating inappropriate content}
1008 1008
\item[Desired Outcome]{The flashcard's inappropriateness variable is 1009 1009 \item[Desired Outcome]{The flashcard's inappropriateness variable is
adjusted} 1010 1010 adjusted}
\\ 1011 1011 \\
\item[User Goals]{To note if a card should not belong in the class and 1012 1012 \item[User Goals]{To note if a card should not belong in the class and
should not be displayed in the feed} 1013 1013 should not be displayed in the feed}
1014 1014
\item[Primary Actor]{User (Student)} 1015 1015 \item[Primary Actor]{User (Student)}
1016 1016
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1017 1017 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1018 1018 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1019 1019 \\
\item[Priority Level]{``Should''} 1020 1020 \item[Priority Level]{``Should''}
1021 1021
\item[Status]{Unimplemented} 1022 1022 \item[Status]{Unimplemented}
1023 1023
\item[Pre-conditions] 1024 1024 \item[Pre-conditions]
1025 1025
\begin{itemize} 1026 1026 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1027 1027 \itemsep1pt\parskip0pt\parsep0pt
\item 1028 1028 \item
{User is enrolled in a class} 1029 1029 {User is enrolled in a class}
\end{itemize} 1030 1030 \end{itemize}
1031 1031
\begin{itemize} 1032 1032 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1033 1033 \itemsep1pt\parskip0pt\parsep0pt
\item 1034 1034 \item
{Flashcard is created} 1035 1035 {Flashcard is created}
\item 1036 1036 \item
{Flashcard is viewable in feed} 1037 1037 {Flashcard is viewable in feed}
\end{itemize} 1038 1038 \end{itemize}
1039 1039
\item[Post-conditions] 1040 1040 \item[Post-conditions]
1041 1041
\begin{itemize} 1042 1042 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1043 1043 \itemsep1pt\parskip0pt\parsep0pt
\item 1044 1044 \item
{Flashcard is hidden from user} 1045 1045 {Flashcard is hidden from user}
\item 1046 1046 \item
{Flashcard internal variable is adjusted} 1047 1047 {Flashcard internal variable is adjusted}
\end{itemize} 1048 1048 \end{itemize}
1049 1049
\item[Trigger]{User clicks flag on a specific flashcard} 1050 1050 \item[Trigger]{User clicks flag on a specific flashcard}
1051 1051
\item[Workflow] 1052 1052 \item[Workflow]
1053 1053
\begin{enumerate} 1054 1054 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1055 1055 \itemsep1pt\parskip0pt\parsep0pt
\item 1056 1056 \item
{The User is at a page of their classes.} 1057 1057 {The User is at a page of their classes.}
\item 1058 1058 \item
{The User selects one of their classes to enter the Live Feed.} 1059 1059 {The User selects one of their classes to enter the Live Feed.}
\item 1060 1060 \item
{The User is on the Live Feed for his/her class.} 1061 1061 {The User is on the Live Feed for his/her class.}
\item 1062 1062 \item
{The User shall identify an inappropriate card and flag the card.} 1063 1063 {The User shall identify an inappropriate card and flag the card.}
\item 1064 1064 \item
{The User clicks the ``Flag as Inappropriate'' button on the flashcard 1065 1065 {The User clicks the ``Flag as Inappropriate'' button on the flashcard
that he/she wants to report} 1066 1066 that he/she wants to report}
\item 1067 1067 \item
{The Client shall hide the card from the user} 1068 1068 {The Client shall hide the card from the user}
\item 1069 1069 \item
{The server shall create a FlashcardReport object} 1070 1070 {The server shall create a FlashcardReport object}
\end{enumerate} 1071 1071 \end{enumerate}
\end{description} 1072 1072 \end{description}
{} 1073 1073 {}
1074 1074
{} 1075 1075 {}
1076 1076
\newpage 1077 1077 \newpage
1078 1078
{} 1079 1079 {}
1080 1080
\subsection{\texorpdfstring{{{[}F5{]} Filter 1081 1081 \subsection{\texorpdfstring{{{[}F5{]} Filter
Flashcards}}{{[}F5{]} Filter Flashcards}} 1082 1082 Flashcards}}{{[}F5{]} Filter Flashcards}}
1083 1083
\begin{description} 1084 1084 \begin{description}
\item[Description]{The user is able to filter for flashcards by date} 1085 1085 \item[Description]{The user is able to filter for flashcards by date}
1086 1086
\item[Desired Outcome]{The user shall see flashcards based on the filter 1087 1087 \item[Desired Outcome]{The user shall see flashcards based on the filter
options} 1088 1088 options}
1089 1089
{User Goals:}{The user can find what he/she is specifically looking 1090 1090 {User Goals:}{The user can find what he/she is specifically looking
for} 1091 1091 for}
1092 1092
\item[Primary Actor]{User (student)} 1093 1093 \item[Primary Actor]{User (student)}
1094 1094
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1095 1095 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull 1096 1096 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard, {[}F3{]} Pull
Flashcard} 1097 1097 Flashcard}
\\ 1098 1098 \\
\item[Priority Level]{''Should''} 1099 1099 \item[Priority Level]{''Should''}
1100 1100
\item[Status]{Not}{}{Implemented } 1101 1101 \item[Status]{Not}{}{Implemented }
1102 1102
\item[Pre-conditions] 1103 1103 \item[Pre-conditions]
1104 1104
\begin{itemize} 1105 1105 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1106 1106 \itemsep1pt\parskip0pt\parsep0pt
\item 1107 1107 \item
{User has registered for the course } 1108 1108 {User has registered for the course }
\item 1109 1109 \item
{Flashcards exist in the course} 1110 1110 {Flashcards exist in the course}
\end{itemize} 1111 1111 \end{itemize}
1112 1112
\item[Post-conditions]{} 1113 1113 \item[Post-conditions]{}
1114 1114
\begin{itemize} 1115 1115 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1116 1116 \itemsep1pt\parskip0pt\parsep0pt
\item 1117 1117 \item
{User only sees specific flashcards} 1118 1118 {User only sees specific flashcards}
\end{itemize} 1119 1119 \end{itemize}
1120 1120
\item[Trigger]{User has selected advanced options from menu} 1121 1121 \item[Trigger]{User has selected advanced options from menu}
1122 1122
\item[Workflow] 1123 1123 \item[Workflow]
1124 1124
\begin{enumerate} 1125 1125 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1126 1126 \itemsep1pt\parskip0pt\parsep0pt
\item 1127 1127 \item
{The User chooses one of their classes.} 1128 1128 {The User chooses one of their classes.}
\item 1129 1129 \item
{The User presses the class they want to view.} 1130 1130 {The User presses the class they want to view.}
\item 1131 1131 \item
{The Client displays the Live Feed.} 1132 1132 {The Client displays the Live Feed.}
\item 1133 1133 \item
{The User is at the Live Feed.} 1134 1134 {The User is at the Live Feed.}
\item 1135 1135 \item
{The User wants to filter the cards on the Live Feed.} 1136 1136 {The User wants to filter the cards on the Live Feed.}
\item 1137 1137 \item
{The User shall select what filter option they want from a drop down 1138 1138 {The User shall select what filter option they want from a drop down
menu.} 1139 1139 menu.}
\item 1140 1140 \item
{The Client shall display only relevant flashcards.} 1141 1141 {The Client shall display only relevant flashcards.}
\end{enumerate} 1142 1142 \end{enumerate}
\end{description} 1143 1143 \end{description}
{} 1144 1144 {}
1145 1145
\newpage 1146 1146 \newpage
1147 1147
{} 1148 1148 {}
1149 1149
\subsection{\texorpdfstring{{{[}F6{]} Blank Out Words in 1150 1150 \subsection{\texorpdfstring{{{[}F6{]} Blank Out Words in
Flashcard}}{{[}F6{]} Blank Out Words in Flashcard}} 1151 1151 Flashcard}}{{[}F6{]} Blank Out Words in Flashcard}}
1152 1152
\begin{description} 1153 1153 \begin{description}
\item[Description]{The User shall be able to blank out keywords in any 1154 1154 \item[Description]{The User shall be able to blank out keywords in any
flashcard in his deck. } 1155 1155 flashcard in his deck. }
1156 1156
\item[Desired Outcome]{The blanked out words in the flashcard notify the 1157 1157 \item[Desired Outcome]{The blanked out words in the flashcard notify the
System that they are keywords. } 1158 1158 System that they are keywords. }
\\ 1159 1159 \\
\item[User Goals]{The User shall mark some words as keywords so the System 1160 1160 \item[User Goals]{The User shall mark some words as keywords so the System
may later quiz theirself by blanking out the keywords and having the 1161 1161 may later quiz theirself by blanking out the keywords and having the
User guess what they are.} 1162 1162 User guess what they are.}
1163 1163
{Primary Actor: }{User (student)} 1164 1164 {Primary Actor: }{User (student)}
1165 1165
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1166 1166 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1167 1167 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1168 1168 \\
\item[Priority Level]{``Must''} 1169 1169 \item[Priority Level]{``Must''}
1170 1170
\item[Status]{Not implemented.} 1171 1171 \item[Status]{Not implemented.}
1172 1172
\item[Pre-conditions] 1173 1173 \item[Pre-conditions]
1174 1174
\begin{itemize} 1175 1175 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1176 1176 \itemsep1pt\parskip0pt\parsep0pt
\item 1177 1177 \item
{The User has the flashcard he wishes to blank out words from in his 1178 1178 {The User has the flashcard he wishes to blank out words from in his
deck.} 1179 1179 deck.}
\item 1180 1180 \item
{The User shall (be on the class page and) view deck} 1181 1181 {The User shall (be on the class page and) view deck}
\end{itemize} 1182 1182 \end{itemize}
1183 1183
{Post-conditions: } 1184 1184 {Post-conditions: }
1185 1185
\begin{itemize} 1186 1186 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1187 1187 \itemsep1pt\parskip0pt\parsep0pt
\item 1188 1188 \item
{The blanked out words in the flashcard are marked as keywords.} 1189 1189 {The blanked out words in the flashcard are marked as keywords.}
\item 1190 1190 \item
{The System shall blank out the keywords and let the User guess what 1191 1191 {The System shall blank out the keywords and let the User guess what
they are when it presents the flashcard to the User for reviewing.} 1192 1192 they are when it presents the flashcard to the User for reviewing.}
\end{itemize} 1193 1193 \end{itemize}
1194 1194
\item[Trigger]{The User clicks on a flashcard.} 1195 1195 \item[Trigger]{The User clicks on a flashcard.}
1196 1196
\item[Workflow] 1197 1197 \item[Workflow]
1198 1198
\begin{enumerate} 1199 1199 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1200 1200 \itemsep1pt\parskip0pt\parsep0pt
\item 1201 1201 \item
{The Client shall a show deck to user} 1202 1202 {The Client shall a show deck to user}
\item 1203 1203 \item
{The User shall click on the flashcard in his deck that he wants to 1204 1204 {The User shall click on the flashcard in his deck that he wants to
blank out words from} 1205 1205 blank out words from}
\item 1206 1206 \item
{The client shall bring user to edit flashcard page/popup} 1207 1207 {The client shall bring user to edit flashcard page/popup}
\item 1208 1208 \item
{The User shall click on the words that he wishes to blank out} 1209 1209 {The User shall click on the words that he wishes to blank out}
\item 1210 1210 \item
{The client shall specify a character range as blank} 1211 1211 {The client shall specify a character range as blank}
\item 1212 1212 \item
{The server shall mark those words by updating the Flashcard Mask for 1213 1213 {The server shall mark those words by updating the Flashcard Mask for
that flashcard. } 1214 1214 that flashcard. }
\item 1215 1215 \item
{The User shall click on `Save' or the equivalent button to save the 1216 1216 {The User shall click on `Save' or the equivalent button to save the
changes} 1217 1217 changes}
\item 1218 1218 \item
{The server will save the blanked out words as keywords to the 1219 1219 {The server will save the blanked out words as keywords to the
Flashcard Mask to review} 1220 1220 Flashcard Mask to review}
\item 1221 1221 \item
{The client shall cover the keywords with whitespace to hide them from 1222 1222 {The client shall cover the keywords with whitespace to hide them from
the User} 1223 1223 the User}
\end{enumerate} 1224 1224 \end{enumerate}
1225 1225
{Alternative Workflows:} 1226 1226 {Alternative Workflows:}
1227 1227
\begin{enumerate} 1228 1228 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1229 1229 \itemsep1pt\parskip0pt\parsep0pt
\item 1230 1230 \item
{The User shall (be on the class page and) click ``Make New 1231 1231 {The User shall (be on the class page and) click ``Make New
Flashcard''} 1232 1232 Flashcard''}
\item 1233 1233 \item
{The client shall present user with a new flashcard to fill in} 1234 1234 {The client shall present user with a new flashcard to fill in}
\item 1235 1235 \item
{The User shall fill in the information} 1236 1236 {The User shall fill in the information}
\item 1237 1237 \item
{The client shall ask if the user wants to specify blanks} 1238 1238 {The client shall ask if the user wants to specify blanks}
\item 1239 1239 \item
{The System will save the blanked out words as keywords to the 1240 1240 {The System will save the blanked out words as keywords to the
Flashcard Mask to review} 1241 1241 Flashcard Mask to review}
\item 1242 1242 \item
{The client shall cover the keywords with whitespace to hide them from 1243 1243 {The client shall cover the keywords with whitespace to hide them from
the User} 1244 1244 the User}
\end{enumerate} 1245 1245 \end{enumerate}
\end{description} 1246 1246 \end{description}
{} 1247 1247 {}
1248 1248
\newpage 1249 1249 \newpage
1250 1250
{} 1251 1251 {}
1252 1252
\subsection{\texorpdfstring{{{[}F7{]} Fix 1253 1253 \subsection{\texorpdfstring{{{[}F7{]} Fix
Flashcard}}{{[}F7{]} Fix Flashcard}} 1254 1254 Flashcard}}{{[}F7{]} Fix Flashcard}}
1255 1255
\begin{description} 1256 1256 \begin{description}
\item[Description]{The User shall be able to alter a flashcard he/she made 1257 1257 \item[Description]{The User shall be able to alter a flashcard he/she made
originally and not have to make a new copy of it.} 1258 1258 originally and not have to make a new copy of it.}
1259 1259
\item[Desired Outcome]{The User shall alter one flashcard and that 1260 1260 \item[Desired Outcome]{The User shall alter one flashcard and that
alteration will be shown to all users of that flashcard} 1261 1261 alteration will be shown to all users of that flashcard}
\\ 1262 1262 \\
\item[User Goals]{The user shall make the flashcard say something different 1263 1263 \item[User Goals]{The user shall make the flashcard say something different
than it did originally.} 1264 1264 than it did originally.}
1265 1265
\item[Primary Actor]{User (student) } 1266 1266 \item[Primary Actor]{User (student) }
1267 1267
\item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User 1268 1268 \item[Dependency Use Cases]{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1269 1269 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1270 1270 \\
\item[Priority Level]{Must} 1271 1271 \item[Priority Level]{Must}
1272 1272
\item[Status]{Not Implemented} 1273 1273 \item[Status]{Not Implemented}
1274 1274
\item[Pre-conditions] 1275 1275 \item[Pre-conditions]
1276 1276
\begin{itemize} 1277 1277 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1278 1278 \itemsep1pt\parskip0pt\parsep0pt
\item 1279 1279 \item
{User has created the flashcard} 1280 1280 {User has created the flashcard}
\end{itemize} 1281 1281 \end{itemize}
1282 1282
\item[Post-conditions]{} 1283 1283 \item[Post-conditions]{}
1284 1284
\begin{itemize} 1285 1285 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1286 1286 \itemsep1pt\parskip0pt\parsep0pt
\item 1287 1287 \item
{The user shall see their alteration for that flashcard} 1288 1288 {The user shall see their alteration for that flashcard}
\item 1289 1289 \item
{Other users will be notified of the alteration} 1290 1290 {Other users will be notified of the alteration}
\end{itemize} 1291 1291 \end{itemize}
1292 1292
\item[Trigger]{User (creator of original card) has clicked on the button 1293 1293 \item[Trigger]{User (creator of original card) has clicked on the button
``Edit''} 1294 1294 ``Edit''}
1295 1295
\item[Workflow] 1296 1296 \item[Workflow]
1297 1297
\begin{enumerate} 1298 1298 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1299 1299 \itemsep1pt\parskip0pt\parsep0pt
\item 1300 1300 \item
{User shall select one of the Flashcards they authored.} 1301 1301 {User shall select one of the Flashcards they authored.}
\item 1302 1302 \item
{User shall select ``Edit'' button on the flashcard.} 1303 1303 {User shall select ``Edit'' button on the flashcard.}
\item 1304 1304 \item
{Client shall display an ``Edit Flashcard'' view.} 1305 1305 {Client shall display an ``Edit Flashcard'' view.}
\item 1306 1306 \item
{The Flashcard will display editable fields/areas.} 1307 1307 {The Flashcard will display editable fields/areas.}
\item 1308 1308 \item
{The User shall input any changes to the Flashcard.} 1309 1309 {The User shall input any changes to the Flashcard.}
\item 1310 1310 \item
{The User shall select the ``Done Editing'' button.} 1311 1311 {The User shall select the ``Done Editing'' button.}
\item 1312 1312 \item
{The Client shall close the ``Edit Flashcard'' view.} 1313 1313 {The Client shall close the ``Edit Flashcard'' view.}
\item 1314 1314 \item
{The server shall update the Flashcard's content.} 1315 1315 {The server shall update the Flashcard's content.}
\item 1316 1316 \item
{Client shall notify users with the Flashcard that the Flashcard has 1317 1317 {Client shall notify users with the Flashcard that the Flashcard has
been edited, allowing the other users to keep or to discard the 1318 1318 been edited, allowing the other users to keep or to discard the
changes.} 1319 1319 changes.}
\end{enumerate} 1320 1320 \end{enumerate}
\end{description} 1321 1321 \end{description}
{} 1322 1322 {}
1323 1323
{} 1324 1324 {}
1325 1325
{} 1326 1326 {}
1327 1327
\newpage 1328 1328 \newpage
1329 1329
{} 1330 1330 {}
1331 1331
\subsection{\texorpdfstring{{{[}F8{]} Hide cards from 1332 1332 \subsection{\texorpdfstring{{{[}F8{]} Hide cards from
feed}}{{[}F8{]} Hide cards from feed}} 1333 1333 feed}}{{[}F8{]} Hide cards from feed}}
1334 1334
\begin{description} 1335 1335 \begin{description}
\item[Description]{The user shall be able to hide cards from feed} 1336 1336 \item[Description]{The user shall be able to hide cards from feed}
1337 1337
\item[Desired Outcome]{The card is no longer visible to the user} 1338 1338 \item[Desired Outcome]{The card is no longer visible to the user}
\\ 1339 1339 \\
\item[User Goals]{The card has been looked at and should be hidden to 1340 1340 \item[User Goals]{The card has been looked at and should be hidden to
reduce screen clutter} 1341 1341 reduce screen clutter}
1342 1342
{Primary Actor: }{User (Student)} 1343 1343 {Primary Actor: }{User (Student)}
1344 1344
\item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User 1345 1345 \item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard} 1346 1346 Login, {[}A3{]} Add a Class, {[}F1{]} Push Flashcard}
\\ 1347 1347 \\
\item[Priority Level]{``Should''} 1348 1348 \item[Priority Level]{``Should''}
1349 1349
{Status:}{Not implemented} 1350 1350 {Status:}{Not implemented}
1351 1351
\item[Pre-conditions]{Flashcard is created, flashcard is viewable by user} 1352 1352 \item[Pre-conditions]{Flashcard is created, flashcard is viewable by user}
1353 1353
\item[Post-conditions]{Flashcard is not viewable by user} 1354 1354 \item[Post-conditions]{Flashcard is not viewable by user}
1355 1355
\item[Trigger]{Card is flagged; Card is noted to be hidden} 1356 1356 \item[Trigger]{Card is flagged; Card is noted to be hidden}
1357 1357
\item[Workflow] 1358 1358 \item[Workflow]
1359 1359
\begin{enumerate} 1360 1360 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1361 1361 \itemsep1pt\parskip0pt\parsep0pt
\item 1362 1362 \item
{The User chooses a class from the dashboard.} 1363 1363 {The User chooses a class from the dashboard.}
\item 1364 1364 \item
{The Client shows the Live Feed for the selected class.} 1365 1365 {The Client shows the Live Feed for the selected class.}
\item 1366 1366 \item
{The User sees a card they want to hide from the Live Feed.} 1367 1367 {The User sees a card they want to hide from the Live Feed.}
\item 1368 1368 \item
{The User shall press a ``Hide Flashcard'' button on the card to be 1369 1369 {The User shall press a ``Hide Flashcard'' button on the card to be
hidden.} 1370 1370 hidden.}
\item 1371 1371 \item
{The Client shall hide the card of interest from the Live Feed, for 1372 1372 {The Client shall hide the card of interest from the Live Feed, for
only that User.} 1373 1373 only that User.}
\end{enumerate} 1374 1374 \end{enumerate}
1375 1375
\end{description} 1376 1376 \end{description}
1377 1377
\newpage 1378 1378 \newpage
1379 1379
{} 1380 1380 {}
1381 1381
\subsection{\texorpdfstring{{{[}F9{]} View a 1382 1382 \subsection{\texorpdfstring{{{[}F9{]} View a
Feed}}{{[}F9{]} View a Feed}} 1383 1383 Feed}}{{[}F9{]} View a Feed}}
1384 1384
\begin{description} 1385 1385 \begin{description}
\item[Description]{The user shall be able to view Live Feeds for different 1386 1386 \item[Description]{The user shall be able to view Live Feeds for different
classes} 1387 1387 classes}
1388 1388
\item[Desired Outcome]{The system shall only show the user Live Feeds for 1389 1389 \item[Desired Outcome]{The system shall only show the user Live Feeds for
specific classes. } 1390 1390 specific classes. }
\\ 1391 1391 \\
\item[User Goals]{The user will see only one Live Feed at a time. } 1392 1392 \item[User Goals]{The user will see only one Live Feed at a time. }
1393 1393
\item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User 1394 1394 \item[Dependency Use Cases]{}{}{{[}A1{]} User Registration, {[}A2{]} User
Login, {[}A3{]} Add a Class} 1395 1395 Login, {[}A3{]} Add a Class}
\\ 1396 1396 \\
\item[Priority Level]{``Must''} 1397 1397 \item[Priority Level]{``Must''}
1398 1398
{Status:}{Not implemented} 1399 1399 {Status:}{Not implemented}
1400 1400
\item[Pre-conditions]{User has added a class} 1401 1401 \item[Pre-conditions]{User has added a class}
1402 1402
\item[Post-conditions]{User shall see the Live Feed for that class} 1403 1403 \item[Post-conditions]{User shall see the Live Feed for that class}
1404 1404
\item[Trigger]{User shall select a class} 1405 1405 \item[Trigger]{User shall select a class}
1406 1406
\item[Workflow] 1407 1407 \item[Workflow]
1408 1408
\begin{enumerate} 1409 1409 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1410 1410 \itemsep1pt\parskip0pt\parsep0pt
\item 1411 1411 \item
{The User logs into their account.} 1412 1412 {The User logs into their account.}
\item 1413 1413 \item
{The System verifies the User's credentials and saves their session.} 1414 1414 {The System verifies the User's credentials and saves their session.}
\item 1415 1415 \item
{The User is at their dashboard.} 1416 1416 {The User is at their dashboard.}
\item 1417 1417 \item
{The Client shows the User's dashboard.} 1418 1418 {The Client shows the User's dashboard.}
\item 1419 1419 \item
{The User selects a class from their dashboard.} 1420 1420 {The User selects a class from their dashboard.}
\item 1421 1421 \item
{The Client displays the Live Feed for the class.} 1422 1422 {The Client displays the Live Feed for the class.}
\end{enumerate} 1423 1423 \end{enumerate}
1424 1424
\end{description} 1425 1425 \end{description}
\newpage 1426 1426 \newpage
1427 1427
{} 1428 1428 {}
\section{Decks} 1429 1429 \section{Decks}
\subsection{\texorpdfstring{{{[}-D2-{]} Making a 1430 1430 \subsection{\texorpdfstring{{{[}-D2-{]} Making a
deck}}{{[}-D2-{]} Making a deck}} 1431 1431 deck}}{{[}-D2-{]} Making a deck}}
1432 1432
\begin{description} 1433 1433 \begin{description}
\item[Description]{Upon selecting the right course, the student has the 1434 1434 \item[Description]{Upon selecting the right course, the student has the
power to make a deck by either selecting existing flashcard or adding a 1435 1435 power to make a deck by either selecting existing flashcard or adding a
new flashcard.} 1436 1436 new flashcard.}
1437 1437
\item[Desired Outcome]{The user can keep track of cards that s/he wants.} 1438 1438 \item[Desired Outcome]{The user can keep track of cards that s/he wants.}
\\ 1439 1439 \\
\item[User Goals]{The user has a personal deck ready for review later.} 1440 1440 \item[User Goals]{The user has a personal deck ready for review later.}
1441 1441
\item[Primary Actor]{User (student)} 1442 1442 \item[Primary Actor]{User (student)}
1443 1443
\item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck 1444 1444 \item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck
{[}F1{]}, Make a Flashcard {[}F3{]}} 1445 1445 {[}F1{]}, Make a Flashcard {[}F3{]}}
\\ 1446 1446 \\
\item[Priority Level]{``Must''} 1447 1447 \item[Priority Level]{``Must''}
1448 1448
\item[Status]{In Progress} 1449 1449 \item[Status]{In Progress}
1450 1450
\item[Pre-conditions] 1451 1451 \item[Pre-conditions]
1452 1452
\begin{itemize} 1453 1453 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1454 1454 \itemsep1pt\parskip0pt\parsep0pt
\item 1455 1455 \item
{The user has an account with the application. } 1456 1456 {The user has an account with the application. }
\item 1457 1457 \item
{The user has been added to the desired class.} 1458 1458 {The user has been added to the desired class.}
\end{itemize} 1459 1459 \end{itemize}
1460 1460
\item[Post-conditions] 1461 1461 \item[Post-conditions]
1462 1462
\begin{itemize} 1463 1463 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1464 1464 \itemsep1pt\parskip0pt\parsep0pt
\item 1465 1465 \item
{Desired cards are added to user's deck to the specific class } 1466 1466 {Desired cards are added to user's deck to the specific class }
\item 1467 1467 \item
{User's deck is added to the database.} 1468 1468 {User's deck is added to the database.}
\end{itemize} 1469 1469 \end{itemize}
1470 1470
\item[Trigger]{User has selected a card from the pool. User submitted a 1471 1471 \item[Trigger]{User has selected a card from the pool. User submitted a
new flashcard after ``Make New Flashcard''.} 1472 1472 new flashcard after ``Make New Flashcard''.}
1473 1473
\item[Workflow] 1474 1474 \item[Workflow]
1475 1475
\begin{enumerate} 1476 1476 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1477 1477 \itemsep1pt\parskip0pt\parsep0pt
\item 1478 1478 \item
{User is at their dashboard.} 1479 1479 {User is at their dashboard.}
\item 1480 1480 \item
{User selects the class of interest that they had no activity in yet.} 1481 1481 {User selects the class of interest that they had no activity in yet.}
\item 1482 1482 \item
{Client displays the Live Feed for the class.} 1483 1483 {Client displays the Live Feed for the class.}
\item 1484 1484 \item
{User presses ``Pull Flashcard'' button on a Flashcard that they want 1485 1485 {User presses ``Pull Flashcard'' button on a Flashcard that they want
in their Deck.} 1486 1486 in their Deck.}
\item 1487 1487 \item
{The server creates a Deck for the User for the Class of interest.} 1488 1488 {The server creates a Deck for the User for the Class of interest.}
\item 1489 1489 \item
{The server adds the Flashcard to the User's Deck.} 1490 1490 {The server adds the Flashcard to the User's Deck.}
\item 1491 1491 \item
{The Client makes the Flashcard disappear from the Live Feed.} 1492 1492 {The Client makes the Flashcard disappear from the Live Feed.}
\item 1493 1493 \item
{The Client displays the Flashcard in the User's Deck in the sidebar.} 1494 1494 {The Client displays the Flashcard in the User's Deck in the sidebar.}
\end{enumerate} 1495 1495 \end{enumerate}
1496 1496
{Alternate Workflow:} 1497 1497 {Alternate Workflow:}
1498 1498
\begin{enumerate} 1499 1499 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1500 1500 \itemsep1pt\parskip0pt\parsep0pt
\item 1501 1501 \item
{User is at their dashboard.} 1502 1502 {User is at their dashboard.}
\item 1503 1503 \item
{User selects the class of interest that they had no activity in yet.} 1504 1504 {User selects the class of interest that they had no activity in yet.}
\item 1505 1505 \item
{Client displays the Live Feed for the class.} 1506 1506 {Client displays the Live Feed for the class.}
\item 1507 1507 \item
{The User adds a Flashcard into the Class.} 1508 1508 {The User adds a Flashcard into the Class.}
\item 1509 1509 \item
{The server creates a Deck for the User for the Class of interest.} 1510 1510 {The server creates a Deck for the User for the Class of interest.}
\item 1511 1511 \item
{The server adds the new Flashcard to the User's Deck.} 1512 1512 {The server adds the new Flashcard to the User's Deck.}
\item 1513 1513 \item
{The Client makes the Flashcard disappear from the Live Feed.} 1514 1514 {The Client makes the Flashcard disappear from the Live Feed.}
\item 1515 1515 \item
{The Client displays the Flashcard in the User's Deck in the sidebar.} 1516 1516 {The Client displays the Flashcard in the User's Deck in the sidebar.}
\end{enumerate} 1517 1517 \end{enumerate}
\end{description} 1518 1518 \end{description}
\newpage 1519 1519 \newpage
1520 1520
{} 1521 1521 {}
1522 1522
\subsection{\texorpdfstring{{{[}D1{]} Remove a card from a 1523 1523 \subsection{\texorpdfstring{{{[}D1{]} Remove a card from a
deck}}{{[}D1{]} Remove a card from a deck}} 1524 1524 deck}}{{[}D1{]} Remove a card from a deck}}
1525 1525
\begin{description} 1526 1526 \begin{description}
\item[Description]{The user can remove flashcards from their deck.} 1527 1527 \item[Description]{The user can remove flashcards from their deck.}
1528 1528
\item[Desired Outcome]{The user will not be notified about that card. } 1529 1529 \item[Desired Outcome]{The user will not be notified about that card. }
\\ 1530 1530 \\
\item[User Goals]{To only review cards that the user wants to review. } 1531 1531 \item[User Goals]{To only review cards that the user wants to review. }
1532 1532
\item[Primary Actor]{User (student)} 1533 1533 \item[Primary Actor]{User (student)}
1534 1534
\item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck 1535 1535 \item[Dependency Use Cases]{Add a class {[}A3{]}, Add Flashcards to Deck
{[}F1{]}, Make a Flashcard {[}F3{]}} 1536 1536 {[}F1{]}, Make a Flashcard {[}F3{]}}
\\ 1537 1537 \\
\item[Priority Level]{``Must''} 1538 1538 \item[Priority Level]{``Must''}
1539 1539
\item[Status]{Unimplemented} 1540 1540 \item[Status]{Unimplemented}
1541 1541
\item[Pre-conditions] 1542 1542 \item[Pre-conditions]
1543 1543
\begin{itemize} 1544 1544 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1545 1545 \itemsep1pt\parskip0pt\parsep0pt
\item 1546 1546 \item
{The User has an account with the application} 1547 1547 {The User has an account with the application}
\item 1548 1548 \item
{The User is logged in} 1549 1549 {The User is logged in}
\end{itemize} 1550 1550 \end{itemize}
1551 1551
\item[Post-conditions] 1552 1552 \item[Post-conditions]
1553 1553
\begin{itemize} 1554 1554 \begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt 1555 1555 \itemsep1pt\parskip0pt\parsep0pt
\item 1556 1556 \item
{Desired cards are hidden to the user.} 1557 1557 {Desired cards are hidden to the user.}
\end{itemize} 1558 1558 \end{itemize}
1559 1559
\item[Trigger]{User has selected a card to be hidden.} 1560 1560 \item[Trigger]{User has selected a card to be hidden.}
1561 1561
\item[Workflow] 1562 1562 \item[Workflow]
1563 1563
\begin{enumerate} 1564 1564 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1565 1565 \itemsep1pt\parskip0pt\parsep0pt
\item 1566 1566 \item
{The Client shows the user the dashboard.} 1567 1567 {The Client shows the user the dashboard.}
\item 1568 1568 \item
{The User shall select the appropriate class.} 1569 1569 {The User shall select the appropriate class.}
\item 1570 1570 \item
{The System checks if the class is in session.} 1571 1571 {The System checks if the class is in session.}
\item 1572 1572 \item
{The User shall select deck view.} 1573 1573 {The User shall select deck view.}
\item 1574 1574 \item
{The Client shall route the user to the deck view.} 1575 1575 {The Client shall route the user to the deck view.}
\item 1576 1576 \item
{The User clicks a flashcard's remove button.} 1577 1577 {The User clicks a flashcard's remove button.}
\item 1578 1578 \item
{The Client shall send a DELETE request to the server}{}{at 1579 1579 {The Client shall send a DELETE request to the server}{}{at
/api/flashcard/\textless{}flashcard ID\textgreater{}/remove} 1580 1580 /api/flashcard/\textless{}flashcard ID\textgreater{}/remove}
\item 1581 1581 \item
{The Server removes the flashcard from the User's Deck.} 1582 1582 {The Server removes the flashcard from the User's Deck.}
\item 1583 1583 \item
{The Server updates the flashcard's position in the Live Feed.} 1584 1584 {The Server updates the flashcard's position in the Live Feed.}
\item 1585 1585 \item
{The Client updates the User's Deck.} 1586 1586 {The Client updates the User's Deck.}
\end{enumerate} 1587 1587 \end{enumerate}
1588 1588
{} 1589 1589 {}
1590 1590
{Alternate Workflow:} 1591 1591 {Alternate Workflow:}
1592 1592
\begin{enumerate} 1593 1593 \begin{enumerate}
\itemsep1pt\parskip0pt\parsep0pt 1594 1594 \itemsep1pt\parskip0pt\parsep0pt
\item 1595 1595 \item
{The Client shows the user the dashboard.} 1596 1596 {The Client shows the user the dashboard.}
\item 1597 1597 \item
{The User shall select the appropriate class.} 1598 1598 {The User shall select the appropriate class.}
\item 1599 1599 \item
{The System checks if the class is }{not}{in session.} 1600 1600 {The System checks if the class is }{not}{in session.}
\item 1601 1601 \item
{The Client shall the user to the deck view.} 1602 1602 {The Client shall the user to the deck view.}
\item 1603 1603 \item
{The User clicks a flashcard's remove button.} 1604 1604 {The User clicks a flashcard's remove button.}
\item 1605 1605 \item
{The Client shall send a DELETE request to the server}{}{at 1606 1606 {The Client shall send a DELETE request to the server}{}{at
/api/flashcard/\textless{}flashcard ID\textgreater{}/remove} 1607 1607 /api/flashcard/\textless{}flashcard ID\textgreater{}/remove}
\item 1608 1608 \item
{The Server removes the flashcard from the User's Deck.} 1609 1609 {The Server removes the flashcard from the User's Deck.}
\item 1610 1610 \item
{The Server updates the flashcard's position in the Live Feed.} 1611 1611 {The Server updates the flashcard's position in the Live Feed.}
\item 1612 1612 \item
{The Client updates the User's Deck.} 1613 1613 {The Client updates the User's Deck.}
\end{enumerate} 1614 1614 \end{enumerate}
\end{description} 1615 1615 \end{description}
1616 1616
\subsection{\texorpdfstring{{{[}-D2-{]} Shuffling 1617 1617 \subsection{\texorpdfstring{{{[}-D2-{]} Shuffling
deck}}{{[}-D2-{]} Shuffling deck}} 1618 1618 deck}}{{[}-D2-{]} Shuffling deck}}
1619 1619
\begin{description} 1620 1620 \begin{description}
\item[Description]{User is able to shuffle his/her deck as a way to study 1621 1621 \item[Description]{User is able to shuffle his/her deck as a way to study
the flashcards} 1622 1622 the flashcards}
1623 1623
\item[Desired Outcome]{When taking a quiz, the user will notice that 1624 1624 \item[Desired Outcome]{When taking a quiz, the user will notice that
flashcards appear in random order} 1625 1625 flashcards appear in random order}
1626 1626
{User Goals:}{Improve quiz taking skills and knowledge consumption} 1627 1627 {User Goals:}{Improve quiz taking skills and knowledge consumption}
1628 1628
\item[Primary Actor]{User (student)} 1629 1629 \item[Primary Actor]{User (student)}
1630 1630