{ "info": { "name": "Oudelaa Mobile API", "description": "Mobile/API app collection generated from Oudelaa master collection.", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "Auth", "item": [ { "name": "Register Basic", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/register-basic", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\",\n \"password\": \"StrongPass123!\",\n \"confirmPassword\": \"StrongPass123!\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const ts = Date.now();", "if (!pm.environment.get('registerEmail')) { pm.environment.set('registerEmail', `test_${ts}@example.com`); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.message).to.exist;", "pm.expect(json.email).to.exist;", "if (json.debugCode) { pm.environment.set('emailVerificationCode', json.debugCode); }" ] } } ] }, { "name": "Register", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/register", "body": { "mode": "raw", "raw": "{\n \"name\": \"Test User\",\n \"stageName\": \"Artist One\",\n \"username\": \"{{registerUsername}}\",\n \"email\": \"{{registerEmail}}\",\n \"password\": \"StrongPass123!\",\n \"confirmPassword\": \"StrongPass123!\",\n \"musicRoles\": [\"singer\", \"composer\"],\n \"musicGenres\": [\"Tarab\", \"Pop\"],\n \"favoriteInstruments\": [\"Oud\", \"Piano\"],\n \"favoriteMaqamat\": [\"Bayati\", \"Rast\"],\n \"location\": \"Riyadh, Saudi Arabia\",\n \"latitude\": 24.7136,\n \"longitude\": 46.6753,\n \"isPrivate\": false\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const ts = Date.now();", "if (!pm.environment.get('registerEmail')) { pm.environment.set('registerEmail', `test_${ts}@example.com`); }", "if (!pm.environment.get('registerUsername')) { pm.environment.set('registerUsername', `test_user_${ts}`); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.message).to.exist;", "pm.expect(json.email).to.exist;", "if (json.debugCode) { pm.environment.set('emailVerificationCode', json.debugCode); }" ] } } ] }, { "name": "Login", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/login", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\",\n \"password\": \"StrongPass123!\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.user).to.exist;", "const uid = json.user._id || json.user.id;", "pm.environment.set('accessToken', json.accessToken);", "pm.environment.set('refreshToken', json.refreshToken);", "pm.environment.set('userId', uid);", "pm.environment.set('currentUserId', uid);" ] } } ] }, { "name": "Target User Login", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/login", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{targetLoginEmail}}\",\n \"password\": \"{{targetLoginPassword}}\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.user).to.exist;", "const uid = json.user._id || json.user.id;", "pm.environment.set('targetAccessToken', json.accessToken);", "pm.environment.set('targetRefreshToken', json.refreshToken);", "pm.environment.set('targetUserId', uid);" ] } } ] }, { "name": "Admin Login", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/login", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{adminEmail}}\",\n \"password\": \"{{adminPassword}}\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.environment.set('adminAccessToken', json.accessToken);", "pm.environment.set('adminRefreshToken', json.refreshToken);", "pm.environment.set('adminUserId', (json.user && (json.user._id || json.user.id)) || pm.environment.get('adminUserId'));" ] } } ] }, { "name": "Refresh", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/refresh", "body": { "mode": "raw", "raw": "{\n \"refreshToken\": \"{{refreshToken}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.user).to.exist;", "pm.environment.set('accessToken', json.accessToken);", "pm.environment.set('refreshToken', json.refreshToken);", "pm.environment.set('userId', json.user._id || json.user.id);" ] } } ] }, { "name": "Logout", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/logout", "body": { "mode": "raw", "raw": "{\n \"refreshToken\": \"{{refreshToken}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.message).to.eql('Logged out successfully');" ] } } ] }, { "name": "Google OAuth Start (Browser)", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/auth/google", "description": "Open this request in browser flow to start Google OAuth redirect." } }, { "name": "Google OAuth Callback (Browser Redirect)", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/auth/google/callback", "description": "Callback endpoint is called by Google redirect after browser login. Do not call directly from Postman." } }, { "name": "Google Token Login (Mobile - Recommended)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/google/token", "description": "Mobile-style Google login (Instagram-like): send Google idToken from app SDK.", "body": { "mode": "raw", "raw": "{\n \"idToken\": \"{{googleIdToken}}\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const idToken = (pm.environment.get('googleIdToken') || '').trim();", "if (!idToken) {", " throw new Error('googleIdToken is empty. Paste Google idToken from Flutter/Google SDK into environment variable googleIdToken.');", "}" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.accessToken).to.exist;", "pm.expect(json.refreshToken).to.exist;", "pm.expect(json.user).to.exist;", "const uid = json.user._id || json.user.id;", "pm.environment.set('accessToken', json.accessToken);", "pm.environment.set('refreshToken', json.refreshToken);", "pm.environment.set('userId', uid);", "pm.environment.set('currentUserId', uid);" ] } } ] }, { "name": "List My Sessions", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/auth/sessions" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) { pm.environment.set('sessionJti', json.items[0].jti); }" ] } } ] }, { "name": "Revoke My Session", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/auth/sessions/{{sessionJti}}/revoke" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.success).to.eql(true);" ] } } ] }, { "name": "Forgot Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/forgot-password", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.message).to.exist;", "if (json.debugCode) { pm.environment.set('resetCode', json.debugCode); }" ] } } ] }, { "name": "Verify Reset Code", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/verify-reset-code", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\",\n \"code\": \"{{resetCode}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.resetToken).to.exist;", "pm.environment.set('resetToken', json.resetToken);" ] } } ] }, { "name": "Reset Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/reset-password", "body": { "mode": "raw", "raw": "{\n \"resetToken\": \"{{resetToken}}\",\n \"newPassword\": \"{{newPassword}}\",\n \"confirmPassword\": \"{{newPassword}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.message).to.eql('Password reset successfully');" ] } } ] }, { "name": "Send Email Verification", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/send-email-verification", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.message).to.exist;", "if (json.debugCode) { pm.environment.set('emailVerificationCode', json.debugCode); }" ] } } ] }, { "name": "Verify Email", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/verify-email", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\",\n \"code\": \"{{emailVerificationCode}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.message).to.exist;", "if (json.accessToken) { pm.environment.set('accessToken', json.accessToken); }", "if (json.refreshToken) { pm.environment.set('refreshToken', json.refreshToken); }", "if (json.user) { const uid = json.user._id || json.user.id; pm.environment.set('userId', uid); pm.environment.set('currentUserId', uid); }" ] } } ] } ] }, { "name": "Users", "item": [ { "name": "Search Users", "request": { "method": "GET", "url": "{{baseUrl}}/users?q={{usersQuery}}&isVerified={{usersVerified}}&musicRole={{talentRole}}&experienceLevel={{talentExperienceLevel}}&hasAvatar={{usersHasAvatar}}&sortBy={{usersSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=20", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.pagination).to.exist;", "const currentUserId = pm.environment.get('currentUserId');", "if (json.items && json.items.length > 0) {", " const target = json.items.find(u => (u._id || u.id) !== currentUserId) || json.items[0];", " const targetId = target._id || target.id;", " pm.environment.set('targetUserId', targetId);", " if (target.username) { pm.environment.set('targetUsername', target.username); }", "}" ] } } ] }, { "name": "Profile Setup", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/users/me/profile-setup", "body": { "mode": "formdata", "formdata": [ { "key": "stageName", "value": "Artist One", "type": "text" }, { "key": "avatarFile", "type": "file", "src": [] }, { "key": "bio", "value": "Short bio", "type": "text" }, { "key": "location", "value": "Riyadh, Saudi Arabia", "type": "text" }, { "key": "latitude", "value": "24.7136", "type": "text" }, { "key": "coverImageFile", "type": "file", "src": [], "disabled": true }, { "key": "longitude", "value": "46.6753", "type": "text" } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.location).to.eql('Riyadh, Saudi Arabia');", "pm.expect(json.latitude).to.eql(24.7136);", "pm.expect(json.longitude).to.eql(46.6753);", "if (json.avatar) { pm.expect(json.avatar).to.be.a('string'); }", "if (json.coverImage) { pm.expect(json.coverImage).to.be.a('string'); }" ] } } ] }, { "name": "Music Setup", "request": { "method": "PATCH", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/users/me/music-setup", "body": { "mode": "raw", "raw": "{\n \"musicRoles\": [\"instrumentalist\", \"composer\"],\n \"musicGenres\": [\"Tarab\", \"Pop\"],\n \"experienceLevel\": \"intermediate\",\n \"favoriteInstruments\": [\"Oud\", \"Piano\"],\n \"favoriteMaqamat\": [\"Bayati\", \"Rast\"]\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.musicRoles).to.include('instrumentalist');", "pm.expect(json.musicRoles).to.include('composer');", "pm.expect(json.experienceLevel).to.eql('intermediate');", "pm.expect(json).to.not.have.property('isInstrumentalist');", "pm.expect(json).to.not.have.property('isSinger');", "pm.expect(json).to.not.have.property('isComposer');", "pm.expect(json).to.not.have.property('isLyricist');" ] } } ] }, { "name": "Update Me", "request": { "method": "PATCH", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/users/me", "body": { "mode": "raw", "raw": "{\n \"bio\": \"Updated from Postman\",\n \"avatar\": \"https://cdn.example.com/avatar.jpg\",\n \"stageName\": \"Artist One Updated\",\n \"musicGenres\": [\"Tarab\", \"Khaleeji\"],\n \"favoriteInstruments\": [\"Oud\"],\n \"favoriteMaqamat\": [\"Hijaz\"],\n \"location\": \"Jeddah, Saudi Arabia\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.bio).to.eql('Updated from Postman');", "if (json.coverImage) { pm.expect(json.coverImage).to.be.a('string'); }" ] } } ] }, { "name": "Update Me With Files", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/users/me", "body": { "mode": "formdata", "formdata": [ { "key": "stageName", "value": "Artist One Files", "type": "text" }, { "key": "bio", "value": "Updated from Postman with files", "type": "text" }, { "key": "location", "value": "Riyadh, Saudi Arabia", "type": "text" }, { "key": "avatar", "value": "https://cdn.example.com/avatar.jpg", "type": "text" }, { "key": "avatarFile", "type": "file", "src": [] }, { "key": "coverImageFile", "type": "file", "src": [], "disabled": true } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.stageName).to.eql('Artist One Files');", "if (json.avatar) { pm.expect(json.avatar).to.be.a('string'); }", "if (json.coverImage) { pm.expect(json.coverImage).to.be.a('string'); }" ] } } ] }, { "name": "Get User By Id", "request": { "method": "GET", "url": "{{baseUrl}}/users/{{userId}}", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] } }, { "name": "Discover Talents", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/users/discover?q={{usersQuery}}&musicRole={{talentRole}}&experienceLevel={{talentExperienceLevel}}&hasAvatarOnly={{usersHasAvatar}}&includeRoleBuckets=true&sortBy=followersCount&sortOrder={{listSortOrder}}&page=1&limit=8" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json).to.have.property('roleBuckets');", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) { pm.environment.set('targetUserId', json.items[0]._id || json.items[0].id); }" ] } } ] }, { "name": "Get Profile Overview", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/users/{{targetUserId}}/profile-overview" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('stats');", "pm.expect(json).to.have.property('contentCounts');", "pm.expect(json).to.have.property('viewerState');" ] } } ] } ] }, { "name": "Posts", "item": [ { "name": "Create Post (Own)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "First text post with mention @{{targetUsername}} #music", "type": "text" }, { "key": "taggedUserIds", "value": "{{targetUserId}}", "type": "text" }, { "key": "mentionUsernames", "value": "{{targetUsername}}", "type": "text" }, { "key": "location", "value": "Riyadh, Saudi Arabia", "type": "text" }, { "key": "latitude", "value": "24.7136", "type": "text" }, { "key": "longitude", "value": "46.6753", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "const pid = json._id || json.id;", "pm.environment.set('postId', pid);", "pm.environment.set('ownPostId', pid);" ] } } ] }, { "name": "Create Carousel Post (Instagram Style)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Weekend jam session #oud #music", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" }, { "key": "taggedUserIds", "value": "{{targetUserId}}", "type": "text" }, { "key": "mentionUsernames", "value": "{{targetUsername}}", "type": "text" }, { "key": "location", "value": "Riyadh, Saudi Arabia", "type": "text" }, { "key": "latitude", "value": "24.7136", "type": "text" }, { "key": "longitude", "value": "46.6753", "type": "text" }, { "key": "imageFiles", "type": "file", "src": [] }, { "key": "imageFiles", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('image');", "pm.expect(json.imageUrls).to.be.an('array');", "pm.expect(json.imageUrls.length).to.be.greaterThan(0);", "const pid = json._id || json.id;", "pm.environment.set('postId', pid);", "pm.environment.set('ownPostId', pid);" ] } } ] }, { "name": "Update Carousel Post (Instagram Style)", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{postId}}", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Updated carousel caption #oud #live", "type": "text" }, { "key": "imageFiles", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('image');", "pm.expect(json.imageUrls).to.be.an('array');" ] } } ] }, { "name": "Get User Posts (Own)", "request": { "method": "GET", "url": "{{baseUrl}}/posts/user/{{userId}}?visibility={{postVisibility}}&sortBy={{postSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=10", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('userId')) missing.push('userId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "if (!pm.environment.get('postId') && json.items && json.items.length > 0) {", " pm.environment.set('postId', json.items[0]._id || json.items[0].id);", " pm.environment.set('ownPostId', json.items[0]._id || json.items[0].id);", "}" ] } } ] }, { "name": "Get User Posts Filtered", "request": { "method": "GET", "url": "{{baseUrl}}/posts/user/{{userId}}?visibility={{postVisibility}}&postType={{postTypeFilter}}&q={{postSearchQuery}}&hashtag={{postHashtag}}&sortBy={{postSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=10", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Get Post By Id", "request": { "method": "GET", "url": "{{baseUrl}}/posts/{{postId}}", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json._id || json.id).to.exist;", "pm.expect(json).to.have.property('content');" ] } } ] }, { "name": "Register Post View", "request": { "method": "POST", "url": "{{baseUrl}}/posts/{{postId}}/view", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.success).to.eql(true);", "pm.expect(json).to.have.property('viewCount');", "pm.environment.set('lastViewCount', json.viewCount);" ] } } ] }, { "name": "Register Post Share", "request": { "method": "POST", "url": "{{baseUrl}}/posts/{{postId}}/share", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.success).to.eql(true);", "pm.expect(json).to.have.property('shareCount');", "pm.environment.set('lastShareCount', json.shareCount);" ] } } ] }, { "name": "Update Post", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{postId}}", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Updated post content with @{{targetUsername}} #live", "type": "text" }, { "key": "taggedUserIds", "value": "{{targetUserId}}", "type": "text" }, { "key": "mentionUsernames", "value": "{{targetUsername}}", "type": "text" }, { "key": "location", "value": "Jeddah, Saudi Arabia", "type": "text" }, { "key": "latitude", "value": "21.5433", "type": "text" }, { "key": "longitude", "value": "39.1728", "type": "text" } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.content).to.eql('Updated post content with @artist_one #live');" ] } } ] }, { "name": "Create Video Post (Own)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Video post #music", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" }, { "key": "durationSeconds", "value": "42", "type": "text" }, { "key": "coverImageFile", "type": "file", "src": [] }, { "key": "style", "value": "Sharqi", "type": "text" }, { "key": "maqam", "value": "Hijaz", "type": "text" }, { "key": "mentionUsernames", "value": "{{targetUsername}}", "type": "text" }, { "key": "rhythmSignature", "value": "6/8", "type": "text" }, { "key": "location", "value": "Riyadh, Saudi Arabia", "type": "text" }, { "key": "latitude", "value": "24.7136", "type": "text" }, { "key": "longitude", "value": "46.6753", "type": "text" }, { "key": "videoFile", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('video');", "pm.expect(json.durationSeconds).to.eql(42);", "if (json.thumbnailUrl) { pm.expect(json.thumbnailUrl).to.be.a('string'); }", "pm.expect(json.style).to.eql('Sharqi');", "pm.expect(json.maqam).to.eql('Hijaz');", "pm.expect(json.rhythmSignature).to.eql('6/8');", "pm.environment.set('postId', json._id || json.id);", "pm.environment.set('ownPostId', json._id || json.id);" ] } } ] }, { "name": "Create Reel (Video First)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/reels", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "New reel from oud session #reel", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" }, { "key": "durationSeconds", "value": "30", "type": "text" }, { "key": "coverImageFile", "type": "file", "src": [] }, { "key": "style", "value": "Sharqi", "type": "text" }, { "key": "maqam", "value": "Hijaz", "type": "text" }, { "key": "rhythmSignature", "value": "6/8", "type": "text" }, { "key": "videoFile", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('video');", "pm.expect(json.durationSeconds).to.eql(30);", "if (json.thumbnailUrl) { pm.expect(json.thumbnailUrl).to.be.a('string'); }", "pm.expect(json.style).to.eql('Sharqi');", "pm.expect(json.maqam).to.eql('Hijaz');", "pm.expect(json.rhythmSignature).to.eql('6/8');", "pm.environment.set('postId', json._id || json.id);", "pm.environment.set('ownPostId', json._id || json.id);" ] } } ] }, { "name": "Get Reels", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/reels?visibility={{postVisibility}}&authorId={{userId}}&sortBy={{postSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=10" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Get Reels Filtered", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/reels?visibility={{postVisibility}}&authorId={{userId}}&q={{reelQuery}}&sortBy={{postSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=10" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Create Audio Post (Own)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Audio post #oud", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" }, { "key": "durationSeconds", "value": "54", "type": "text" }, { "key": "coverImageFile", "type": "file", "src": [] }, { "key": "style", "value": "Sharqi", "type": "text" }, { "key": "maqam", "value": "Hijaz", "type": "text" }, { "key": "rhythmSignature", "value": "6/8", "type": "text" }, { "key": "audioFile", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('audio');", "pm.expect(json.durationSeconds).to.eql(54);", "if (json.thumbnailUrl) { pm.expect(json.thumbnailUrl).to.be.a('string'); }", "pm.expect(json.style).to.eql('Sharqi');", "pm.expect(json.maqam).to.eql('Hijaz');", "pm.expect(json.rhythmSignature).to.eql('6/8');", "pm.environment.set('postId', json._id || json.id);", "pm.environment.set('ownPostId', json._id || json.id);" ] } } ] }, { "name": "Create Audio Post (URL + Waveform)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Audio post with waveform #oud #hijaz", "type": "text" }, { "key": "audioUrl", "value": "https://cdn.example.com/audio-sample.mp3", "type": "text" }, { "key": "durationSeconds", "value": "54", "type": "text" }, { "key": "thumbnailUrl", "value": "https://cdn.example.com/audio-cover.jpg", "type": "text" }, { "key": "style", "value": "Sharqi", "type": "text" }, { "key": "maqam", "value": "Hijaz", "type": "text" }, { "key": "rhythmSignature", "value": "6/8", "type": "text" }, { "key": "waveformPeaks", "value": "[12,38,27,49,22,44]", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('audio');", "pm.expect(json.waveformPeaks).to.be.an('array');", "pm.expect(json.waveformPeaks.length).to.eql(6);", "pm.expect(json.maqam).to.eql('Hijaz');", "pm.environment.set('postId', json._id || json.id);", "pm.environment.set('ownPostId', json._id || json.id);" ] } } ] }, { "name": "Register Post Play (Audio/Video)", "request": { "method": "POST", "url": "{{baseUrl}}/posts/{{postId}}/play", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.success).to.eql(true);", "pm.expect(json).to.have.property('playCount');", "pm.environment.set('lastPlayCount', json.playCount);" ] } } ] }, { "name": "Create Invalid Post (Video+Audio)", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Invalid post", "type": "text" }, { "key": "videoUrl", "value": "https://cdn.example.com/video.mp4", "type": "text" }, { "key": "audioUrl", "value": "https://cdn.example.com/audio.mp3", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('accessToken')) { throw new Error('Missing environment var: accessToken'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 400', function () { pm.response.to.have.status(400); });" ] } } ] }, { "name": "Update Post Video (Form-Data)", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{postId}}", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Updated with video file", "type": "text" }, { "key": "durationSeconds", "value": "58", "type": "text" }, { "key": "coverImageFile", "type": "file", "src": [] }, { "key": "style", "value": "Contemporary", "type": "text" }, { "key": "maqam", "value": "Bayati", "type": "text" }, { "key": "rhythmSignature", "value": "4/4", "type": "text" }, { "key": "videoFile", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('video');", "pm.expect(json.durationSeconds).to.eql(58);", "if (json.thumbnailUrl) { pm.expect(json.thumbnailUrl).to.be.a('string'); }", "pm.expect(json.style).to.eql('Contemporary');", "pm.expect(json.maqam).to.eql('Bayati');", "pm.expect(json.rhythmSignature).to.eql('4/4');" ] } } ] }, { "name": "Update Post Audio (Form-Data)", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{postId}}", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Updated with audio file", "type": "text" }, { "key": "durationSeconds", "value": "61", "type": "text" }, { "key": "coverImageFile", "type": "file", "src": [] }, { "key": "style", "value": "Tarab", "type": "text" }, { "key": "maqam", "value": "Nahawand", "type": "text" }, { "key": "rhythmSignature", "value": "6/8", "type": "text" }, { "key": "audioFile", "type": "file", "src": [] } ] } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.postType).to.eql('audio');", "pm.expect(json.durationSeconds).to.eql(61);", "if (json.thumbnailUrl) { pm.expect(json.thumbnailUrl).to.be.a('string'); }", "pm.expect(json.style).to.eql('Tarab');", "pm.expect(json.maqam).to.eql('Nahawand');", "pm.expect(json.rhythmSignature).to.eql('6/8');" ] } } ] }, { "name": "Delete Post (Cleanup - Run Last)", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{postId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.success).to.eql(true);" ] } } ] }, { "name": "Repost Post", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/posts/{{postId}}/repost", "body": { "mode": "raw", "raw": "{\n \"content\": \"\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.environment.set('repostId', json._id || json.id);" ] } } ] }, { "name": "Quote Post", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/posts/{{postId}}/repost", "body": { "mode": "raw", "raw": "{\n \"content\": \"My take on this post\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.environment.set('quotePostId', json._id || json.id);" ] } } ] }, { "name": "Update Post Comment Settings", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/comment-settings", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "comment-settings" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"commentsDisabled\": false,\n \"commentsFollowersOnly\": true,\n \"commentFilterKeywords\": [\n \"{{commentKeyword}}\",\n \"offensive\"\n ]\n}", "options": { "raw": { "language": "json" } } } } }, { "name": "Pin Post To Profile", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/pin-profile", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "pin-profile" ], "query": [] } } }, { "name": "Unpin Post From Profile", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/unpin-profile", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "unpin-profile" ], "query": [] } } }, { "name": "Archive Post", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/archive", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "archive" ], "query": [] } } }, { "name": "Restore Archived Post", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/restore-archive", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "restore-archive" ], "query": [] } } }, { "name": "Create Carousel Post With Metadata", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": { "raw": "{{baseUrl}}/posts", "host": [ "{{baseUrl}}" ], "path": [ "posts" ], "query": [] }, "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Carousel caption #oud", "type": "text" }, { "key": "imageUrls", "value": "https://cdn.example.com/1.jpg,https://cdn.example.com/2.jpg", "type": "text" }, { "key": "imageCaptions", "value": "First image,Second image", "type": "text" }, { "key": "imageAltTexts", "value": "Oud on stage,Audience closeup", "type": "text" }, { "key": "collaboratorIds", "value": "{{collaboratorId}}", "type": "text" }, { "key": "commentsDisabled", "value": "false", "type": "text" }, { "key": "commentsFollowersOnly", "value": "false", "type": "text" } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"postId\", value._id || value.id || value);" ] } } ] }, { "name": "Update Carousel Alt Text", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}" ], "query": [] }, "body": { "mode": "formdata", "formdata": [ { "key": "imageUrls", "value": "https://cdn.example.com/1.jpg,https://cdn.example.com/2.jpg", "type": "text" }, { "key": "imageCaptions", "value": "Updated first,Updated second", "type": "text" }, { "key": "imageAltTexts", "value": "Updated oud alt,Updated audience alt", "type": "text" } ] } } }, { "name": "Disable Comments On Post", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/comment-settings", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "comment-settings" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"commentsDisabled\": true,\n \"commentsFollowersOnly\": false,\n \"commentFilterKeywords\": []\n}", "options": { "raw": { "language": "json" } } } } }, { "name": "Enable Comments On Post", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/posts/{{postId}}/comment-settings", "host": [ "{{baseUrl}}" ], "path": [ "posts", "{{postId}}", "comment-settings" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"commentsDisabled\": false,\n \"commentsFollowersOnly\": false,\n \"commentFilterKeywords\": []\n}", "options": { "raw": { "language": "json" } } } } } ] }, { "name": "Comments", "item": [ { "name": "Create Comment", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/comments", "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\",\n \"content\": \"Awesome post!\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "const cid = json._id || json.id;", "pm.environment.set('commentId', cid);", "pm.environment.set('ownCommentId', cid);" ] } } ] }, { "name": "Create Comment With Mention", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/comments", "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\",\n \"content\": \"Awesome post @{{targetUsername}}!\",\n \"mentionUsernames\": [\"{{targetUsername}}\"]\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (!pm.environment.get('targetUsername')) missing.push('targetUsername');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "const cid = json._id || json.id;", "pm.environment.set('commentId', cid);", "pm.expect(json.mentionUsernames || []).to.include(pm.environment.get('targetUsername').toLowerCase());" ] } } ] }, { "name": "Get Post Comments", "request": { "method": "GET", "url": "{{baseUrl}}/comments/post/{{postId}}?page=1&limit=10&sortBy={{commentSortBy}}&sortOrder={{listSortOrder}}", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Create Comment Reply", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/comments/{{commentId}}/replies", "host": [ "{{baseUrl}}" ], "path": [ "comments", "{{commentId}}", "replies" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"content\": \"Reply to comment\"\n}", "options": { "raw": { "language": "json" } } } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"replyCommentId\", value._id || value.id || value);" ] } } ] }, { "name": "Get Comment Replies", "request": { "method": "GET", "url": "{{baseUrl}}/comments/{{commentId}}/replies?page=1&limit=10&sortBy={{commentSortBy}}&sortOrder={{listSortOrder}}", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Update Comment", "request": { "method": "PATCH", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/comments/{{commentId}}", "body": { "mode": "raw", "raw": "{\n \"content\": \"Edited comment @{{secondaryUsername}}\",\n \"mentionUsernames\": [\"{{secondaryUsername}}\"]\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.content).to.include('Edited comment');" ] } } ] }, { "name": "Delete Comment", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/comments/{{commentId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Pin Comment", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/comments/{{commentId}}/pin", "host": [ "{{baseUrl}}" ], "path": [ "comments", "{{commentId}}", "pin" ], "query": [] } } }, { "name": "Unpin Comment", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/comments/{{commentId}}/unpin", "host": [ "{{baseUrl}}" ], "path": [ "comments", "{{commentId}}", "unpin" ], "query": [] } } }, { "name": "Create Comment Hidden By Filter", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/comments", "host": [ "{{baseUrl}}" ], "path": [ "comments" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\",\n \"content\": \"This contains {{commentKeyword}} keyword\"\n}", "options": { "raw": { "language": "json" } } } } }, { "name": "Get Post Comments - Top", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": { "raw": "{{baseUrl}}/comments/post/{{postId}}?page=1&limit=20&sortBy=top&sortOrder=desc", "host": [ "{{baseUrl}}" ], "path": [ "comments", "post", "{{postId}}" ], "query": [ { "key": "page", "value": "1" }, { "key": "limit", "value": "20" }, { "key": "sortBy", "value": "top" }, { "key": "sortOrder", "value": "desc" } ] } } }, { "name": "Get Post Comments - Newest", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": { "raw": "{{baseUrl}}/comments/post/{{postId}}?page=1&limit=20&sortBy=createdAt&sortOrder=desc", "host": [ "{{baseUrl}}" ], "path": [ "comments", "post", "{{postId}}" ], "query": [ { "key": "page", "value": "1" }, { "key": "limit", "value": "20" }, { "key": "sortBy", "value": "createdAt" }, { "key": "sortOrder", "value": "desc" } ] } } } ] }, { "name": "Likes", "item": [ { "name": "Like Post (Set liked=true)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes", "body": { "mode": "raw", "raw": "{\n \"targetId\": \"{{postId}}\",\n \"targetType\": \"post\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.liked).to.eql(true);" ] } } ] }, { "name": "Unlike Post (Set liked=false)", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes/post/{{postId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.liked).to.eql(false);" ] } } ] }, { "name": "Get Post Like Status", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes/status/post/{{postId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('liked');" ] } } ] }, { "name": "Like Comment", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes", "body": { "mode": "raw", "raw": "{\n \"targetId\": \"{{commentId}}\",\n \"targetType\": \"comment\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.liked).to.eql(true);" ] } } ] }, { "name": "Unlike Comment", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes/comment/{{commentId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.liked).to.eql(false);" ] } } ] }, { "name": "Get Comment Like Status", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes/status/comment/{{commentId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('liked');" ] } } ] }, { "name": "React To Post", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes", "body": { "mode": "raw", "raw": "{\n \"targetId\": \"{{postId}}\",\n \"targetType\": \"post\",\n \"reactionType\": \"{{reactionType}}\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.reactionType).to.exist;" ] } } ] }, { "name": "Reaction Status - Post", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes/status/post/{{postId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('reactionSummary');" ] } } ] }, { "name": "Toggle Like", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/likes/toggle", "host": [ "{{baseUrl}}" ], "path": [ "likes", "toggle" ] }, "body": { "mode": "raw", "raw": "{\n \"targetType\": \"post\",\n \"targetId\": \"{{postId}}\",\n \"reactionType\": \"like\"\n}", "options": { "raw": { "language": "json" } } } } } ] }, { "name": "Saves", "item": [ { "name": "Save Post (Set saved=true)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/saves", "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('postId')) missing.push('postId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.saved).to.eql(true);" ] } } ] }, { "name": "Unsave Post (Set saved=false)", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/saves/{{postId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.saved).to.eql(false);" ] } } ] }, { "name": "Get Save Status", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/saves/status/{{postId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('saved');" ] } } ] }, { "name": "Get My Saved Posts", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/saves/me?page=1&limit=10&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Toggle Save", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/saves/toggle", "host": [ "{{baseUrl}}" ], "path": [ "saves", "toggle" ] }, "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\"\n}", "options": { "raw": { "language": "json" } } } } } ] }, { "name": "Follows", "item": [ { "name": "Toggle Follow User", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/toggle", "body": { "mode": "raw", "raw": "{\n \"targetUserId\": \"{{targetUserId}}\"\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('targetUserId')) missing.push('targetUserId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('following');", "pm.environment.set('lastFollowingState', json.following ? 'following' : 'not_following');" ] } } ] }, { "name": "Get Followers", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/followers/{{userId}}?page=1&limit=10&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Get Following", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/following/{{userId}}?page=1&limit=10&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Get Follow Status", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/status/{{targetUserId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('following');" ] } } ] }, { "name": "Get Follow Suggestions", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/suggestions?page=1&limit=10&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "List Follow Requests", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/requests?page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "if (json.items && json.items.length) { pm.environment.set('followRequestId', json.items[0]._id || json.items[0].id); }" ] } } ] }, { "name": "Approve Follow Request", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/requests/{{followRequestId}}/approve" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Reject Follow Request", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/follows/requests/{{followRequestId}}/reject" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] } ] }, { "name": "Notifications", "item": [ { "name": "Get My Notifications", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/notifications?read={{notificationRead}}&sortOrder={{listSortOrder}}&page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) {", " pm.environment.set('notificationId', json.items[0]._id || json.items[0].id);", " pm.expect(json.items[0]).to.have.property('title');", " pm.expect(json.items[0]).to.have.property('resourceType');", " pm.expect(json.items[0]).to.have.property('deepLink');", "}" ] } } ] }, { "name": "Get My Notifications Filtered", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/notifications?read={{notificationRead}}&type={{notificationType}}&resourceType={{notificationResourceType}}&sortOrder={{listSortOrder}}&page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;" ] } } ] }, { "name": "Get Target User Notifications", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{targetAccessToken}}" } ], "url": "{{baseUrl}}/notifications?page=1&limit=20&read=false&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "pm.environment.set('notificationUnreadCount', json.unreadCount || 0);", "const followNotification = (json.items || []).find(item => item.type === 'follow');", "if (followNotification) {", " pm.environment.set('notificationId', followNotification._id || followNotification.id);", " pm.expect(followNotification).to.have.property('title');", " pm.expect(followNotification).to.have.property('resourceType');", " pm.expect(followNotification).to.have.property('deepLink');", "}" ] } } ] }, { "name": "Get Unread Notifications Count", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/notifications/unread-count" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('unreadCount');" ] } } ] }, { "name": "Get Target User Unread Notifications Count", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{targetAccessToken}}" } ], "url": "{{baseUrl}}/notifications/unread-count" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('unreadCount');", "pm.environment.set('notificationUnreadCount', json.unreadCount || 0);" ] } } ] }, { "name": "Mark Notification Read", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/notifications/{{notificationId}}/read" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('unreadCount');" ] } } ] }, { "name": "Mark Target Notification Read", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{targetAccessToken}}" } ], "url": "{{baseUrl}}/notifications/{{notificationId}}/read" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('unreadCount');", "pm.environment.set('notificationUnreadCount', json.unreadCount || 0);" ] } } ] }, { "name": "Mark All Notifications Read", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/notifications/read-all" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.unreadCount).to.eql(0);" ] } } ] }, { "name": "Mark All Target Notifications Read", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{targetAccessToken}}" } ], "url": "{{baseUrl}}/notifications/read-all" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.unreadCount).to.eql(0);", "pm.environment.set('notificationUnreadCount', 0);" ] } } ] } ] }, { "name": "Chat", "item": [ { "name": "Create Conversation", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/conversations", "body": { "mode": "raw", "raw": "{\n \"participantIds\": [\"{{targetUserId}}\"],\n \"isGroup\": false\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "const missing = [];", "if (!pm.environment.get('accessToken')) missing.push('accessToken');", "if (!pm.environment.get('targetUserId')) missing.push('targetUserId');", "if (missing.length) { throw new Error('Missing environment vars: ' + missing.join(', ')); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.environment.set('conversationId', json._id || json.id);" ] } } ] }, { "name": "Get My Conversations", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/conversations?limit=20&cursor={{chatConversationsCursor}}&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) { pm.environment.set('conversationId', json.items[0]._id || json.items[0].id); }", "pm.environment.set('chatConversationsCursor', json.nextCursor || '');" ] } } ] }, { "name": "Send Message", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/chat/messages", "host": [ "{{baseUrl}}" ], "path": [ "chat", "messages" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"conversationId\": \"{{conversationId}}\",\n \"content\": \"Hello from Postman\"\n}", "options": { "raw": { "language": "json" } } } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"messageId\", value._id || value.id || value);" ] } } ] }, { "name": "Get Conversation Messages", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/conversations/{{conversationId}}/messages?limit=20&cursor={{chatMessagesCursor}}&sortOrder={{listSortOrder}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.pagination).to.exist;", "pm.environment.set('chatMessagesCursor', json.nextCursor || '');" ] } } ] }, { "name": "Mark Message Seen", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/messages/{{messageId}}/seen" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Unsend Message", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/messages/{{messageId}}/unsend" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Block User In Chat", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/blocks/{{targetUserId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.blocked).to.eql(true);" ] } } ] }, { "name": "Unblock User In Chat", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/blocks/{{targetUserId}}/unblock" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Get Chat Block Status", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/blocks/status/{{targetUserId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('iBlocked');", "pm.expect(json).to.have.property('blockedMe');" ] } } ] }, { "name": "Get My Chat Blocks", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/chat/blocks" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');" ] } } ] }, { "name": "Send Reply Message", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/chat/messages", "host": [ "{{baseUrl}}" ], "path": [ "chat", "messages" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"conversationId\": \"{{conversationId}}\",\n \"content\": \"Replying to a message\",\n \"replyToMessageId\": \"{{replyToMessageId}}\"\n}", "options": { "raw": { "language": "json" } } } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"messageId\", value._id || value.id || value);" ] } } ] }, { "name": "Send Message Media Upload", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": { "raw": "{{baseUrl}}/chat/messages/upload", "host": [ "{{baseUrl}}" ], "path": [ "chat", "messages", "upload" ], "query": [] }, "body": { "mode": "formdata", "formdata": [ { "key": "conversationId", "value": "{{conversationId}}", "type": "text" }, { "key": "content", "value": "Media message caption", "type": "text" }, { "key": "replyToMessageId", "value": "{{replyToMessageId}}", "type": "text" }, { "key": "mediaFile", "type": "file", "src": "{{mediaFilePath}}" } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"messageId\", value._id || value.id || value);" ] } } ] }, { "name": "React To Message", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/chat/messages/{{messageId}}/reaction", "host": [ "{{baseUrl}}" ], "path": [ "chat", "messages", "{{messageId}}", "reaction" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"reactionType\": \"love\"\n}", "options": { "raw": { "language": "json" } } } } }, { "name": "Delete Message For Me", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/chat/messages/{{messageId}}/delete-for-me", "host": [ "{{baseUrl}}" ], "path": [ "chat", "messages", "{{messageId}}", "delete-for-me" ], "query": [] } } } ] }, { "name": "Feed", "item": [ { "name": "Get My Feed Mixed Home", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/feed/me?page=1&limit=20&includeSuggestions={{feedIncludeSuggestions}}&suggestionInterval={{feedSuggestionInterval}}&followingOnly={{feedFollowingOnly}}&radiusKm={{feedRadiusKm}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "if (json.items && json.items.length > 0) {", " pm.expect(json.items[0]).to.have.property('feedItemType');", "}", "const hasMixedItems = (json.items || []).some(item => item.feedItemType === 'suggested_users' || item.feedItemType === 'featured_marketplace');", "pm.environment.set('homeFeedHasMixedItems', hasMixedItems ? 'true' : 'false');" ] } } ] }, { "name": "Get My Feed", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/feed/me?limit=20&cursor={{feedCursor}}&followingOnly={{feedFollowingOnly}}&radiusKm={{feedRadiusKm}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "const firstPost = (json.items || []).find(item => item.feedItemType === 'post');", "if (firstPost) {", " pm.expect(firstPost).to.have.property('likedByMe');", " pm.expect(firstPost).to.have.property('savedByMe');", " pm.expect(firstPost).to.have.property('engagement');", "}", "pm.environment.set('feedCursor', json.nextCursor || '');" ] } } ] }, { "name": "Get My Feed Preferred Type", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/feed/me?limit=20&cursor={{feedCursor}}&preferredPostType={{feedPreferredPostType}}&followingOnly={{feedFollowingOnly}}&radiusKm={{feedRadiusKm}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.pagination).to.exist;", "const firstPost = (json.items || []).find(item => item.feedItemType === 'post');", "if (firstPost) { pm.expect(firstPost).to.have.property('engagement'); }", "pm.environment.set('feedCursor', json.nextCursor || '');" ] } } ] }, { "name": "Get Trending Feed", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/feed/trending?limit=20&cursor={{feedCursor}}&preferredPostType={{feedPreferredPostType}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "const firstPost = (json.items || []).find(item => item.feedItemType === 'post');", "if (firstPost) {", " pm.expect(firstPost).to.have.property('likedByMe');", " pm.expect(firstPost).to.have.property('savedByMe');", "}", "pm.environment.set('feedCursor', json.nextCursor || '');" ] } } ] }, { "name": "Explore Feed", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/feed/explore?page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');" ] } } ] } ] }, { "name": "Smoke", "item": [ { "name": "Login (Smoke)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "url": "{{baseUrl}}/auth/login", "body": { "mode": "raw", "raw": "{\n \"email\": \"{{registerEmail}}\",\n \"password\": \"StrongPass123!\"\n}" } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "const uid = json.user._id || json.user.id;", "pm.environment.set('accessToken', json.accessToken);", "pm.environment.set('refreshToken', json.refreshToken);", "pm.environment.set('userId', uid);" ] } } ] }, { "name": "Get User Posts (Smoke)", "request": { "method": "GET", "url": "{{baseUrl}}/posts/user/{{userId}}?page=1&limit=10", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ] } }, { "name": "Get My Feed (Smoke)", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/feed/me?limit=20&cursor={{feedCursor}}&radiusKm=30" } } ] }, { "name": "Full E2E", "item": [ { "name": "Create Post (Own) - E2E", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "E2E text post", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" } ] } } }, { "name": "Create Comment - E2E", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/comments", "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\",\n \"content\": \"E2E comment\"\n}" } } }, { "name": "Like Post - E2E", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/likes", "body": { "mode": "raw", "raw": "{\n \"targetId\": \"{{postId}}\",\n \"targetType\": \"post\"\n}" } } }, { "name": "Save Post - E2E", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/saves", "body": { "mode": "raw", "raw": "{\n \"postId\": \"{{postId}}\"\n}" } } }, { "name": "Delete Post - E2E Cleanup", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{postId}}" } } ] }, { "name": "Negative Tests", "item": [ { "name": "Create Invalid Post (Video+Audio) - Negative", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "Invalid post", "type": "text" }, { "key": "videoUrl", "value": "https://cdn.example.com/video.mp4", "type": "text" }, { "key": "audioUrl", "value": "https://cdn.example.com/audio.mp3", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 400', function () { pm.response.to.have.status(400); });" ] } } ] }, { "name": "Create Post Without Token - Negative", "request": { "method": "POST", "header": [], "url": "{{baseUrl}}/posts", "body": { "mode": "formdata", "formdata": [ { "key": "content", "value": "No token request", "type": "text" }, { "key": "visibility", "value": "public", "type": "text" } ] } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 401', function () { pm.response.to.have.status(401); });" ] } } ] } ] }, { "name": "Cleanup", "item": [ { "name": "Delete Own Comment (if exists)", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/comments/{{ownCommentId}}" }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('ownCommentId')) { postman.setNextRequest('Delete Own Post (if exists)'); }" ] } } ] }, { "name": "Delete Own Post (if exists)", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/posts/{{ownPostId}}" }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('ownPostId')) { postman.setNextRequest('Delete Instrument (if exists)'); }" ] } } ] } ] }, { "name": "AI Music", "item": [ { "name": "Generate Music From Text (Gemini)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/media/ai/text-to-music", "body": { "mode": "raw", "raw": "{\n \"prompt\": \"{{aiMusicPrompt}}\",\n \"durationSeconds\": {{aiMusicDuration}},\n \"seed\": {{aiMusicSeed}}\n}" } }, "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "if (!pm.environment.get('aiMusicPrompt')) { pm.environment.set('aiMusicPrompt', 'Calm oud melody with light percussion and emotional Arabic mood'); }", "if (!pm.environment.get('aiMusicDuration')) { pm.environment.set('aiMusicDuration', '12'); }", "if (!pm.environment.get('aiMusicSeed')) { pm.environment.set('aiMusicSeed', '42'); }" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });", "const json = pm.response.json();", "pm.expect(json.audioUrl).to.exist;", "pm.expect(json.mimeType).to.exist;", "pm.expect(json.sizeBytes).to.be.a('number');", "pm.environment.set('generatedMusicUrl', json.audioUrl);" ] } } ] } ] }, { "name": "Marketplace", "item": [ { "name": "01 Marketplace Overview", "item": [ { "name": "Public Marketplace Home", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/home?listingsLimit=4&instrumentsLimit=4&repairShopsLimit=3&onlyActive=true" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json).to.have.property('categories');", "pm.expect(json).to.have.property('summary');", "pm.expect(json).to.have.property('featuredShops');", "pm.expect(json.filters).to.have.property('listingCategories');", "pm.expect(json.sections).to.have.property('listings');", "pm.expect(json.sections).to.have.property('musicalInstruments');", "pm.expect(json.sections).to.have.property('repairShops');" ] } } ] } ] }, { "name": "03 Repair Shops", "item": [ { "name": "Public", "item": [ { "name": "Public List Repair Shops", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/repair-shops?q={{repairShopQuery}}&isActive={{repairShopIsActive}}&sortBy={{repairShopSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) { pm.environment.set('repairShopId', json.items[0]._id || json.items[0].id); }" ] } } ] }, { "name": "Public Get Repair Shop By Id", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/repair-shops/{{repairShopId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] } ] } ] }, { "name": "04 Musical Instruments", "item": [ { "name": "Public", "item": [ { "name": "Public List Instruments", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/instruments?q={{marketplaceQuery}}&minPrice={{marketplaceMinPrice}}&maxPrice={{marketplaceMaxPrice}}&isActive={{marketplaceIsActive}}&condition={{marketplaceCondition}}&instrumentType={{marketplaceInstrumentType}}&sortBy={{marketplaceSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) { pm.environment.set('instrumentId', json.items[0]._id || json.items[0].id); }" ] } } ] }, { "name": "Public Get Instrument By Id", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/instruments/{{instrumentId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] } ] } ] }, { "name": "05 General Marketplace", "item": [ { "name": "Public", "item": [ { "name": "Public List Listings", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/listings?q={{marketplaceQuery}}&minPrice={{marketplaceMinPrice}}&maxPrice={{marketplaceMaxPrice}}&isActive={{marketplaceIsActive}}&listingCategory={{marketplaceListingCategory}}&condition={{marketplaceCondition}}&instrumentType={{marketplaceInstrumentType}}&sortBy={{marketplaceSortBy}}&sortOrder={{listSortOrder}}&page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });", "const json = pm.response.json();", "pm.expect(json.items).to.be.an('array');", "pm.expect(json.pagination).to.exist;", "if (json.items && json.items.length > 0) { pm.environment.set('listingId', json.items[0]._id || json.items[0].id); }" ] } } ] }, { "name": "Public Get Listing By Id", "request": { "method": "GET", "header": [], "url": "{{baseUrl}}/marketplace/listings/{{listingId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] } ] } ] } ] }, { "name": "Blocks", "item": [ { "name": "Block User", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/blocks/{{targetUserId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 201', function () { pm.response.to.have.status(201); });" ] } } ] }, { "name": "Block Status", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/blocks/status/{{targetUserId}}" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Unblock User", "request": { "method": "PATCH", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/blocks/{{targetUserId}}/unblock" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] } ] }, { "name": "Reports", "item": [ { "name": "Report Post", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/reports", "host": [ "{{baseUrl}}" ], "path": [ "reports" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"targetType\": \"post\",\n \"targetId\": \"{{postId}}\",\n \"reason\": \"spam\",\n \"details\": \"This content looks suspicious\"\n}", "options": { "raw": { "language": "json" } } } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"reportId\", value._id || value.id || value);" ] } } ] }, { "name": "My Reports", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "url": "{{baseUrl}}/reports/me?page=1&limit=20" }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test('Status is 200', function () { pm.response.to.have.status(200); });" ] } } ] }, { "name": "Report Post - Fixed Reason", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/reports", "host": [ "{{baseUrl}}" ], "path": [ "reports" ] }, "body": { "mode": "raw", "raw": "{\n \"targetType\": \"post\",\n \"targetId\": \"{{postId}}\",\n \"reason\": \"{{reportReason}}\",\n \"details\": \"Reported from Postman\"\n}", "options": { "raw": { "language": "json" } } } } }, { "name": "Report User And Block", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/reports", "host": [ "{{baseUrl}}" ], "path": [ "reports" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"targetType\": \"user\",\n \"targetId\": \"{{targetUserId}}\",\n \"reason\": \"harassment\",\n \"details\": \"Unsafe interaction\",\n \"blockTarget\": true\n}", "options": { "raw": { "language": "json" } } } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"reportId\", value._id || value.id || value);" ] } } ] }, { "name": "Report Comment", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{accessToken}}" }, { "key": "Content-Type", "value": "application/json" } ], "url": { "raw": "{{baseUrl}}/reports", "host": [ "{{baseUrl}}" ], "path": [ "reports" ], "query": [] }, "body": { "mode": "raw", "raw": "{\n \"targetType\": \"comment\",\n \"targetId\": \"{{commentId}}\",\n \"reason\": \"harassment\",\n \"details\": \"Offensive comment\"\n}", "options": { "raw": { "language": "json" } } } }, "event": [ { "listen": "test", "script": { "type": "text/javascript", "exec": [ "pm.test(\"Request succeeded\", function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });", "const json = pm.response.json();", "const value = json.item;", "if (value) pm.environment.set(\"reportId\", value._id || value.id || value);" ] } } ] } ] }, { "name": "Health", "item": [ { "name": "Health Check", "request": { "method": "GET", "header": [], "url": { "raw": "{{baseUrl}}/", "host": [ "{{baseUrl}}" ], "path": [] } } } ] } ], "variable": [ { "key": "baseUrl", "value": "http://localhost:4000/api/v1", "type": "string" }, { "key": "accessToken", "value": "", "type": "string" }, { "key": "refreshToken", "value": "", "type": "string" }, { "key": "superAdminAccessToken", "value": "", "type": "string" }, { "key": "superAdminRefreshToken", "value": "", "type": "string" }, { "key": "targetAccessToken", "value": "", "type": "string" }, { "key": "targetRefreshToken", "value": "", "type": "string" }, { "key": "userId", "value": "", "type": "string" }, { "key": "currentUserId", "value": "", "type": "string" }, { "key": "targetUserId", "value": "", "type": "string" }, { "key": "targetUsername", "value": "", "type": "string" }, { "key": "lastFollowingState", "value": "", "type": "string" }, { "key": "notificationUnreadCount", "value": "", "type": "string" }, { "key": "notificationId", "value": "", "type": "string" }, { "key": "postId", "value": "", "type": "string" }, { "key": "ownPostId", "value": "", "type": "string" }, { "key": "targetPostId", "value": "", "type": "string" }, { "key": "adminPostId", "value": "", "type": "string" }, { "key": "commentId", "value": "", "type": "string" }, { "key": "ownCommentId", "value": "", "type": "string" }, { "key": "replyCommentId", "value": "", "type": "string" }, { "key": "conversationId", "value": "", "type": "string" }, { "key": "messageId", "value": "", "type": "string" }, { "key": "sessionJti", "value": "", "type": "string" }, { "key": "registerEmail", "value": "", "type": "string" }, { "key": "registerUsername", "value": "", "type": "string" }, { "key": "adminUserId", "value": "", "type": "string" }, { "key": "targetLoginEmail", "value": "", "type": "string" }, { "key": "targetLoginPassword", "value": "", "type": "string" }, { "key": "resetCode", "value": "", "type": "string" }, { "key": "resetToken", "value": "", "type": "string" }, { "key": "emailVerificationCode", "value": "", "type": "string" }, { "key": "googleIdToken", "value": "", "type": "string" }, { "key": "newPassword", "value": "NewStrongPass123!", "type": "string" }, { "key": "feedCursor", "value": "", "type": "string" }, { "key": "chatConversationsCursor", "value": "", "type": "string" }, { "key": "chatMessagesCursor", "value": "", "type": "string" }, { "key": "adminAccessToken", "value": "", "type": "string" }, { "key": "adminRefreshToken", "value": "", "type": "string" }, { "key": "adminEmail", "value": "store_admin@example.com", "type": "string" }, { "key": "adminUsername", "value": "store_admin_01", "type": "string" }, { "key": "adminPassword", "value": "AdminStrongPass123!", "type": "string" }, { "key": "usersQuery", "value": "user", "type": "string" }, { "key": "usersVerified", "value": "true", "type": "string" }, { "key": "usersSortBy", "value": "createdAt", "type": "string" }, { "key": "listSortOrder", "value": "desc", "type": "string" }, { "key": "commentSortBy", "value": "createdAt", "type": "string" }, { "key": "postVisibility", "value": "public", "type": "string" }, { "key": "postSortBy", "value": "createdAt", "type": "string" }, { "key": "postTypeFilter", "value": "image", "type": "string" }, { "key": "postSearchQuery", "value": "music", "type": "string" }, { "key": "postHashtag", "value": "music", "type": "string" }, { "key": "reelQuery", "value": "reel", "type": "string" }, { "key": "notificationRead", "value": "false", "type": "string" }, { "key": "notificationType", "value": "mention", "type": "string" }, { "key": "notificationResourceType", "value": "post", "type": "string" }, { "key": "feedPreferredPostType", "value": "video", "type": "string" }, { "key": "feedIncludeSuggestions", "value": "true", "type": "string" }, { "key": "feedSuggestionInterval", "value": "4", "type": "string" }, { "key": "feedFollowingOnly", "value": "false", "type": "string" }, { "key": "feedRadiusKm", "value": "30", "type": "string" }, { "key": "homeFeedHasMixedItems", "value": "", "type": "string" }, { "key": "lastViewCount", "value": "", "type": "string" }, { "key": "lastPlayCount", "value": "", "type": "string" }, { "key": "lastShareCount", "value": "", "type": "string" }, { "key": "marketplaceQuery", "value": "oud", "type": "string" }, { "key": "marketplaceMinPrice", "value": "1000", "type": "string" }, { "key": "marketplaceMaxPrice", "value": "5000", "type": "string" }, { "key": "marketplaceIsActive", "value": "true", "type": "string" }, { "key": "marketplaceSortBy", "value": "price", "type": "string" }, { "key": "repairShopQuery", "value": "riyadh", "type": "string" }, { "key": "repairShopIsActive", "value": "true", "type": "string" }, { "key": "repairShopSortBy", "value": "name", "type": "string" }, { "key": "instrumentId", "value": "", "type": "string" }, { "key": "repairShopId", "value": "", "type": "string" }, { "key": "generatedMusicUrl", "value": "", "type": "string" }, { "key": "aiMusicPrompt", "value": "Calm oud melody with light percussion and emotional Arabic mood", "type": "string" }, { "key": "aiMusicDuration", "value": "12", "type": "string" }, { "key": "aiMusicSeed", "value": "42", "type": "string" }, { "key": "listingId", "value": "", "type": "string" }, { "key": "marketplaceListingCategory", "value": "accessory", "type": "string" }, { "key": "marketplaceCondition", "value": "used", "type": "string" }, { "key": "marketplaceInstrumentType", "value": "oud", "type": "string" }, { "key": "talentRole", "value": "instrumentalist", "type": "string" }, { "key": "talentExperienceLevel", "value": "", "type": "string" }, { "key": "usersHasAvatar", "value": "true", "type": "string" }, { "key": "reactionType", "value": "love", "type": "string" }, { "key": "followRequestId", "value": "", "type": "string" }, { "key": "reportId", "value": "", "type": "string" }, { "key": "repostId", "value": "", "type": "string" }, { "key": "quotePostId", "value": "", "type": "string" }, { "key": "replyToMessageId", "value": "" }, { "key": "mediaFilePath", "value": "" }, { "key": "collaboratorId", "value": "" }, { "key": "commentKeyword", "value": "spam" }, { "key": "reportReason", "value": "spam" }, { "key": "sessionId", "value": "" }, { "key": "caseId", "value": "" }, { "key": "historyId", "value": "" }, { "key": "bulkActionTargetId", "value": "" }, { "key": "auditAction", "value": "" } ] }