Skip to content

Sequence Diagrams

hasancankeles edited this page Mar 21, 2025 · 11 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 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