Евгений Колесников пре 3 година
родитељ
комит
6b430ea5ad
3 измењених фајлова са 162 додато и 20 уклоњено
  1. 16 4
      articles/f6_demo_1.md
  2. 72 3
      cinema/index.js
  3. 74 13
      cinema/swagger/cinema.yml

+ 16 - 4
articles/f6_demo_1.md

@@ -703,7 +703,7 @@ private fun sendFile(fileUri: Uri) {
 
 Тут всё просто: в горизонтальный **LinearLayout** помещаете три элемента, как в вёрстке, задаёте этому **LinearLayout**-у тег `id` и событие *setOnClickListener* "вешаете" на **LinearLayout**. (Событие *setOnClickListener* объявлено в базовом классе **View**, от которого наследуются все визуальные элементы)
 
-## Экран списка чатов пользователя (Chat List Screen)
+## Экран списка чатов выбранного фильма (Chat List Screen)
 
 ![](../img/f6_021.png)
 
@@ -723,9 +723,13 @@ private fun sendFile(fileUri: Uri) {
 Реализовано отображение аббревиатуры согласно Заданию | 0.3
 **Итого** | 2
 
-### Запрос списка чатов пользователя
+### Запрос списка чатов фильма
 
-Нужно учитывать, что запрос требует авторизации, а в остальном ничего особенного. 
+>АПИ, на мой взгляд, реализовано кривовато, не понятно как попадать в список чатов **пользователя**, я переделал АПИ так, чтобы вы реализовали список чатов фильма, кликнув по его постеру
+
+`GET /chats/{movieId}`
+
+Нужно учитывать, что запрос требует указания идентификатора выбранного фильма, а в остальном ничего особенного. 
 
 >Учитывая, что в информации о чате мы должны показать последнее сообщение из чата, в дата класс надо добавить и свойство для этого сообщения
 
@@ -733,7 +737,7 @@ private fun sendFile(fileUri: Uri) {
 
 В информации о чате мы должны показать последнее сообщение этого чата, поэтому после получения списка чатов мы должны по каждому из них запросить и список сообщений этого чата. Последнее сообщение (тут желательно сделать проверку по дате) этого списка вписать в элемент списка чатов (ищем по Id чата)
 
-`GET {{base_url}}/chats/{{chatId}}/messages`
+`GET /chats/{chatId}/messages`
 
 ### Отображение постера или аббревиатуры фильма
 
@@ -787,6 +791,14 @@ private fun sendFile(fileUri: Uri) {
 
 По клику на стрелку влево (в верхней строке окна) вызвать метод *finish()* активности.
 
+### Вывод всех чатов
+
+Переход из окна профиля по клику на "Обсуждения". 
+
+Метод для получения списка всех чатов: `GET /user/chats`
+
+Activity используйте эту же самую
+
 ## Экран выбранного чата (Chat Screen)
 
 ![](../img/f6_022.png)

+ 72 - 3
cinema/index.js

@@ -46,9 +46,9 @@ const movies = [
 ]
 
 const chats = [
-  {chatId: '1', name: 'Всё о дюне'},
-  {chatId: '2', name: 'Кто такой зелёный рыцарь?'},
-  {chatId: '3', name: 'Петр первый: великий император или разрушитель руси'}
+  {chatId: '1', movieId: 1, name: 'Всё о дюне'},
+  {chatId: '2', movieId: 2, name: 'Кто такой зелёный рыцарь?'},
+  {chatId: '3', movieId: 4, name: 'Петр первый: великий император или разрушитель руси'}
 ]
 
 const chatMessages = []
@@ -234,6 +234,71 @@ function getChatMessage(message, user) {
   }
 }
 
+app.options('/chats/:movieId', cors())
+
+/**
+ * Список чатов фильма (неавторизованный доступ)
+ */
+app.get('/chats/:movieId', cors(), (req,res)=>{
+  try {
+    let result = []
+    for (let i = 0; i < chats.length; i++) {
+      if (chats[i].movieId == req.params.movieId) {
+        result.push(chats[i])
+      }
+    }
+    res.json(result)
+  } catch (error) {
+    res.statusMessage = error.message
+    res.status(401)
+  }
+  res.end()
+})
+
+function findMovieById (movieId) {
+  for (let i = 0; i < movies.length; i++) {
+    if(movies[i].movieId == movieId)
+      return movies[i]
+  }
+  return null
+}
+
+/**
+ * Создание чата для фильма
+ */
+app.post('/chats/:movieId', cors(), (req,res)=>{
+  try {
+    // только авторизованный может добавить чат
+    checkAuth(req)
+
+    const chatName = req.body.name.trim()
+    if (chatName == '') 
+      throw new Error('Empty chat name')
+
+    const movie = findMovieById(req.params.movieId)
+    if(movie == null)
+      throw new Error('Movie Id not found')  
+
+    let chat = null
+    let maxChatId = 0
+    for (let i = 0; i < chats.length; i++) {
+      maxChatId = Math.max(maxChatId, chats[i].chatId)
+      if(chats[i].name == chatName && chats[i].movieId == req.params.movieId) {
+        chat = chats[i]
+      }
+    }
+    if (chat == null) {
+      chat = {chatId: (maxChatId+1).toString(), movieId: req.params.movieId, chatName}
+      chats.push(chat)
+    }
+    res.json(chat)
+  } catch (error) {
+    res.statusMessage = error.message
+    res.status(400)
+  }
+  res.end()
+})
+
 app.options('/chats/:chatId/messages', cors())
 app.get('/chats/:chatId/messages', cors(), (req,res)=>{
   try {
@@ -268,6 +333,10 @@ function dateToMysql(xDate) {
 app.post('/chats/:chatId/messages', cors(), (req,res)=>{
   try {
     let user = checkAuth(req)
+
+    if (req.body.text.trim() == '') 
+      throw new Error('Empty text')
+
     let newMessage = {
       chatId: req.params.chatId,
       messageId: chatMessages.length + 1,

+ 74 - 13
cinema/swagger/cinema.yml

@@ -191,7 +191,7 @@ paths:
         - user
       security:
         - BearerAuth: []
-      summary: Список чатов, в которых учавствует данный пользователь
+      summary: Список чатов
       description: Необходимо передать header параметр авторизации типа Bearer
       responses:
         '200':
@@ -199,7 +199,9 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/Chat'
+                type: array
+                items:
+                  $ref: '#/components/schemas/Chat'
         '401':
           description: Неавторизованный доступ
   /chats/{chatId}/messages:
@@ -263,6 +265,63 @@ paths:
           description: Проблемы при сохранении
         '401':
           description: Неавторизированный доступ
+  /chats/{movieId}:
+    get:
+      tags:
+        - user
+      summary: Список чатов фильма
+      description: Необходимо передать header параметр авторизации типа Bearer
+      parameters:
+        - in: path
+          name: movieId
+          schema:
+            type: integer
+          required: true
+          description: Id фильма
+      responses:
+        '200':
+          description: Массив чатов
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/Chat'
+        '400':
+          description: Фильм не найден
+    post:
+      tags:
+        - user
+      security:
+        - BearerAuth: []
+      summary: Создать чат (для фильма)
+      description: Необходимо передать header параметр авторизации типа Bearer
+      parameters:
+        - in: path
+          name: movieId
+          schema:
+            type: integer
+          required: true
+          description: Id фильма
+      requestBody:
+        required: true
+        content: 
+          application/json:
+            schema:
+              type: object
+              properties:
+                name:
+                  type: string
+                  example: Название чата
+      responses:
+        '200':
+          description: Информация о созданном чате
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Chat'
+        '401':
+          description: Неавторизованный доступ
   /up/images/{imageName}:
     get:
       tags:
@@ -354,17 +413,19 @@ components:
             example: ekolesnikov.jpg
             description: Название файла
     Chat:
-      type: array
-      items:
-        type: object
-        properties:
-          name:
-            type: string
-            description: Название чата
-            example: Дюна
-          chatId: 
-            type: string
-            example: 1
+      type: object
+      properties:
+        name:
+          type: string
+          description: Название чата
+          example: Дюна
+        chatId: 
+          type: string
+          example: 1
+        movieId:
+          type: string
+          example: 1
+          description: Id фильма
     Message:
       type: object
       properties: