Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Splitting Routes into multiple files

Tags:

kotlin

ktor

I'm new to Kotlin and Ktor the below is working fine with me as startup, now I need to add more Routes how can I split the routes in multiple files?

package blog

import org.jetbrains.ktor.netty.*
import org.jetbrains.ktor.routing.*
import org.jetbrains.ktor.application.*
import org.jetbrains.ktor.features.*
import org.jetbrains.ktor.host.*
import org.jetbrains.ktor.http.*
import org.jetbrains.ktor.response.*
import org.jetbrains.ktor.request.*     // for recieve
import org.jetbrains.ktor.util.*       // for ValuesMap

import org.apache.commons.mail.*

fun Application.module() {
    install(DefaultHeaders)
    install(CallLogging)
    install(Routing) {
        get("/") {
            call.respondText("""
            My Example Blog2
                <form action="/contact-us" method="post">
                    <input name="subject" placeholder="Subject">
                    <br>
                    <textarea name="message" placeholder="Your message ..."></textarea>
                    <br>
                    <button>Submit</button>
                </form>
            """, ContentType.Text.Html)
        }
        post("/contact-us") {
            val post = call.receive<ValuesMap>() 
            SimpleEmail().apply {
                setHostName("smtp.gmail.com")
                setSmtpPort(465)
                setAuthenticator(DefaultAuthenticator("[email protected]", "my_gmil_passoword"))
                setSSLOnConnect(true)
                setFrom("[email protected]")
                setSubject(post["subject"])        
                setMsg(post["message"])            
                addTo("[email protected]")
            }.send() // will throw email-exception if something is wrong
            call.respondRedirect("/contact-us/success")
        }
        get("/contact-us/success") { 
            call.respondText("Your message was sent", ContentType.Text.Html) 
        }
    }
}

fun main(args: Array<String>) {
    embeddedServer(Netty, 8080, watchPaths = listOf("BlogAppKt"), module = Application::module).start()
}
like image 226
Hasan A Yousef Avatar asked Sep 24 '17 12:09

Hasan A Yousef


Video Answer


1 Answers

Finally I figured it out:

Install routing for the functions name you need, like:

install(Routing) {
        contact()
}

Create a function like fun Route.contact(){ ..} to handle the requisites, so for my example, I created the below:

fun Route.contact(){
        get("/") {
            call.respondText("""
            My Example Blog 12
                <form action="/contact-us" method="post">
                    <input name="subject" placeholder="Subject">
                    <br>
                    <textarea name="message" placeholder="Your message ..."></textarea>
                    <br>
                    <button>Submit</button>
                </form>
            """, ContentType.Text.Html)
        }
        post("/contact-us") {
            val post = call.receive<ValuesMap>() // val userId = registration["userId"]
            SimpleEmail().apply {
                setHostName("smtp.gmail.com")
                setSmtpPort(465)
                setAuthenticator(DefaultAuthenticator("[email protected]", "my_gmil_passoword"))
                setSSLOnConnect(true)
                setFrom("[email protected]")
                setSubject(post["subject"])        
                setMsg(post["message"])            
                addTo("[email protected]")
            }.send() // will throw email-exception if something is wrong
            call.respondRedirect("/contact-us/success")
        }
        get"/contact-us/success") { 
            call.respondText("Your message was sent", ContentType.Text.Html) 
        }
} 
like image 173
Hasan A Yousef Avatar answered Sep 27 '22 18:09

Hasan A Yousef