Commit d597fc1d authored by Chiraz Boukadida's avatar Chiraz Boukadida
Browse files

[fix,#31] with docker upload docx file

parent 0e711893
Pipeline #73987 passed with stages
in 2 minutes and 36 seconds
**1. Sprint: 28.4. - 12.5** ##1. Sprint: 28.4. - 12.5
**Sprintziel:** **Sprintziel:**
Extrahierung einzelner Fragen und dazugehörigen Antworten von unterschiedlichen Medien. Extrahierung einzelner Fragen und dazugehörigen Antworten von unterschiedlichen Medien.
Persistierung der ausgelesenen Daten. Persistierung der ausgelesenen Daten.
#27 Definition guter Testfälle und Beispiele (FAQ, ...) * \#27 Definition guter Testfälle und Beispiele (FAQ, ...)
#41 Spike: Fragengenerierung * \#41 Spike: Fragengenerierung
#25 Recherche/Definition Endpoints * \#25 Recherche/Definition Endpoints
#26 Chatbot-Vokabeln * \#26 Chatbot-Vokabeln
#32 Definition einer sinnvollen JSON-Konfiguration mit konkreten Beispielen * \#32 Definition einer sinnvollen JSON-Konfiguration mit konkreten Beispielen
#33 Abbildung der JSON-Konfiguration in eine geeignete Kotlin-Datenstruktur und Implementation des zugehörigen Endpoints * \#33 Abbildung der JSON-Konfiguration in eine geeignete Kotlin-Datenstruktur und Implementation des zugehörigen Endpoints
#30 Implementation Endpoint Hochladen einer DOCX-Datei * \#30 Implementation Endpoint Hochladen einer DOCX-Datei
#31 Implementation Endpoint Hochladen einer DOCX-FAQ-Datei mit Änderungen * \#31 Implementation Endpoint Hochladen einer DOCX-FAQ-Datei mit Änderungen
#34 Definition einer MongoDB-Struktur * \#34 Definition einer MongoDB-Struktur
#36 Methoden zum Lesen, Schreiben und Ändern der MongoDB * \#36 Methoden zum Lesen, Schreiben und Ändern der MongoDB
#38 Extraction von Fragen und Antworten einer HTML-FAQ-Datei auf Basis einer Konfiguration * \#38 Extraction von Fragen und Antworten einer HTML-FAQ-Datei auf Basis einer Konfiguration
#37 Extraction von Fragen und Antworten einer DOCX-FAQ-Datei auf Basis einer Konfiguration * \#37 Extraction von Fragen und Antworten einer DOCX-FAQ-Datei auf Basis einer Konfiguration
#39 Daten in die MongoDB schreiben und Zusammenfassung einbinden * \#39 Daten in die MongoDB schreiben und Zusammenfassung einbinden
#28 Überarbeitung ID-Generierung * \#28 Überarbeitung ID-Generierung
#40 Einlesen und Parsen einer HTML-Seite mit JSOUP, Zerlegen in semantische Blöcke * \#40 Einlesen und Parsen einer HTML-Seite mit JSOUP, Zerlegen in semantische Blöcke
**2. Sprint: 12.5. - 9.6** ##2. Sprint: 12.5. - 9.6
**Sprintziel:** **Sprintziel:**
Extrahierung einzelner Fragen und dazugehörigen Antworten von unterschiedlichen Medien. Extrahierung einzelner Fragen und dazugehörigen Antworten von unterschiedlichen Medien.
Fragemöglichkeit generieren. Persistierung der ausgelesenen Daten. Fragemöglichkeit generieren. Persistierung der ausgelesenen Daten.
#27 Definition guter Testfälle und Beispiele (FAQ, ...) * \#27 Definition guter Testfälle und Beispiele (FAQ, ...)
#41 Spike: Fragengenerierung * \#41 Spike: Fragengenerierung
#25 Recherche/Definition Endpoints * \#25 Recherche/Definition Endpoints
#26 Chatbot-Vokabeln * \#26 Chatbot-Vokabeln
#33 Abbildung der JSON-Konfiguration in eine geeignete Kotlin-Datenstruktur und Implementation des zugehörigen Endpoints * \#33 Abbildung der JSON-Konfiguration in eine geeignete Kotlin-Datenstruktur und Implementation des zugehörigen Endpoints
#30 Implementation Endpoint Hochladen einer DOCX-Datei * \#30 Implementation Endpoint Hochladen einer DOCX-Datei
#31 Implementation Endpoint Hochladen einer DOCX-FAQ-Datei mit Änderungen * \#31 Implementation Endpoint Hochladen einer DOCX-FAQ-Datei mit Änderungen
#34 Definition einer MongoDB-Struktur * \#34 Definition einer MongoDB-Struktur
#36 Methoden zum Lesen, Schreiben und Ändern der MongoDB * \#36 Methoden zum Lesen, Schreiben und Ändern der MongoDB
#38 Extraction von Fragen und Antworten einer HTML-FAQ-Datei auf Basis einer Konfiguration * \#38 Extraction von Fragen und Antworten einer HTML-FAQ-Datei auf Basis einer Konfiguration
#37 Extraction von Fragen und Antworten einer DOCX-FAQ-Datei auf Basis einer Konfiguration * \#37 Extraction von Fragen und Antworten einer DOCX-FAQ-Datei auf Basis einer Konfiguration
#39 Daten in die MongoDB schreiben und Zusammenfassung einbinden * \#39 Daten in die MongoDB schreiben und Zusammenfassung einbinden
#28 Überarbeitung ID-Generierung * \#28 Überarbeitung ID-Generierung
#40 Einlesen und Parsen einer HTML-Seite mit JSOUP, Zerlegen in semantische Blöcke * \#40 Einlesen und Parsen einer HTML-Seite mit JSOUP, Zerlegen in semantische Blöcke
#43 Question Generator * \#43 Question Generator
#55 Fragemöglichkeit mit Chatette generieren * \#55 Fragemöglichkeit mit Chatette generieren
#56 Fragemöglichkeit mit Bibliothek Question Generator generieren * \#56 Fragemöglichkeit mit Bibliothek Question Generator generieren
**3. Sprint: 9.6. - 7.7** **3. Sprint: 9.6. - 7.7**
...@@ -11,6 +11,8 @@ services: ...@@ -11,6 +11,8 @@ services:
build: ktor-server build: ktor-server
ports: ports:
- 8080:8080 - 8080:8080
volumes:
- ./ktor-server/uploads:/home/gradle/src/build/install/ktor-server/bin/uploads
openapi_validator: openapi_validator:
build: docker-openapi-validator build: docker-openapi-validator
......
...@@ -4,5 +4,6 @@ WORKDIR /home/gradle/src ...@@ -4,5 +4,6 @@ WORKDIR /home/gradle/src
RUN gradle clean installDist --no-daemon RUN gradle clean installDist --no-daemon
EXPOSE 8080 EXPOSE 8080
WORKDIR /home/gradle/src/build/install/ktor-server/bin WORKDIR /home/gradle/src/build/install/ktor-server/bin
RUN mkdir -p /home/gradle/src/build/install/ktor-server/bin/uploads
CMD ./ktor-server CMD ./ktor-server
package de.h_da.fbi.smebt.intentfinder.server package de.h_da.fbi.smebt.intentfinder.server
import de.h_da.fbi.smebt.intentfinder.server.nlp.PythonBridge import de.h_da.fbi.smebt.intentfinder.server.nlp.PythonBridge
import de.h_da.fbi.smebt.intentfinder.server.upload.registerApiRoutes
import io.ktor.application.* import io.ktor.application.*
import io.ktor.features.* import io.ktor.features.*
...@@ -21,8 +22,8 @@ import java.text.SimpleDateFormat ...@@ -21,8 +22,8 @@ import java.text.SimpleDateFormat
import java.util.* import java.util.*
import io.ktor.http.content.* import io.ktor.http.content.*
@Serializable //@Serializable
data class FileStatus(val path: String, val status: String) //data class FileStatus(val path: String, val status: String)
...@@ -53,96 +54,8 @@ fun Application.module(testing: Boolean = false) { ...@@ -53,96 +54,8 @@ fun Application.module(testing: Boolean = false) {
get("/") { get("/") {
call.respondText("IntentFinder is available") call.respondText("IntentFinder is available")
} }
// Definition eines Endpunkts zum Hochladen einer DOCX-Datei
post("/{chatbotId}/file") {
var fileDescription = ""
var fileName = ""
var status = "error"
val multipartData = call.receiveMultipart()
val pathFile = call.parameters["chatbotId"].toString()
val pathAsFile = File("uploads/$pathFile")
if (!Files.exists(Paths.get(pathFile))) {
pathAsFile.mkdir()
}
multipartData.forEachPart { part ->
when (part) {
is PartData.FormItem -> {
fileDescription = part.value
}
is PartData.FileItem -> {
fileName = part.originalFileName as String
var fileBytes = part.streamProvider().readBytes()
val file = File("uploads/$pathFile/$fileName")
if (!file.exists()) {
file.createNewFile()
file.writeBytes(fileBytes)
status = "created"
} else {
call.respond(HttpStatusCode.InternalServerError, "file alredy exist")
}
}
}
}
call.respond(FileStatus(path = "'uploads/$pathFile/$fileName'", status = "$status"))
}
// Definition endpoint zur Änderung eine bereits existierende docx
put("/{chatbotId}/file/{id}/{filename}") {
var fileDescription = ""
var fileName = ""
var newName = ""
val name = call.parameters["filename"].toString()
val pathFile = call.parameters["chatbotId"].toString()
var status = "error"
val file = File("uploads/$pathFile/$name ")
val multipartData = call.receiveMultipart()
var fileContent = ""
multipartData.forEachPart { part ->
when (part) {
is PartData.FormItem -> {
if (part.name.toString().equals("description")) {
fileDescription = part.value
}
if (part.name.toString().equals("id")) {
var fileId = part.value
if (!fileId.equals(call.parameters["id"].toString()))
call.respond(HttpStatusCode.NotFound)
}
}
is PartData.FileItem -> {
if (file.exists()) {
fileName = part.originalFileName as String
val time = System.currentTimeMillis()
val date = Date(time)
val format = SimpleDateFormat("yyMMddHHmm")
val current = format.format(date)
newName = file.nameWithoutExtension +"_"+ current + "." + file.extension
var fileBytes = part.streamProvider().readBytes()
File("uploads/$pathFile/$newName").writeBytes(fileBytes)
fileContent = part.streamProvider().reader().readText()
status = "updated"
} else {
call.respond(HttpStatusCode.NotFound, "file not found")
}
}
}
}
call.respond(FileStatus(path = "'uploads/$pathFile/$newName'", status = "$status"))
}
} }
registerApiRoutes()
registerUploadRoutes() registerUploadRoutes()
} }
class InternalServerErrorException : RuntimeException() class InternalServerErrorException : RuntimeException()
......
package de.h_da.fbi.smebt.intentfinder.server.upload
import io.ktor.application.*
import io.ktor.http.*
import io.ktor.http.content.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import kotlinx.serialization.Serializable
import java.text.SimpleDateFormat
import java.util.*
@Serializable
data class FileStatus(val path: String, val status: String)
fun Route.apiRouting() {
route("/") {
post("{chatbotId}/file") {
var fileDescription = ""
var fileName = ""
var status = "error"
var path=""
val multipartData = call.receiveMultipart()
val pathFile = call.parameters["chatbotId"].toString()
val pathAsFile = File("uploads/$pathFile")
if (!Files.exists(Paths.get(pathFile))) {
pathAsFile.mkdir()
}
multipartData.forEachPart { part ->
when (part) {
is PartData.FormItem -> {
fileDescription = part.value
}
is PartData.FileItem -> {
fileName = part.originalFileName as String
var fileBytes = part.streamProvider().readBytes()
val file = File("uploads/$pathFile/$fileName")
if (!file.exists()) {
file.createNewFile()
file.writeBytes(fileBytes)
status = "created"
path= file.path
} else {
call.respond(HttpStatusCode.InternalServerError, "file alredy exist")
}
}
}
}
//'uploads/$pathFile/$fileName'
call.respond(FileStatus(path = "$path", status = "$status"))
}
put("{chatbotId}/file/{id}/{filename}") {
var fileDescription = ""
var fileName = ""
var newName = ""
val name = call.parameters["filename"].toString()
val pathFile = call.parameters["chatbotId"].toString()
var status = "error"
var file = File("uploads/$pathFile/$name")
val multipartData = call.receiveMultipart()
var fileContent = ""
multipartData.forEachPart { part ->
when (part) {
is PartData.FormItem -> {
if (part.name.toString().equals("description")) {
fileDescription = part.value
}
if (part.name.toString().equals("id")) {
var fileId = part.value
if (!fileId.equals(call.parameters["id"].toString()))
call.respond(HttpStatusCode.NotFound)
}
}
is PartData.FileItem -> {
if (file.exists()) {
fileName = part.originalFileName as String
val time = System.currentTimeMillis()
val date = Date(time)
val format = SimpleDateFormat("yyMMddHHmm")
val current = format.format(date)
newName = file.nameWithoutExtension +"_"+ current + "." + file.extension
var fileBytes = part.streamProvider().readBytes()
File("uploads/$pathFile/$newName").writeBytes(fileBytes)
fileContent = part.streamProvider().reader().readText()
status = "updated"
} else {
call.respond(HttpStatusCode.NotFound, "file not found")
}
}
}
}
call.respond(FileStatus(path = "'/uploads/$pathFile/$newName'", status = "$status"))
}
}
}
fun Application.registerApiRoutes() {
routing {
apiRouting()
}
}
...@@ -77,7 +77,7 @@ scipy==1.6.2 ...@@ -77,7 +77,7 @@ scipy==1.6.2
protobuf==3.16.0 protobuf==3.16.0
summarizer~=0.0.7 summarizer~=0.0.7
en_core_web_sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz
sacremoses==0.0.43 sacremoses==0.0.43
sentencepiece==0.1.94 sentencepiece==0.1.94
tokenizers==0.9.4 tokenizers==0.9.4
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment