Skip to content

Sequence Diagrams

nuriba edited this page Apr 6, 2025 · 12 revisions

Template

sequenceDiagram
    actor Client
    Client->>Object1: request(data)
    activate Object1
    
    Object1->>Object2: processData(data)
    activate Object2
    Object2->>Database: query(data)
    activate Database
    Database-->>Object2: result
    deactivate Database
    Object2-->>Object1: processedResult
    deactivate Object2
    
    alt success
        Object1-->>Client: response(result)
    else error
        Object1-->>Client: errorResponse(error)
        deactivate Object1
    end

Loading
sequenceDiagram
    actor Client as Can
    Client->>RecipeCreationPage: request(recipeData)
    activate RecipeCreationPage
    
    RecipeCreationPage->>FoodDatabase: query(nutritionalInfo)
    activate FoodDatabase
    FoodDatabase-->>RecipeCreationPage: result(nutritionalInfo)
    deactivate FoodDatabase
    
    RecipeCreationPage->>RecipeCreationPage: process(recipeData, nutritionalInfo)
    RecipeCreationPage->>RecipeForum: post(recipe with cost breakdown, instructions, tags)
    activate RecipeForum
    RecipeForum-->>RecipeCreationPage: confirmation(posted)
    deactivate RecipeForum
    
    alt success
        RecipeCreationPage-->>Client: response(recipe posted confirmation)
    else error
        RecipeCreationPage-->>Client: errorResponse(error)
        deactivate RecipeCreationPage
    end
Loading
sequenceDiagram
    actor Client as Mehmet
    Client->>InventoryPage: request(view inventory)
    activate InventoryPage
    
    InventoryPage->>InventorySystem: fetch inventory list
    activate InventorySystem
    InventorySystem-->>InventoryPage: current inventory list
    deactivate InventorySystem
    InventoryPage-->>Client: response(inventory list)
    
    Client->>InventoryPage: request(add new item with details)
    activate InventoryPage
    InventoryPage->>FoodDatabase: query nutritional info (if applicable)
    activate FoodDatabase
    FoodDatabase-->>InventoryPage: nutritional information
    deactivate FoodDatabase
    InventoryPage->>InventorySystem: add new item (name, price, quantity, tags, image)
    activate InventorySystem
    InventorySystem-->>InventoryPage: confirmation(new item added)
    deactivate InventorySystem
    
    Client->>InventoryPage: request(update item (price & quantity))
    activate InventoryPage
    InventoryPage->>InventorySystem: update item details
    activate InventorySystem
    InventorySystem-->>InventoryPage: confirmation(item updated)
    deactivate InventorySystem
    
    Client->>InventoryPage: request(remove item)
    activate InventoryPage
    InventoryPage->>InventorySystem: remove item
    activate InventorySystem
    InventorySystem-->>InventoryPage: confirmation(item removed)
    deactivate InventorySystem
    
    InventoryPage->>PublicListing: update public store listing
    activate PublicListing
    PublicListing-->>InventoryPage: confirmation(listing updated)
    deactivate PublicListing
    
    alt success
        InventoryPage-->>Client: response(operations successful)
    else error
        InventoryPage-->>Client: errorResponse(error)
        deactivate InventoryPage
    end

Loading
sequenceDiagram
    actor Elif
    participant FoodCatalog as FoodCatalog
    participant FoodEntry as FoodEntry
    participant Moderator as Moderator
    participant Recipe as Recipe
    participant RecipeList as RecipeList
    participant Forum as Forum
    participant Post as Post
    participant MealPlan as MealPlan
    
    %% Search for the flour
    Elif->>FoodCatalog: searchByName("New Gluten-Free Flour")
    activate FoodCatalog
    FoodCatalog-->>Elif: emptyList (Not Found)
    deactivate FoodCatalog
    
    %% Propose new food item
    Elif->>FoodCatalog: addFoodItem(newFlour)
    activate FoodCatalog
    
    FoodCatalog->>FoodEntry: new FoodEntry("New Gluten-Free Flour", "Grain")
    activate FoodEntry
    FoodEntry->>FoodEntry: updateNutritionalInfo(calories, protein, fat, carbs)
    FoodEntry->>FoodEntry: addDietaryOption("Celiac-friendly")
    FoodEntry->>FoodEntry: calculateNutritionScore()
    FoodEntry-->>FoodCatalog: newFoodEntry
    deactivate FoodEntry
    
    FoodCatalog->>Moderator: reviewFoodItem(newFoodEntry)
    activate Moderator
    Moderator-->>FoodCatalog: approved
    deactivate Moderator
    
    FoodCatalog-->>Elif: confirmation
    deactivate FoodCatalog
    
    %% Create recipe
    Elif->>Recipe: new Recipe(name: "Gluten-Free Flatbread")
    activate Recipe
    Recipe-->>Elif: newRecipe
    deactivate Recipe
    
    %% Add ingredients to recipe
    Elif->>Recipe: addIngredient(newFlour, amount)
    activate Recipe
    Recipe->>FoodCatalog: getFoodItemById(flourId)
    activate FoodCatalog
    FoodCatalog-->>Recipe: flourEntry
    deactivate FoodCatalog
    Recipe-->>Elif: ingredientAdded
    deactivate Recipe
    
    %% Add more ingredients (abbreviated)
    Elif->>Recipe: addIngredient(otherIngredients...)
    
    %% Add preparation steps
    Elif->>Recipe: instructions = ["Mix dry ingredients", "Add water", "Knead dough", "Roll out", "Cook in pan"]
    
    %% Calculate nutrition and cost
    Elif->>Recipe: calculateTotalProteinContent()
    activate Recipe
    Recipe-->>Elif: proteinContent
    deactivate Recipe
    
    Elif->>Recipe: calculateCost()
    activate Recipe
    Recipe->>Market: getListingsByFoodEntryId(flourId)
    activate Market
    Market-->>Recipe: listings
    deactivate Market
    Recipe-->>Elif: recipeCost
    deactivate Recipe
    
    %% Post recipe to forum
    Elif->>Forum: addPost(newRecipePost)
    activate Forum
    Forum->>Post: new Post(content: recipe, tags: ["Recipe", "Gluten-Free"])
    activate Post
    Post-->>Forum: newPost
    deactivate Post
    Forum-->>Elif: postConfirmation
    deactivate Forum
    
    %% Add to meal plan
    Elif->>MealPlan: generatePlan()
    activate MealPlan
    MealPlan-->>Elif: emptyPlan
    deactivate MealPlan
    
    Elif->>MealPlan: addMeal(recipe, days)
    activate MealPlan
    MealPlan->>MealPlan: calculateNutritionalSummary()
    MealPlan-->>Elif: updatedPlan
    deactivate MealPlan
    
    %% Save meal plan
    Elif->>MealPlan: saveToCollection()
    activate MealPlan
    MealPlan-->>Elif: savedConfirmation
    deactivate MealPlan
Loading
sequenceDiagram
    actor Cem
    participant MealPlan

    Cem->>MealPlan: MealPlan("Vegan Meal Plan", Weekly)
    activate MealPlan
    MealPlan-->>Cem: 
    deactivate MealPlan
    
    Cem->>MealPlan: addDietaryOption(Vegan)
    activate MealPlan
    MealPlan-->>Cem: 
    deactivate MealPlan
    
    Cem->>MealPlan: generateMealPlan()
    activate MealPlan
    MealPlan-->>Cem: 
    deactivate MealPlan
    
    Cem->>MealPlan: saveToCollection()
    activate MealPlan
    
    MealPlan->>Database: writeToCollection
    activate Database
    Database-->>MealPlan: status
    deactivate Database

    alt Success (status == 200)
        MealPlan-->>Cem: Success (Plan Saved)
        
    else Error 
        MealPlan-->>Cem: Error (Failed to Save Plan)
        deactivate MealPlan
    end
    

       
    Cem->>MealPlan: shareAsPost()
    activate MealPlan
    
    MealPlan->>Database: readFromCollections()
    activate Database
    Database-->>MealPlan: (status, MealPlan)
    deactivate Database

    alt Success (status == 200)
        MealPlan-->>Cem: MealPlan 
        
    else Error 
        MealPlan-->>Cem: Error (Failed to Retrieve Plan)
        deactivate MealPlan
    end
