Created
August 6, 2020 00:52
-
-
Save andipyk/37caabeda3304e2cbe0bab62a8a6efb2 to your computer and use it in GitHub Desktop.
tugas 04 - parkir api
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bytes" | |
"encoding/json" | |
"fmt" | |
"github.com/gorilla/mux" | |
"log" | |
"net/http" | |
"time" | |
) | |
type Kendaraan struct { | |
ID string `json:"id"` | |
WaktuMasuk [4]int `json:"waktu_masuk"` | |
} | |
type Tagihan struct { | |
Bayar int `json:"bayar"` | |
Plat string `json:"plat"` | |
Tipe string `json:"tipe"` | |
Waktu int `json:"waktu"` | |
} | |
func (k Kendaraan) Masuk() { | |
fmt.Println("id : ", k.ID) | |
fmt.Println("Waktu Masuk :", k.WaktuMasuk) | |
} | |
func (k Kendaraan) Keluar(WaktuKeluar [4]int, Tipe string, platKendaraan string) { | |
mobilDetPertama := 5_000 | |
motorDetPertama := 3_000 | |
mobilPerSecond := 3_000 | |
motorPerSecond := 2_000 | |
selesihArray, selisihDay := rangeTime(k.WaktuMasuk, WaktuKeluar) | |
if selisihDay >= 1 { | |
bayar := 300_000_000 //tarif flat bayar jika > 1 hari | |
fmt.Printf("%s parkir sudah lewat %d hari.\nAnda harus membayar %d ", platKendaraan, selesihArray[1], bayar) | |
return | |
} | |
selisihSecond := convertToSecond(selesihArray) | |
if Tipe == "mobil" { | |
bayar := mobilDetPertama + (mobilPerSecond * (selisihSecond - 1)) | |
fmt.Println("Yang harus dibayar : ", bayar) | |
fmt.Printf("%s telah parkir MOBIL selama %d detik\n", platKendaraan, selisihSecond) | |
} else if Tipe == "motor" { | |
bayar := motorDetPertama + (motorPerSecond * (selisihSecond - 1)) | |
fmt.Println("Yang harus dibayar : ", bayar) | |
fmt.Printf("%s telah parkir MOTOR selama %d detik\n", platKendaraan, selisihSecond) | |
} else { | |
fmt.Println("ada masalah bray") | |
} | |
} | |
//var kendaraan map[string]Kendaraan // dari HTTP GET & JSON | |
type Waktu struct { | |
WaktuMasuk time.Time `json:"waktu_masuk"` | |
} | |
type Keluar struct { | |
Tipe string `json:"tipe"` | |
Plat string `json:"plat"` | |
} | |
func main() { | |
menu := 0 // inisiasi menu | |
for menu != 4 { | |
fmt.Println("==== ANDI PARKING ☕ ====") | |
fmt.Println("1. Kendaraan Masuk") | |
fmt.Println("2. Kendaraan Keluar") | |
fmt.Println("3. Listen API") | |
fmt.Println("4. Exit") | |
menu = ScanPilihan() | |
switch menu { | |
case 1: | |
// =============== MASUK =============== | |
waktu := Waktu{time.Now()} | |
jsonReq, err := json.Marshal(waktu) | |
resp, err := http.Post("http://127.0.0.1:8080/parkir/server/masuk", "application/json; charset=utf-8", bytes.NewBuffer(jsonReq)) | |
if err != nil { | |
log.Fatalln(err) | |
}else { | |
var kendaraan Kendaraan | |
_ = json.NewDecoder(resp.Body).Decode(&kendaraan) | |
// =============== PRINT ALL KENDARAAN =============== | |
fmt.Println("Key:", kendaraan.ID, "Value:", kendaraan.WaktuMasuk) | |
} | |
case 2: | |
// =============== PRINT ALL KENDARAAN =============== | |
response, err := http.Get("http://127.0.0.1:8080/parkir/server") | |
var kendaraan map[string]Kendaraan | |
if err != nil { | |
fmt.Printf("The HTTP request failed with error %s\n", err) | |
} else { | |
_ = json.NewDecoder(response.Body).Decode(&kendaraan) | |
for key, value := range kendaraan { | |
fmt.Println("Key:", key, "Value:", value) | |
} | |
} | |
idKendaraan := ScanString() | |
if value, found := kendaraan[idKendaraan]; found { | |
fmt.Println(value) | |
fmt.Println("Tipe Kendaraan mobil/motor") | |
tipeKendaraan := ScanString() | |
fmt.Println("plat kendaraan") | |
platKendaraan := ScanString() | |
keluar := Keluar{tipeKendaraan, platKendaraan} | |
jsonReqKeluar, err := json.Marshal(keluar) | |
response, err = http.Post("http://127.0.0.1:8080/parkir/server/keluar/"+idKendaraan, "application/json; charset=utf-8", bytes.NewBuffer(jsonReqKeluar)) | |
if err != nil { | |
log.Fatalln(err) | |
}else { | |
var tagihan Tagihan | |
_ = json.NewDecoder(response.Body).Decode(&tagihan) | |
fmt.Println("waktu",tagihan.Waktu,"detik") | |
fmt.Println("anda membayar", tagihan.Bayar) | |
fmt.Println("success di hapus") | |
} | |
} | |
case 3: | |
router := mux.NewRouter() | |
router.HandleFunc("/parkir/client", getKendaraanAll).Methods("GET") | |
router.HandleFunc("/parkir/client/masuk", kendaraanMasuk).Methods("GET") | |
router.HandleFunc("/parkir/client/keluar/{id}", kendaraanKeluar).Methods("POST") | |
fmt.Println("Starting the application...\n ") | |
// untuk tau kapan fail koneksi | |
log.Fatal(http.ListenAndServe(":8088", router)) | |
case 4: | |
fmt.Println("Terimakasih Bapak !") | |
default: | |
fmt.Println("Maaf Inputan salah") | |
} | |
} | |
} | |
func kendaraanKeluar(writer http.ResponseWriter, request *http.Request) { | |
writer.Header().Set("Content-Type", "application/json") | |
params := mux.Vars(request) | |
var keluar Keluar | |
_ = json.NewDecoder(request.Body).Decode(&keluar) | |
var urlKeluar = "http://127.0.0.1:8080/parkir/server/keluar/"+params["id"] | |
jsonReqKeluar, err := json.Marshal(keluar) | |
response, err := http.Post(urlKeluar, "application/json; charset=utf-8", bytes.NewBuffer(jsonReqKeluar)) | |
if err != nil { | |
log.Fatalln(err) | |
}else { | |
var tagihan Tagihan | |
_ = json.NewDecoder(response.Body).Decode(&tagihan) | |
_ = json.NewEncoder(writer).Encode(tagihan) | |
} | |
} | |
func kendaraanMasuk(writer http.ResponseWriter, request *http.Request) { | |
// =============== MASUK =============== | |
waktu := Waktu{time.Now()} | |
jsonReq, err := json.Marshal(waktu) | |
_ , err = http.Post("http://127.0.0.1:8080/parkir/server/masuk", "application/json; charset=utf-8", bytes.NewBuffer(jsonReq)) | |
if err != nil { | |
log.Fatalln(err) | |
}else { | |
_, _ = fmt.Fprintf(writer, "masuk pak eko !") | |
} | |
} | |
func getKendaraanAll(writer http.ResponseWriter, request *http.Request) { | |
writer.Header().Set("Content-Type", "application/json") | |
var kendaraan map[string]Kendaraan | |
response, err := http.Get("http://127.0.0.1:8080/parkir/server") | |
if err != nil { | |
fmt.Printf("The HTTP request failed with error %s\n", err) | |
} else { | |
_ = json.NewDecoder(response.Body).Decode(&kendaraan) | |
_ = json.NewEncoder(writer).Encode(kendaraan) | |
} | |
} | |
func convertToSecond(array [3]int) int { | |
array[0] = array[0] * 3600 | |
array[1] = array[1] * 60 | |
result := 0 | |
for _, v := range array { | |
result += v | |
} | |
return result | |
} | |
func rangeTime(masuk [4]int, keluar [4]int) ([3]int, int) { | |
var newArr [4]int | |
for i := 0; i < 4; i++ { | |
newArr[i] = keluar[i] - masuk[i] | |
} | |
return [3]int{newArr[1], newArr[2], newArr[3]}, newArr[0] | |
} | |
func waktuTerkini(now time.Time) [4]int { | |
day := now.Day() | |
hour := now.Hour() | |
minute := now.Minute() | |
second := now.Second() | |
return [4]int{day, hour, minute, second} | |
} | |
func ScanPilihan() int { | |
var pilihan int | |
fmt.Print("Pilihan Anda : ") | |
_, err := fmt.Scanf("%d", &pilihan) | |
if err != nil { | |
fmt.Println(err) | |
return 0 | |
} | |
return pilihan | |
} | |
func ScanString() string { | |
var pilihan string | |
fmt.Print("Pilihan Anda : ") | |
_, err := fmt.Scanf("%s", &pilihan) | |
if err != nil { | |
fmt.Println(err) | |
return "inputan kosong" // debug mode | |
} | |
return pilihan | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"encoding/json" | |
"github.com/chilts/sid" | |
"github.com/gorilla/mux" | |
"log" | |
"net/http" | |
"time" | |
) | |
type Kendaraan struct { | |
ID string `json:"id"` | |
WaktuMasuk [4]int `json:"waktu_masuk"` | |
} | |
type Detail struct { | |
Plat string `json:"plat"` | |
Tipe string `json:"tipe"` | |
} | |
type Tagihan struct { | |
Bayar int `json:"bayar"` | |
Plat string `json:"plat"` | |
Tipe string `json:"tipe"` | |
Waktu int `json:"waktu"` | |
} | |
func (k Kendaraan) Keluar(WaktuKeluar [4]int, Tipe string, platKendaraan string) Tagihan { | |
mobilDetPertama := 5_000 | |
motorDetPertama := 3_000 | |
mobilPerSecond := 3_000 | |
motorPerSecond := 2_000 | |
bayar := 0 | |
selesihArray, selisihDay := rangeTime(k.WaktuMasuk, WaktuKeluar) | |
if selisihDay >= 1 { | |
//tarif flat bayar jika > 1 hari | |
bayar := 300_000_000 | |
return Tagihan{ | |
Bayar: bayar, | |
Plat: platKendaraan, | |
Tipe: Tipe, | |
// satu hari = 86400 detik | |
Waktu: 86400, | |
} | |
} | |
selisihSecond := convertToSecond(selesihArray) | |
if Tipe == "mobil" { | |
bayar = mobilDetPertama + (mobilPerSecond * (selisihSecond - 1)) | |
} else if Tipe == "motor" { | |
bayar = motorDetPertama + (motorPerSecond * (selisihSecond - 1)) | |
} | |
return Tagihan{ | |
Bayar: bayar, | |
Plat: platKendaraan, | |
Tipe: Tipe, | |
Waktu: selisihSecond, | |
} | |
} | |
// initating kendaraan ( MAP ) | |
var kendaraan = make(map[string]Kendaraan) | |
func main() { | |
// ========= Mock Data Test ============ | |
for i := 0; i < 2; i++ { | |
time.Sleep(2 * time.Second) | |
idParkir2 := sid.Id() | |
kendaraan[idParkir2] = Kendaraan{ | |
ID: idParkir2, | |
WaktuMasuk: waktuTerkini(time.Now()), | |
} | |
} | |
// init Router | |
router := mux.NewRouter() | |
// Handle EndPoints/Routing | |
router.HandleFunc("/parkir/server", getKendaraanAll).Methods("GET") | |
router.HandleFunc("/parkir/server/{id}", getKendaraan).Methods("GET") | |
router.HandleFunc("/parkir/server/masuk", createKendaraanMasuk).Methods("POST") | |
router.HandleFunc("/parkir/server/keluar/{id}", updateKendaraanKeluar).Methods("POST") | |
// untuk tau kapan fail koneksi | |
log.Fatal(http.ListenAndServe(":8080", router)) | |
} | |
// ========================= PARKING API ============================== | |
// Show All from Kendaraan | |
func getKendaraanAll(writer http.ResponseWriter, _ *http.Request) { | |
writer.Header().Set("Content-Type", "application/json") | |
jsonData, err := json.Marshal(kendaraan) | |
if err != nil { | |
log.Println(err) | |
} | |
_, _ = writer.Write(jsonData) | |
} | |
// Show Kendaraan by ID | |
func getKendaraan(writer http.ResponseWriter, request *http.Request) { | |
writer.Header().Set("Content-Type", "application/json") | |
params := mux.Vars(request) | |
if key, found := kendaraan[params["id"]]; found { | |
jsonData, err := json.Marshal(key) | |
if err != nil { | |
log.Println(err) | |
} | |
_, _ = writer.Write(jsonData) | |
} | |
} | |
// Crate new kendaraan masuk | |
func createKendaraanMasuk(writer http.ResponseWriter, _ *http.Request) { | |
writer.Header().Set("Content-Type", "application/json") | |
idParkir := sid.Id() | |
kendaraan[idParkir] = Kendaraan{ | |
ID: idParkir, | |
WaktuMasuk: waktuTerkini(time.Now()), | |
} | |
jsonData, err := json.Marshal(kendaraan[idParkir]) | |
if err != nil { | |
log.Println(err) | |
} | |
_, _ = writer.Write(jsonData) | |
} | |
// Pembayaran kendaraan masuk | |
func updateKendaraanKeluar(writer http.ResponseWriter, request *http.Request) { | |
writer.Header().Set("Content-Type", "application/json") | |
params := mux.Vars(request) | |
id := params["id"] | |
if _, found := kendaraan[id]; found { | |
var detail Detail | |
_ = json.NewDecoder(request.Body).Decode(&detail) | |
waktuKeluar := waktuTerkini(time.Now()) | |
tagihan := kendaraan[id].Keluar(waktuKeluar, detail.Tipe, detail.Plat) | |
delete(kendaraan, id) | |
jsonData, err := json.Marshal(tagihan) | |
if err != nil { | |
log.Println(err) | |
} | |
_, _ = writer.Write(jsonData) | |
} | |
} | |
// ======================= MY FUNC =================================== | |
func convertToSecond(array [3]int) int { | |
array[0] = array[0] * 3600 | |
array[1] = array[1] * 60 | |
result := 0 | |
for _, v := range array { | |
result += v | |
} | |
return result | |
} | |
func rangeTime(masuk [4]int, keluar [4]int) ([3]int, int) { | |
var newArr [4]int | |
for i := 0; i < 4; i++ { | |
newArr[i] = keluar[i] - masuk[i] | |
} | |
return [3]int{newArr[1], newArr[2], newArr[3]}, newArr[0] | |
} | |
func waktuTerkini(now time.Time) [4]int { | |
day := now.Day() | |
hour := now.Hour() | |
minute := now.Minute() | |
second := now.Second() | |
return [4]int{day, hour, minute, second} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment