# Hudarsono Hu - System Design Interview ## Context Users can have up to 4 documents: ID front ID back Proof of address Selfie If all 4 documents are verified, user is verified else user is unverified. User can resubmit for documents that have been rejected. ## API Endpoint Design Design APIs for clients to query for user statuses Design APIs for clients to submit user documents ## Database Design Design tables to store user documents ## Add On - Use 3rd party to verify documents - 3rd party takes up to 24 hours to process documents - 3rd party sends callbacks once verification is completed Task: How should we integrate with 3rd party verification system --- # Solution Database ================== users --------- id(bigint) email(varchar) name(varchar) user_documents -------------- user_id(bigint) type(tinyint) url(text) status(bool) ; default: false 3party_document_verification --------------------------- user_id external_record_id status 'FINISHED' Endpoints ==================== POST /users/{hash_id}/upload - images - hash_id(user_id) - type GET /users/{hash_id}/status statuses = Users.find(id).user_documents.pluck(:status) return verified/unverified POST /users/{hash_id}/verify_document return submited queue POST /3party/upload_documents { 'user_id': 'documents': [ { type: "ID_FRONT", file: file, } ] } POST /3party_callback/complete_verification { user_id: record_id: 'documents': [ { type: "ID_FRONT", status: "valid", } ] }