Loading
sequenceDiagram
    actor Kadir
    participant LoginPage 
    participant AuthorizationAPI 
    participant Database 
    
    Kadir->>LoginPage: requestPasswordReset(username)
    activate LoginPage 
    
    LoginPage->>AuthorizationAPI: validateResetRequest(username)
    activate AuthorizationAPI 
    AuthorizationAPI->>Database: getUserEmail(username)
    activate Database 
    Database-->>AuthorizationAPI: userEmail
    deactivate Database
    AuthorizationAPI-->>LoginPage: resetToken
    deactivate AuthorizationAPI
    
    alt status == 200 (email found)
        LoginPage-->>Kadir: resetEmailSent
        
        Kadir->>LoginPage: submitNewPassword(resetToken, newPassword)
        LoginPage->>AuthorizationAPI: validateToken(resetToken)
        activate AuthorizationAPI 
        AuthorizationAPI->>Database: updatePassword(username, newPasswordHash)
        activate Database 
        Database-->>AuthorizationAPI: passwordUpdateResponse
        deactivate Database
        AuthorizationAPI-->>LoginPage: passwordUpdateResponse
        deactivate AuthorizationAPI
        
        alt status == 200 (password update successful)
            LoginPage-->>Kadir: passwordResetSuccess
        else status != 200 (password update failed)
            LoginPage-->>Kadir: passwordResetError
        end
        
    else status != 200 (email not found)
        LoginPage-->>Kadir: userNotFound
    end
    
    deactivate LoginPage
Loading

Scenario 7: Moderator Actions  Scenario 7: Moderator Actions

Use Case 1: Searching, Displaying, and Sorting Food Items

sequenceDiagram
    actor Client
    Client->>FoodCatalog: searchByName("Quinoa")
    activate FoodCatalog
    FoodCatalog->>Database: query("Quinoa")
    activate Database
    Database-->>FoodCatalog: listOfFoodEntries
    deactivate Database
    FoodCatalog-->>Client: return FoodEntry details
    deactivate FoodCatalog
    alt Sorting Action
        Client->>Client: sort list by proteinContent
    end
Loading

Use Case 2: Proposing and Approving a New Food Item

sequenceDiagram
    actor Client
    %% Step 1: Search for "Teff" and get no results
    Client->>FoodCatalog: searchByName("Teff")
    activate FoodCatalog
    FoodCatalog->>Database: query("Teff")
    activate Database
    Database-->>FoodCatalog: noResults
    deactivate Database
    FoodCatalog-->>Client: emptyResult
    deactivate FoodCatalog

    %% Step 2: Create new FoodEntry submission for "Teff"
    Client->>FoodEntry: new FoodEntry("Teff", "Grain", servingSize, calories, protein, fat, carbs)
    activate FoodEntry
    FoodEntry->>FoodEntry: calculateNutritionScore()
    deactivate FoodEntry

    %% Step 3: Submit the new food item to the catalog
    Client->>FoodCatalog: addFoodItem(newFoodEntry)
    activate FoodCatalog
    FoodCatalog->>Database: insert(newFoodEntry, status="Pending Review")
    activate Database
    Database-->>FoodCatalog: insertionSuccess
    deactivate Database
    FoodCatalog-->>Client: submissionReceived
    deactivate FoodCatalog

    %% Step 4: Moderator reviews and approves the submission
    Moderator->>FoodCatalog: approveFoodSubmission(newFoodEntry)
    activate FoodCatalog
    FoodCatalog->>ModerationHistory: logApproval(newFoodEntry)
    activate ModerationHistory
    ModerationHistory-->>FoodCatalog: logCreated
    deactivate ModerationHistory
    FoodCatalog->>Database: updateStatus(newFoodEntry, "Approved")
    activate Database
    Database-->>FoodCatalog: updateSuccess
    deactivate Database
    FoodCatalog-->>Moderator: approvalConfirmed
    deactivate FoodCatalog

    %% Step 5: Notification to the client
    alt Notification Success
        FoodCatalog-->>Client: notify("Teff is now available")
    else Error
        FoodCatalog-->>Client: errorResponse("Approval Failed")
    end
