چت سیستم کانکت
سیستم چت شامل چند بخش می شه که مقداری شان انجام شده و باقی موارد هم رفته رفته انجام و این صفحه آپدیت خواهد شد.
از جمله موارد انجام شده:
- ارسال پیام به کاربر دیگری
- لیست پیام های مربوط به چت خاصی (چت به کاربر اشاره نمی کنه و چیزی مثل گروه هستش)
- لیست پیام های مربوط به کاربری (جدید)
- لیست چت ها (افرادی که باهاشون پیام رد و بدل شده)
ارسال پیام به کاربر دیگر
جهت ارسال پیام به کاربری درخواست POST به ریسورس مریوطه ارسال می کنیم. تنها اطلاعاتی هم که می شه الان ارسال کرد متن می باشد که توسط سرور کانکت پارس نمی شه و همانطوری که ثبت شده، همانگونه هم برگشت داده خواهد شد.
POST https://connect.evand.com/api/users/{USER_ID}/messages
Headers:
- Authorization: Bearer ACCESS_TOKEN
- Content-Type: application/json
{
"message": "Hello"
}
اینجا نیازه که ID کاربر مورد نظر را در uri فوق جایگزین کنید. بجای {USER_ID} .
متن مورد نظری که می خواهید به کاربر ارسال شه را هم در payload ارسالی به عنوان فیلد message نیاز است تعیین کنید.
ریسورس مربوطه نیاز به اهراز هویت داره و نیازه access token کاربر لاگین شده را در هدر Authorization ارسال نمایید.
برای ارسال payload بصورت JSON نیاز از هدر Content-Type و تعیین کننده نوع دیتا (application/json) ارسال نمایید.
لیست پیام های مربوط به چت خاصی
پیام های ارسال بین ۲ کاربر، که الان پشتیبانی می کنیم، بین کاربر های مربوطه به صورت مستقیم و کاربر به کاربر رد و بدل نمی شود و مفهومی به اسم chat داریم که برای ۲ کاربر یه chat ای ساخته می شه که مختص خودشان بوده و فقط خودشان می تونن مشاهده کنن. علاوه بر آن، پیام ها داخل این chat ارسال خواهد شد.
در مورد مطلب قبلی، ارسال پیام به کاربری، که توضیح داده شد هم از همین مفهوم استفاده شده ولی این موارد در پشت صحنه اتفاق می افته و کلاینت از این قضیه با خیر نمی شه.
دلیل اینکه اینجا بهش اشاره می شه و در معرض کلاینت قرار می گیره اینه که بعدها می شه به عنوان گروه استفاده کرد و بیش از ۲ کاربر را پوشش داد و کارهای مختلفی هم می شه انجام داد. مثل گروه های خبری که فقط readonly باشن و از این جمله موارد.
خوب پیام هایی که بین کاربران رد و بدل می شن براشون chat ای ساخته می شه. در نتیجه اگه با چند نفر چت کرده باشیم باید chat های بیشتری، به ازای هر فرد داشته باشیم. و از طریق chat مربوطه می شه به لیست پیام های ارسالی به کاربر مربوطه و پیام های دریافتی از کاربر مربوطه دسترسی داشت و به کاربر نهایی نشان داد.
خوب حالا این همه قصه گفتم تا به این برسم که برای دریافت لیست پیام ها نیاز به id چت (chat) مربوطه هست که از طریقش به ریسورس دیگری درخواست دریافت لیست پیام های رد و بدل شده را بدیم و لیست مربوطه رو بگیریم.
برای دریافت لیست پیام های چت ای به این نحو عمل می کنیم:
GET https://connect.evand.com/api/chats/{CHAT_ID}/messages
Headers:
- Authorization: Bearer ACCESS_TOKEN
اینجا نیازه بجای {CHAT_ID} آی دی چت مربوطه را قرار دهید.
پاسخ برگشتی به این شکل خواهد بود(امیدوارم از لیست مربوطه خوف نکرده باشید) :
{
"_total_items": 3,
"_page": 1,
"_page_count": 2,
"_links": {
"self": {
"href": "http://connect.evand.abc/api/chats/0a8f9dcf-b8a1-4cf6-bcdb-c17d8aed31a9/messages?page=1"
},
"next": {
"href": "http://connect.evand.abc/api/chats/0a8f9dcf-b8a1-4cf6-bcdb-c17d8aed31a9/messages?page=2"
},
"last": {
"href": "http://connect.evand.abc/api/chats/0a8f9dcf-b8a1-4cf6-bcdb-c17d8aed31a9/messages?page=2"
}
},
"_embedded": {
"ChatMessage": [
{
"id": "202727f5-e052-4fb5-a4c0-d2f081ed9f0e",
"body": "Hello 3",
"sentDate": "2019-06-01T11:06:11+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"sender": {
"id": "4db4fc4d-2cf3-4332-92a7-14fc218ed45d",
"name": "hosse",
"surname": "baghaiy",
"avatar": "https://static.evand.net/connect/user/profile/4db4fc4d-2cf3-4332-92a7-14fc218ed45d.jpeg",
"biography": "web developer",
"jobTitle": null,
"organization": "evand#",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"bookmarked": null,
"createdAt": "2019-03-06T11:44:01+0330",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/4db4fc4d-2cf3-4332-92a7-14fc218ed45d"
}
}
}
}
},
{
"id": "7df865e1-814b-45c7-ae0d-7539748481f8",
"body": "Hello 3",
"sentDate": "2019-06-01T11:06:04+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"sender": {
"id": "me",
"email": "baghayi@xzy.org",
"mobile": "+989100000000",
"name": "maral",
"surname": "",
"avatar": "https://static.evand.net/images/events/covers/original/022d05b6f43f41d1edda77caf60a42c0.jpg?x-oss-process=image/resize,h_720",
"biography": "web developer",
"jobTitle": null,
"organization": "evand#",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"profileCompleteness": {
"status": "57%"
},
"totalLogins": null,
"createdAt": "2019-03-06T11:43:10+0330",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/me"
}
}
}
}
}
]
}
}
"_total_items": 3,
"_page": 1,
"_page_count": 2,
"_links": {
"self": {
"href": "
},
"next": {
"href": "
},
"last": {
"href": "
}
},
"_embedded": {
"ChatMessage": [
{
"id": "202727f5-e052-4fb5-a4c0-d2f081ed9f0e",
"body": "Hello 3",
"sentDate": "2019-06-01T11:06:11+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"sender": {
"id": "4db4fc4d-2cf3-4332-92a7-14fc218ed45d",
"name": "hosse",
"surname": "baghaiy",
"avatar": "https://static.evand.net/connect/user/profile/4db4fc4d-2cf3-4332-92a7-14fc218ed45d.jpeg",
"biography": "web developer",
"jobTitle": null,
"organization": "evand#",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"bookmarked": null,
"createdAt": "2019-03-06T11:44:01+0330",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/4db4fc4d-2cf3-4332-92a7-14fc218ed45d"
}
}
}
}
},
{
"id": "7df865e1-814b-45c7-ae0d-7539748481f8",
"body": "Hello 3",
"sentDate": "2019-06-01T11:06:04+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"sender": {
"id": "me",
"email": "baghayi@xzy.org",
"mobile": "+989100000000",
"name": "maral",
"surname": "",
"avatar": "https://static.evand.net/images/events/covers/original/022d05b6f43f41d1edda77caf60a42c0.jpg?x-oss-process=image/resize,h_720",
"biography": "web developer",
"jobTitle": null,
"organization": "evand#",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"profileCompleteness": {
"status": "57%"
},
"totalLogins": null,
"createdAt": "2019-03-06T11:43:10+0330",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/me"
}
}
}
}
}
]
}
}
چند نکته تو لیست وجود داره:
- نوع هر آیتم ChatMessage هستش.
- داخل هر آیتم (هر پیام) یه ارسال کننده پیام هم داریم sender که چون مقدارش آبجکت هست، داخل _embedded قرار گرفته.
- مورد بعدی اینکه در صورتی که ارسال کننده پیام خودمان باشیم آبجکت DetailedUser خواهد بود که براربر اطلاعات کاربری است که وقتی پروفایلش را مشاهده می کنیم. در صورتی هم که ارسال کننده اش شخص دیگری باشه، آبجکت PublicUser خواهد بود. مثل اطلاعات کاربری که وقتی لیست شرکت کننده گان رویدادی رو نگاه می کنیم.
لیست پیام های مربوط به کاربری (جدید)
برای مشاهده پیام های رد و بدل شده با کاربری، درخواستی به ریسورس مربوطه ارسال می کنیم:
GET https://connect.evand.com/api/users/USER_ID/messages
{
"_total_items": 3,
"_page": 1,
"_page_count": 3,
"_links": {
"self": {
"href": "?items_per_page=1&page=1"
},
"next": {
"href": "?items_per_page=1&page=2"
},
"last": {
"href": "?items_per_page=1&page=3"
}
},
"_embedded": {
"ChatMessage": [
{
"id": "d9ede227-e1c0-44b1-8277-ce461540f716",
"body": "last message",
"sentDate": "2019-07-17T20:35:31+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"sender": {
"id": "me",
"email": "hossein2@XYZ.org",
"mobile": "+989100000000",
"name": "hossein",
"surname": "baghayi",
"avatar": null,
"biography": "web developer",
"jobTitle": null,
"organization": "evand",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"profileCompleteness": {
"status": "57%"
},
"totalLogins": null,
"createdAt": "2019-07-17T12:18:58+0430",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/me"
}
}
}
}
}
]
}
}
توجه کنین که در uri مربوط به این ریسورس نیاز هست که آی دی کاربر مربوطه رو بجای USER_ID قرار دهید.
لیست چت ها
لیست چت ها در اصل افرادی هستن که باهاشون پیام تبادل شده است. البته آبجکت کاربران لیست نمی شه و لیستی از چت ها در دسترس خواهد بود که از طریقش می شه به مخاطب مربوطه هم دست پیدا کرد.
برای دریافت لیستی از چت ها بدین نحو عمل می کنیم:
GET https://connect.evand.com/api/chats
Headers:
- Authorization: Bearer ...
{
"_total_items": 1,
"_page": 1,
"_page_count": 1,
"_links": {
"self": {
"href": "https://connect.evand.com/api/chats?page=1"
}
},
"_embedded": {
"Chat": [
{
"id": "0a8f9dcf-b8a1-4cf6-bcdb-c17d8aed31a9",
"updatedAt": "2019-06-01T11:06:11+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"addressee": {
"id": "4db4fc4d-2cf3-4332-92a7-14fc218ed45d",
"name": "hosse",
"surname": "baghaiy",
"avatar": "https://static.evand.net/connect/user/profile/4db4fc4d-2cf3-4332-92a7-14fc218ed45d.jpeg",
"biography": "web developer",
"jobTitle": null,
"organization": "evand",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"bookmarked": null,
"createdAt": "2019-03-06T11:44:01+0330",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/4db4fc4d-2cf3-4332-92a7-14fc218ed45d"
}
}
},
"latestMessage": {
"body": "Hello 3",
"sentDate": "2019-06-01T11:06:11+0430",
"_links": {
"self": {
"href": ""
}
},
"_embedded": {
"sender": {
"id": "9576d1c7-531a-4c42-9b55-46063d468448",
"name": "husen123",
"surname": "",
"avatar": https://static.evand.net/images/events/covers/original/x.jpg",
"biography": "web developer",
"jobTitle": null,
"organization": "evand",
"website": null,
"telegram": null,
"linkedin": null,
"twitter": "@baghayi",
"instagram": null,
"facebook": "baghayi",
"bookmarked": null,
"createdAt": "2019-03-06T11:43:10+0330",
"_links": {
"self": {
"href": "https://connect.evand.com/api/users/9576d1c7-531a-4c42-9b55-46063d468448"
}
}
}
}
}
}
}
]
}
}
در پاسخ برگشتی، چند نکته وجود دارد:
- آی دی چت که برای دریافت پیام هاش بهش نیاز خواهد بود.
- مخاطب (addressee) که همان دریافت کننده پیام می باشد.
- آخرین پیام (latestMessage) که پیام آخر ارسال شده می باشد. می تونه پیام دریافتی و یا ارسال شده باشه.
صفحه بندی و نکاتش
ریسورس هایی که داریم و می شه از طریق شان لیستی از آیتم ها رو داشته باشیم نیاز به صفحه بندی دارن. و اینکه شاید نیاز شه تعداد آیتم های هر صفحه رو هم محدود کرد.
- برای گشت و گذار در صفحات مختلف این چنین ریسورسهایی، پارامتر page رو به ریسورس مریوطه از طریق Query Param ارسال می کنیم.
- برای محدود کردن تعداد آیتم های هر ریسورس می تونید از پارامتر items_per_page استفاده کنید.
** هر دوی این پارامتر ها مقدار عدد می گیرن.
نظرات