Requirements


Functional Requirements:


  • Allow users to upload files to the system.
  • Enable users to download uploaded files.
  • Enable user to do resumable uploads.
  • User should be able to view their files.
  • Ensure synchronization of files between local and server storage.
  • User should be able to select their tiers and based on that we get storage.



Non-Functional Requirements:


  • System should be highly durable.
  • System should be highly available and eventual consistent.
  • System should be non fault tolerant
  • System should retain files with TTL.
  • At max user can have 5 clients
  • Compressing
  • Deduplication of files.


API Design

Define the APIs expected from the system. This is your chance to analyze and define the read and write paths so that you can come up with the high-level design...



POST /files/upload -> this will give me a presigned url from the server


POST /files/{chunkId} -> this will give me a presigned url from the server



GET /files/download -> presigned Url for download.




High-Level Design

Describe the overall system architecture. Identify the main components needed to solve the problem end-to-end. Use the diagramming tool to create a block diagram.




Detailed Component Design

Deep dive into 2-3 key components. Explain how they work, how they scale, discuss tradeoffs, capacity, and any relevant algorithms or data structures.