Commit 5a8fe752e492cecea17b38010de35982f71f6b0e

Authored by Andrew Buss
1 parent 0971f36fcb
Exists in master

Added logo

Showing 2 changed files with 3 additions and 0 deletions Inline Diff

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

9.6 KB