Loading
sequenceDiagram
    actor Sam
    participant MealPlanner 
    participant BudgetOptimizer 
    participant Database 
    
    Sam->>MealPlanner: openMealPlanner()
    activate MealPlanner 
    
    MealPlanner->>Sam: selectDietaryPreference("Vegan")
    Sam->>MealPlanner: setBudget(optional)
    
    MealPlanner->>BudgetOptimizer: generateMealPlan(diet="Vegan", budget)
    activate BudgetOptimizer 
    BudgetOptimizer->>Database: fetchAffordableIngredients(diet="Vegan")
    activate Database 
    Database-->>BudgetOptimizer: ingredientList
    deactivate Database
    BudgetOptimizer-->>MealPlanner: optimizedMealPlan
    deactivate BudgetOptimizer
    
    MealPlanner-->>Sam: displayMealPlan
    
    Sam->>MealPlanner: saveMealPlan()
    MealPlanner->>Database: storeMealPlan(userID, mealPlan)
    
    alt success
        MealPlanner-->>Sam: mealPlanSavedSuccess
    else error
        MealPlanner-->>Sam: mealPlanSaveError
    end
    
    Sam->>MealPlanner: shareMealPlan()
    MealPlanner->>Database: storeForumPost(mealPlan, userID)
    
    alt success
        MealPlanner-->>Sam: mealPlanSharedSuccess
    else error
        MealPlanner-->>Sam: mealPlanShareError
    end
    
    deactivate MealPlanner
Loading
sequenceDiagram
    actor Lisa
    participant Store
    participant MarketListing
    participant Database
    
    Lisa->>Store: createStore("Lisa's Fresh Market - East Side", "150 Greenway Ave", "Bringing fresh...", "store_image.jpg")
    activate Store
    
    Store->>Database: saveStoreData(storeData)
    activate Database
    Database-->>Store: status
    deactivate Database
    
    alt Success (status == 200)
        Store-->>Lisa: Success (Store Created)
    else Error
        Store-->>Lisa: Error (Failed to Create Store)
    end
    deactivate Store
    
    Lisa->>Store: getListings(storeID)
    activate Store
    Store->>Database: fetchListingsData(storeID)
    activate Database
    Database-->>Store: (status, listingsData)
    deactivate Database
    Store-->>Lisa: List~MarketListing~
    deactivate Store
    
    loop For each selected product
        Lisa->>MarketListing: updateStock(reducedQuantity)
        activate MarketListing
        MarketListing->>Database: updateStockInDatabase(listingID, reducedQuantity)
        activate Database
        Database-->>MarketListing: status
        deactivate Database
        MarketListing-->>Lisa: 
        deactivate MarketListing
        
        Lisa->>Store: addListing(newListing)
        activate Store
        Store->>Database: saveListingData(newListing)
        activate Database
        Database-->>Store: status
        deactivate Database
        Store-->>Lisa: 
        deactivate Store
        
        Lisa->>Store: removeListing(originalListingID)
        activate Store
        Store->>Database: deleteListingData(originalListingID)
        activate Database
        Database-->>Store: status
        deactivate Database
        
        alt Success (status == 200)
            Store-->>Lisa: Success (Item Transferred)
        else Error
            Store-->>Lisa: Error (Failed to Transfer Item)
        end
        deactivate Store
    end
    
    Lisa->>MarketListing: updatePrice(newPrice)
    activate MarketListing
    MarketListing->>Database: updateListingData(listingID, updatedPrice)
    activate Database
    Database-->>MarketListing: status
    deactivate Database
    MarketListing-->>Lisa: 
    deactivate MarketListing
    
    Lisa->>MarketListing: updateImage(newImageURL)
    activate MarketListing
    MarketListing->>Database: updateListingData(listingID, updatedImage)
    activate Database
    Database-->>MarketListing: status
    deactivate Database
    MarketListing-->>Lisa: 
    deactivate MarketListing
    
    Lisa->>Database: createPost("Grand Opening Announcement")
    activate Database
    Database-->>Lisa: status
    
    alt Success (status == 200)
        Database-->>Lisa: Success (Post Created)
    else Error
        Database-->>Lisa: Error (Failed to Create Post)
    end
    deactivate Database

