Things are stable enought to start.
This commit is contained in:
parent
0e1d0ca588
commit
1b8e514476
1
.idea/.name
Normal file
1
.idea/.name
Normal file
@ -0,0 +1 @@
|
|||||||
|
cvApi
|
@ -1,10 +1,12 @@
|
|||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
|
id("com.squareup.sqldelight")
|
||||||
kotlin("jvm") version "1.7.10"
|
kotlin("jvm") version "1.7.10"
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "fr.louveau-amine"
|
group = "fr.louveauAmine"
|
||||||
version = "1.0-SNAPSHOT"
|
version = "1.0-SNAPSHOT"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
@ -15,6 +17,7 @@ dependencies {
|
|||||||
testImplementation(kotlin("test"))
|
testImplementation(kotlin("test"))
|
||||||
implementation("io.javalin:javalin:4.6.4")
|
implementation("io.javalin:javalin:4.6.4")
|
||||||
implementation("org.slf4j:slf4j-simple:2.0.1")
|
implementation("org.slf4j:slf4j-simple:2.0.1")
|
||||||
|
implementation("com.squareup.sqldelight:sqlite-driver:1.5.3")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.test {
|
tasks.test {
|
||||||
@ -24,3 +27,10 @@ tasks.test {
|
|||||||
tasks.withType<KotlinCompile> {
|
tasks.withType<KotlinCompile> {
|
||||||
kotlinOptions.jvmTarget = "1.8"
|
kotlinOptions.jvmTarget = "1.8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sqldelight {
|
||||||
|
database("CVApiDB") {
|
||||||
|
packageName = "fr.louveauAmine.cvApi.dao"
|
||||||
|
sourceFolders = listOf("sqldelight")
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
jcenter()
|
||||||
|
google()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
|
||||||
rootProject.name = "cv-api"
|
resolutionStrategy {
|
||||||
|
eachPlugin {
|
||||||
|
if (requested.id.id == "com.squareup.sqldelight") {
|
||||||
|
useModule("com.squareup.sqldelight:gradle-plugin:1.5.3")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootProject.name = "cvApi"
|
||||||
|
|
||||||
|
27
src/main/kotlin/controller/EducationYearController.kt
Normal file
27
src/main/kotlin/controller/EducationYearController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class EducationYearController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/kotlin/controller/InterestController.kt
Normal file
27
src/main/kotlin/controller/InterestController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class InterestController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/kotlin/controller/JobController.kt
Normal file
27
src/main/kotlin/controller/JobController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class JobController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/kotlin/controller/LanguageController.kt
Normal file
27
src/main/kotlin/controller/LanguageController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class LanguageController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
7
src/main/kotlin/controller/MeController.kt
Normal file
7
src/main/kotlin/controller/MeController.kt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
class MeController {
|
||||||
|
fun getMe() {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
}
|
27
src/main/kotlin/controller/ProfileController.kt
Normal file
27
src/main/kotlin/controller/ProfileController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class ProfileController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/kotlin/controller/SideProjectController.kt
Normal file
27
src/main/kotlin/controller/SideProjectController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class SideProjectController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/kotlin/controller/TagController.kt
Normal file
27
src/main/kotlin/controller/TagController.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import io.javalin.apibuilder.CrudHandler
|
||||||
|
import io.javalin.http.Context
|
||||||
|
|
||||||
|
class TagController : CrudHandler {
|
||||||
|
override fun create(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun delete(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAll(ctx: Context) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getOne(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun update(ctx: Context, resourceId: String) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,50 @@
|
|||||||
|
import com.squareup.sqldelight.db.SqlDriver
|
||||||
|
import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver
|
||||||
|
import controller.*
|
||||||
|
import fr.louveauAmine.cvApi.dao.CVApiDB
|
||||||
|
import fr.louveauAmine.cvApi.dao.PROFILE
|
||||||
import io.javalin.Javalin
|
import io.javalin.Javalin
|
||||||
|
import io.javalin.apibuilder.ApiBuilder
|
||||||
|
import io.javalin.core.security.RouteRole
|
||||||
|
|
||||||
|
enum class ApiRole : RouteRole { PUBLIC, BASIC_AUTHED }
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
val app = Javalin.create().start(7070)
|
val driver: SqlDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
|
||||||
app.get("/") { ctx -> ctx.result("Hello World") }
|
CVApiDB.Schema.create(driver)
|
||||||
|
val database = CVApiDB(driver)
|
||||||
|
|
||||||
|
database.profileQueries.insertProfile(PROFILE("Amine Louveau", "truc", "tata", "prout", null, null, null, null))
|
||||||
|
|
||||||
|
val app = Javalin.create{
|
||||||
|
it.accessManager { handler, ctx, permittedRoles ->
|
||||||
|
val auth = ctx.header("Authorization").orEmpty()
|
||||||
|
val isBasicAuthed = auth == System.getenv("LDC_AUTH")
|
||||||
|
when {
|
||||||
|
permittedRoles.contains(ApiRole.PUBLIC) -> handler.handle(ctx)
|
||||||
|
permittedRoles.contains(ApiRole.BASIC_AUTHED) && isBasicAuthed -> handler.handle(ctx)
|
||||||
|
else -> ctx.status(401).json("Unauthorized")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.start(7070)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.routes {
|
||||||
|
ApiBuilder.path("api") {
|
||||||
|
ApiBuilder.get("me", {
|
||||||
|
MeController().getMe()
|
||||||
|
}, ApiRole.BASIC_AUTHED)
|
||||||
|
|
||||||
|
ApiBuilder.crud("education/{education-id}", EducationYearController(), ApiRole.BASIC_AUTHED)
|
||||||
|
ApiBuilder.crud("interest/{interest-id}", InterestController(), ApiRole.BASIC_AUTHED)
|
||||||
|
ApiBuilder.crud("job/{job-id}", JobController(), ApiRole.BASIC_AUTHED)
|
||||||
|
ApiBuilder.crud("language/{lang-id}", LanguageController(), ApiRole.BASIC_AUTHED)
|
||||||
|
ApiBuilder.crud("profile/{profile-id}", ProfileController(), ApiRole.BASIC_AUTHED)
|
||||||
|
ApiBuilder.crud("side-project/{side-id}", SideProjectController(), ApiRole.BASIC_AUTHED)
|
||||||
|
ApiBuilder.crud("tag/{tag-id}", TagController(), ApiRole.BASIC_AUTHED)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
CREATE TABLE EDUCATIONYEAR (
|
||||||
|
`endDate` TEXT NOT NULL,
|
||||||
|
`school` TEXT NOT NULL,
|
||||||
|
`name` TEXT NOT NULL,
|
||||||
|
PRIMARY KEY(`endDate`, `school`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX educationyear_date_school ON EDUCATIONYEAR(`endDate`, `school`);
|
||||||
|
|
||||||
|
educationYears:
|
||||||
|
SELECT * FROM EDUCATIONYEAR;
|
||||||
|
|
||||||
|
insertEducationYear:
|
||||||
|
INSERT OR REPLACE INTO EDUCATIONYEAR VALUES ?;
|
||||||
|
|
||||||
|
deleteEducationYear:
|
||||||
|
DELETE FROM EDUCATIONYEAR WHERE `endDate` = ? AND `school` = ?;
|
16
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Interests.sq
Normal file
16
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Interests.sq
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
CREATE TABLE INTEREST (
|
||||||
|
`theme` TEXT NOT NULL,
|
||||||
|
`description` TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (`theme`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX interest_key ON INTEREST(`theme`);
|
||||||
|
|
||||||
|
interests:
|
||||||
|
SELECT * FROM INTEREST;
|
||||||
|
|
||||||
|
insertInterest:
|
||||||
|
INSERT OR REPLACE INTO INTEREST VALUES ?;
|
||||||
|
|
||||||
|
deleteInterest:
|
||||||
|
DELETE FROM INTEREST WHERE `theme` = ?;
|
19
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Jobs.sq
Normal file
19
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Jobs.sq
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
CREATE TABLE JOB (
|
||||||
|
`jobTitle` TEXT NOT NULL,
|
||||||
|
`start` TEXT NOT NULL,
|
||||||
|
`end` TEXT NOT NULL,
|
||||||
|
`company` TEXT NOT NULL,
|
||||||
|
`tasks` TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (`start`, `end`, `company`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX job_index ON JOB(`start`, `end`, `company`);
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
SELECT * FROM JOB;
|
||||||
|
|
||||||
|
insertJob:
|
||||||
|
INSERT OR REPLACE INTO JOB VALUES ?;
|
||||||
|
|
||||||
|
deleteJob:
|
||||||
|
DELETE FROM JOB WHERE `start` = ? AND `end` = ? AND `company` = ?;
|
16
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Languages.sq
Normal file
16
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Languages.sq
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
CREATE TABLE LANGUAGE (
|
||||||
|
`lang` TEXT NOT NULL,
|
||||||
|
`level` TEXT NOT NULL,
|
||||||
|
PRIMARY KEY(`lang`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX lang_lang ON LANGUAGE(`lang`);
|
||||||
|
|
||||||
|
langs:
|
||||||
|
SELECT * FROM LANGUAGE;
|
||||||
|
|
||||||
|
insertLang:
|
||||||
|
INSERT OR REPLACE INTO LANGUAGE VALUES ?;
|
||||||
|
|
||||||
|
deleteLang:
|
||||||
|
DELETE FROM LANGUAGE WHERE `lang` = ?;
|
16
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Migrations.sq
Normal file
16
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Migrations.sq
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
CREATE TABLE MIGRATION (
|
||||||
|
`identifier` TEXT NOT NULL,
|
||||||
|
`done` INTEGER AS Boolean DEFAULT 0 NOT NULL,
|
||||||
|
PRIMARY KEY (`identifier`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX migration_index ON MIGRATION(`identifier`);
|
||||||
|
|
||||||
|
migrations:
|
||||||
|
SELECT * FROM MIGRATION;
|
||||||
|
|
||||||
|
insertMigration:
|
||||||
|
INSERT OR REPLACE INTO MIGRATION VALUES ?;
|
||||||
|
|
||||||
|
deleteMigration:
|
||||||
|
DELETE FROM MIGRATION WHERE `identifier` = ?;
|
22
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Profile.sq
Normal file
22
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Profile.sq
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
CREATE TABLE PROFILE (
|
||||||
|
`name` TEXT NOT NULL,
|
||||||
|
`title` TEXT NOT NULL,
|
||||||
|
`quote` TEXT NOT NULL,
|
||||||
|
`picture` TEXT NOT NULL,
|
||||||
|
`email` TEXT,
|
||||||
|
`phone` TEXT,
|
||||||
|
`linkedin` TEXT,
|
||||||
|
`source` TEXT,
|
||||||
|
PRIMARY KEY (`name`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX profile_name ON PROFILE(`name`);
|
||||||
|
|
||||||
|
profiles:
|
||||||
|
SELECT * FROM PROFILE;
|
||||||
|
|
||||||
|
insertProfile:
|
||||||
|
INSERT OR REPLACE INTO PROFILE VALUES ?;
|
||||||
|
|
||||||
|
deleteProfile:
|
||||||
|
DELETE FROM PROFILE WHERE `name` = ?;
|
@ -0,0 +1,23 @@
|
|||||||
|
CREATE TABLE SIDEPROJECT (
|
||||||
|
`description` TEXT NOT NULL,
|
||||||
|
`title` TEXT,
|
||||||
|
`url` TEXT,
|
||||||
|
`category` TEXT NOT NULL ,
|
||||||
|
PRIMARY KEY (`description`, `title`, `url`, `category`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX sideproject_index ON SIDEPROJECT(`description`, `title`, `url`, `category`);
|
||||||
|
|
||||||
|
sideProjects:
|
||||||
|
SELECT * FROM SIDEPROJECT;
|
||||||
|
|
||||||
|
sideProjectsByCategory:
|
||||||
|
SELECT * FROM SIDEPROJECT
|
||||||
|
GROUP BY `category`
|
||||||
|
ORDER BY COUNT(`category`) DESC;
|
||||||
|
|
||||||
|
insertSideProject:
|
||||||
|
INSERT OR REPLACE INTO SIDEPROJECT VALUES ?;
|
||||||
|
|
||||||
|
deleteSideProject:
|
||||||
|
DELETE FROM SIDEPROJECT WHERE `description` = ? AND `category` = ?;
|
17
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Tags.sq
Normal file
17
src/main/sqldelight/fr/louveauAmine/cvApi/dao/Tags.sq
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CREATE TABLE TAG (
|
||||||
|
`name` TEXT NOT NULL,
|
||||||
|
`workThing` INTEGER AS Boolean DEFAULT 1 NOT NULL,
|
||||||
|
`category` TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (`name`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX tag_name ON TAG(`name`);
|
||||||
|
|
||||||
|
tags:
|
||||||
|
SELECT * FROM TAG;
|
||||||
|
|
||||||
|
insertTag:
|
||||||
|
INSERT OR REPLACE INTO TAG VALUES ?;
|
||||||
|
|
||||||
|
deleteTag:
|
||||||
|
DELETE FROM TAG WHERE `name` = ? AND `category` = ?;
|
Loading…
Reference in New Issue
Block a user