Commit 4d2ee9e3e9b51725ebf318e70eec0217bb892db3

Authored by Chung Wang
1 parent 70b903c088
Exists in master

A3 change. ( not finished )

Showing 1 changed file with 21 additions and 19 deletions Inline Diff

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