Loading
sequenceDiagram
    actor Sarah
    participant LoginPage
    participant AuthorizationAPI
    participant Database
    participant ProfileManager

    %% User logs in
    Sarah->>LoginPage: login(username, password)
    activate LoginPage

    LoginPage->>AuthorizationAPI: authenticateUser(username, password)
    activate AuthorizationAPI
    AuthorizationAPI->>Database: verifyCredentials(username, password)
    activate Database
    Database-->>AuthorizationAPI: returnLoginStatus(success/failure)
    deactivate Database
    AuthorizationAPI-->>LoginPage: returnAuthStatus(success/failure)
    deactivate AuthorizationAPI
    
    alt status == success
        LoginPage-->>Sarah: loginSuccess()
        Sarah->>ProfileManager: redirectToProfileSettings()
    else status == failure
        LoginPage-->>Sarah: loginErrorMessage()
    end
    deactivate LoginPage

    %% User updates contact information
    Sarah->>ProfileManager: updateContactInfo(sharedEmail, sharedPhone)
    activate ProfileManager
    ProfileManager->>Database: saveContactInfo(userId, sharedEmail, sharedPhone)
    activate Database
    Database-->>ProfileManager: returnUpdateStatus(success)
    deactivate Database
    ProfileManager-->>Sarah: confirmationMessage()
    deactivate ProfileManager

    %% User updates dietary preferences
    Sarah->>ProfileManager: selectAllergen("Gluten")
    activate ProfileManager
    ProfileManager->>Database: addPredefinedAllergen(userId, "Gluten")
    activate Database
    Database-->>ProfileManager: returnAllergenUpdateStatus(success)
    deactivate Database
    ProfileManager-->>Sarah: confirmationMessage()
    deactivate ProfileManager

    Sarah->>ProfileManager: addCustomAllergen("Coconut Oil")
    activate ProfileManager
    ProfileManager->>Database: saveCustomAllergen(userId, "Coconut Oil")
    activate Database
    Database-->>ProfileManager: returnCustomAllergenStatus(success)
    deactivate Database
    ProfileManager-->>Sarah: confirmationMessage()
    deactivate ProfileManager

    %% User selects a recipe
    Sarah->>ProfileManager: getPersonalRecipes(userId)
    activate ProfileManager
    ProfileManager->>Database: fetchPersonalRecipes(userId)
    activate Database
    Database-->>ProfileManager: returnRecipes(recipeList)
    deactivate Database
    ProfileManager-->>Sarah: displayPersonalRecipes()
    deactivate ProfileManager

    Sarah->>ProfileManager: getLikedRecipes(userId)
    activate ProfileManager
    ProfileManager->>Database: fetchLikedRecipes(userId)
    activate Database
    Database-->>ProfileManager: returnLikedRecipes(likedRecipeList)
    deactivate Database
    ProfileManager-->>Sarah: displayLikedRecipes()
    deactivate ProfileManager

    Sarah->>ProfileManager: selectRecipe(recipeId)
    activate ProfileManager
    ProfileManager->>Database: getRecipeDetails(recipeId)
    activate Database
    Database-->>ProfileManager: returnRecipeDetails(recipe)
    deactivate Database
    ProfileManager-->>Sarah: displayRecipeDetails()
    deactivate ProfileManager

    %% User updates the shopping list
    Sarah->>ProfileManager: addRecipeToShoppingList(recipeId)
    activate ProfileManager
    ProfileManager->>Database: updateShoppingList(userId, recipeIngredients)
    activate Database
    Database-->>ProfileManager: returnShoppingListUpdateStatus(success)
    deactivate Database
    ProfileManager-->>Sarah: confirmationMessage()
    deactivate ProfileManager

    Sarah->>ProfileManager: getShoppingList(userId)
    activate ProfileManager
    ProfileManager->>Database: fetchShoppingList(userId)
    activate Database
    Database-->>ProfileManager: returnShoppingList(shoppingList)
    deactivate Database
    ProfileManager-->>Sarah: displayShoppingList()
    deactivate ProfileManager
Loading
Clone this wiki locally