Skip to content
This repository was archived by the owner on Dec 16, 2024. It is now read-only.

fix: update visibility modifiers for new ftl #32

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix: update visibility modifiers for new ftl
wesbillman committed Apr 25, 2024
commit 7adcc61c1454eb2639f62e56ab9723259602d8e1
12 changes: 4 additions & 8 deletions go/http/http.go
Original file line number Diff line number Diff line change
@@ -31,8 +31,7 @@ type ErrorResponse struct {
// Example: curl -i http://localhost:8892/ingress/http/users/123/posts?postId=456
// Error Example: curl -i http://localhost:8892/ingress/http/users/000/posts?postId=456
//
//ftl:export
//ftl:ingress http GET /http/users/{userId}/posts
//ftl:public http GET /http/users/{userId}/posts
func Get(ctx context.Context, req builtin.HttpRequest[GetRequest]) (builtin.HttpResponse[GetResponse, ErrorResponse], error) {
if req.Body.UserID == "000" {
return builtin.HttpResponse[GetResponse, ErrorResponse]{
@@ -62,8 +61,7 @@ type PostResponse struct {

// Example: curl -i --json '{"user_id": 123, "post_id": 345}' http://localhost:8892/ingress/http/users
//
//ftl:export
//ftl:ingress http POST /http/users
//ftl:public http POST /http/users
func Post(ctx context.Context, req builtin.HttpRequest[PostRequest]) (builtin.HttpResponse[PostResponse, ftl.Unit], error) {
return builtin.HttpResponse[PostResponse, ftl.Unit]{
Status: 201,
@@ -81,8 +79,7 @@ type PutResponse struct{}

// Example: curl -X PUT http://localhost:8892/ingress/http/users/123 -d '{"postId": "123"}'
//
//ftl:export
//ftl:ingress http PUT /http/users/{userId}
//ftl:public http PUT /http/users/{userId}
func Put(ctx context.Context, req builtin.HttpRequest[PutRequest]) (builtin.HttpResponse[PutResponse, ftl.Unit], error) {
return builtin.HttpResponse[PutResponse, ftl.Unit]{
Headers: map[string][]string{"Put": {"Header from FTL"}},
@@ -98,8 +95,7 @@ type DeleteResponse struct{}

// Example: curl -X DELETE http://localhost:8892/ingress/http/users/123
//
//ftl:export
//ftl:ingress http DELETE /http/users/{userId}
//ftl:public http DELETE /http/users/{userId}
func Delete(ctx context.Context, req builtin.HttpRequest[DeleteRequest]) (builtin.HttpResponse[DeleteResponse, ftl.Unit], error) {
return builtin.HttpResponse[DeleteResponse, ftl.Unit]{
Headers: map[string][]string{"Delete": {"Header from FTL"}},
2 changes: 1 addition & 1 deletion kotlin/http/pom.xml
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
<version>1.0-SNAPSHOT</version>

<properties>
<ftl.version>0.180.1</ftl.version>
<ftl.version>1.0-SNAPSHOT</ftl.version>
<java.version>1.8</java.version>
<kotlin.version>1.9.23</kotlin.version>
<kotlin.compiler.incremental>true</kotlin.compiler.incremental>
18 changes: 5 additions & 13 deletions kotlin/http/src/main/kotlin/ftl/http/Http.kt
Original file line number Diff line number Diff line change
@@ -3,12 +3,8 @@ package ftl.http
import ftl.builtin.Empty
import ftl.builtin.HttpRequest
import ftl.builtin.HttpResponse
import xyz.block.ftl.*
import kotlin.String
import xyz.block.ftl.Json
import xyz.block.ftl.Context
import xyz.block.ftl.HttpIngress
import xyz.block.ftl.Method
import xyz.block.ftl.Export

data class GetRequest(
@Json("userId") val userID: String,
@@ -44,8 +40,7 @@ data class DeleteRequest(

// Example: curl -i http://localhost:8892/ingress/http/users/123/posts?postId=456
// Error Example: curl -i http://localhost:8892/ingress/http/users/000/posts?postId=456
@Export
@HttpIngress(Method.GET, "/http/users/{userId}/posts")
@Export(Visibility.PUBLIC, Ingress.HTTP, Method.GET, "/http/users/{userId}/posts")
fun `get`(context: Context, req: HttpRequest<GetRequest>): HttpResponse<GetResponse, String> {
return HttpResponse(
status = 200,
@@ -58,8 +53,7 @@ fun `get`(context: Context, req: HttpRequest<GetRequest>): HttpResponse<GetRespo
}

// Example: curl -i --json '{"user_id": 123, "post_id": 345}' http://localhost:8892/ingress/http/users
@Export
@HttpIngress(Method.POST, "/http/users")
@Export(Visibility.PUBLIC, Ingress.HTTP, Method.POST, "/http/users")
fun post(context: Context, req: HttpRequest<PostRequest>): HttpResponse<PostResponse, String> {
return HttpResponse(
status = 201,
@@ -69,8 +63,7 @@ fun post(context: Context, req: HttpRequest<PostRequest>): HttpResponse<PostResp
}

// Example: curl -X PUT http://localhost:8892/ingress/http/users/123 -d '{"postId": "123"}'
@Export
@HttpIngress(Method.PUT, "/http/users/{userId}")
@Export(Visibility.PUBLIC, Ingress.HTTP, Method.PUT, "/http/users/{userId}")
fun put(context: Context, req: HttpRequest<PutRequest>): HttpResponse<Empty, String> {
return HttpResponse(
status = 200,
@@ -80,8 +73,7 @@ fun put(context: Context, req: HttpRequest<PutRequest>): HttpResponse<Empty, Str
}

// Example: curl -X DELETE http://localhost:8892/ingress/http/users/123
@Export
@HttpIngress(Method.DELETE, "/http/users/{userId}")
@Export(Visibility.PUBLIC, Ingress.HTTP, Method.DELETE, "/http/users/{userId}")
fun delete(context: Context, req: HttpRequest<DeleteRequest>): HttpResponse<Empty, String> {
return HttpResponse(
status = 200,
3 changes: 1 addition & 2 deletions online-boutique/backend/services/ad/ad.go
Original file line number Diff line number Diff line change
@@ -36,8 +36,7 @@ type AdResponse struct {
Ads []Ad
}

//ftl:export
//ftl:ingress GET /ad
//ftl:public http GET /ad
func Get(ctx context.Context, req builtin.HttpRequest[AdRequest]) (builtin.HttpResponse[AdResponse, ftl.Unit], error) {
var ads []Ad
if len(req.Body.ContextKeys) > 0 {
9 changes: 3 additions & 6 deletions online-boutique/backend/services/cart/cart.go
Original file line number Diff line number Diff line change
@@ -27,8 +27,7 @@ type Cart struct {
Items []Item `json:"items"`
}

//ftl:export
//ftl:ingress POST /cart/add
//ftl:public http POST /cart/add
func AddItem(ctx context.Context, req builtin.HttpRequest[AddItemRequest]) (builtin.HttpResponse[AddItemResponse, ftl.Unit], error) {
store.Add(req.Body.UserID, req.Body.Item)
return builtin.HttpResponse[AddItemResponse, ftl.Unit]{
@@ -40,8 +39,7 @@ type GetCartRequest struct {
UserID string `json:"userID"`
}

//ftl:export
//ftl:ingress GET /cart
//ftl:public http GET /cart
func GetCart(ctx context.Context, req builtin.HttpRequest[GetCartRequest]) (builtin.HttpResponse[Cart, ftl.Unit], error) {
return builtin.HttpResponse[Cart, ftl.Unit]{
Body: ftl.Some(Cart{Items: store.Get(req.Body.UserID), UserID: req.Body.UserID}),
@@ -54,8 +52,7 @@ type EmptyCartRequest struct {

type EmptyCartResponse struct{}

//ftl:export
//ftl:ingress POST /cart/empty
//ftl:public http POST /cart/empty
func EmptyCart(ctx context.Context, req builtin.HttpRequest[EmptyCartRequest]) (builtin.HttpResponse[EmptyCartResponse, ftl.Unit], error) {
store.Empty(req.Body.UserID)
return builtin.HttpResponse[EmptyCartResponse, ftl.Unit]{
3 changes: 1 addition & 2 deletions online-boutique/backend/services/checkout/checkout.go
Original file line number Diff line number Diff line change
@@ -47,8 +47,7 @@ type ErrorResponse struct {
Message string `json:"message"`
}

//ftl:export
//ftl:ingress POST /checkout/{userId}
//ftl:public http POST /checkout/{userId}
func PlaceOrder(ctx context.Context, req builtin.HttpRequest[PlaceOrderRequest]) (builtin.HttpResponse[Order, ErrorResponse], error) {
logger := ftl.LoggerFromContext(ctx)

6 changes: 2 additions & 4 deletions online-boutique/backend/services/currency/currency.go
Original file line number Diff line number Diff line change
@@ -46,8 +46,7 @@ type GetSupportedCurrenciesResponse struct {
CurrencyCodes []string
}

//ftl:export
//ftl:ingress GET /currency/supported
//ftl:public http GET /currency/supported
func GetSupportedCurrencies(ctx context.Context, req builtin.HttpRequest[GetSupportedCurrenciesRequest]) (builtin.HttpResponse[GetSupportedCurrenciesResponse, ftl.Unit], error) {
return builtin.HttpResponse[GetSupportedCurrenciesResponse, ftl.Unit]{
Body: ftl.Some(GetSupportedCurrenciesResponse{CurrencyCodes: maps.Keys(database)}),
@@ -59,8 +58,7 @@ type ConvertRequest struct {
ToCode string
}

//ftl:export
//ftl:ingress POST /currency/convert
//ftl:public http POST /currency/convert
func Convert(ctx context.Context, req builtin.HttpRequest[ConvertRequest]) (builtin.HttpResponse[Money, string], error) {
from := req.Body.From
fromRate, ok := database[from.CurrencyCode]
3 changes: 1 addition & 2 deletions online-boutique/backend/services/payment/payment.go
Original file line number Diff line number Diff line change
@@ -44,8 +44,7 @@ type ChargeResponse struct {
TransactionID string
}

//ftl:export
//ftl:ingress POST /payment/charge
//ftl:public http POST /payment/charge
func Charge(ctx context.Context, req builtin.HttpRequest[ChargeRequest]) (builtin.HttpResponse[ChargeResponse, ErrorResponse], error) {
card := req.Body.CreditCard
number := strings.ReplaceAll(card.Number, "-", "")
Original file line number Diff line number Diff line change
@@ -42,8 +42,7 @@ type ErrorResponse struct {
Message string `json:"message"`
}

//ftl:export
//ftl:ingress GET /productcatalog
//ftl:public http GET /productcatalog
func List(ctx context.Context, req builtin.HttpRequest[ListRequest]) (builtin.HttpResponse[ListResponse, ftl.Unit], error) {
return builtin.HttpResponse[ListResponse, ftl.Unit]{
Body: ftl.Some(ListResponse{Products: database}),
@@ -54,8 +53,7 @@ type GetRequest struct {
ID string
}

//ftl:export
//ftl:ingress GET /productcatalog/{id}
//ftl:public http GET /productcatalog/{id}
func Get(ctx context.Context, req builtin.HttpRequest[GetRequest]) (builtin.HttpResponse[Product, ErrorResponse], error) {
for _, p := range database {
if p.ID == req.Body.ID {
@@ -73,7 +71,7 @@ type SearchResponse struct {
Results []Product
}

//ftl:export
//ftl:internal
func Search(ctx context.Context, req SearchRequest) (SearchResponse, error) {
out := SearchResponse{}
q := strings.ToLower(req.Query)
Original file line number Diff line number Diff line change
@@ -25,8 +25,7 @@ type ErrorResponse struct {
Message string `json:"message"`
}

//ftl:export
//ftl:ingress GET /recommendation
//ftl:public http GET /recommendation
func List(ctx context.Context, req builtin.HttpRequest[ListRequest]) (builtin.HttpResponse[ListResponse, ErrorResponse], error) {
cresp, err := ftl.Call(ctx, productcatalog.List, builtin.HttpRequest[productcatalog.ListRequest]{})
if err != nil {
6 changes: 2 additions & 4 deletions online-boutique/backend/services/shipping/shipping.go
Original file line number Diff line number Diff line change
@@ -26,8 +26,7 @@ type ShippingRequest struct {
Items []cart.Item
}

//ftl:export
//ftl:ingress POST /shipping/quote
//ftl:public http POST /shipping/quote
func GetQuote(ctx context.Context, req builtin.HttpRequest[ShippingRequest]) (builtin.HttpResponse[currency.Money, ftl.Unit], error) {
return builtin.HttpResponse[currency.Money, ftl.Unit]{Body: ftl.Some(moneyFromUSD(8.99))}, nil
}
@@ -36,8 +35,7 @@ type ShipOrderResponse struct {
ID string
}

//ftl:export
//ftl:ingress POST /shipping/ship
//ftl:public http POST /shipping/ship
func ShipOrder(ctx context.Context, req builtin.HttpRequest[ShippingRequest]) (builtin.HttpResponse[ShipOrderResponse, ftl.Unit], error) {
baseAddress := fmt.Sprintf("%s, %s, %s", req.Body.Address.StreetAddress, req.Body.Address.City, req.Body.Address.State)
return builtin.HttpResponse[ShipOrderResponse, ftl.Unit]{Body: ftl.Some(ShipOrderResponse{ID: createTrackingID(baseAddress)})}, nil
91 changes: 91 additions & 0 deletions online-boutique/mobile/lib/api/ad.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// ignore_for_file: unused_import
library ad;

import 'dart:convert';
import 'dart:typed_data';
import 'ftl_client.dart';
import 'builtin.dart' as builtin;


class Ad{
String redirectUrl;
String text;

Ad({ required this.redirectUrl, required this.text, });

Map<String, dynamic> toJson() {
return {
'redirectUrl': ((dynamic v) => v)(redirectUrl),
'text': ((dynamic v) => v)(text),
};
}

factory Ad.fromJson(Map<String, dynamic> map) {
return Ad(
redirectUrl: ((dynamic v) => v)(map['redirectUrl']), text: ((dynamic v) => v)(map['text']),
);
}
}

class AdRequest{
List<String> contextKeys;

AdRequest({ required this.contextKeys, });

Map<String, dynamic> toJson() {
return {
'contextKeys': ((dynamic v) => v.map((v) => v).cast<String>().toList())(contextKeys),
};
}

factory AdRequest.fromJson(Map<String, dynamic> map) {
return AdRequest(
contextKeys: ((dynamic v) => v.map((v) => v).cast<String>().toList())(map['contextKeys']),
);
}
}

class AdResponse{
String name;
List<Ad> ads;

AdResponse({ required this.name, required this.ads, });

Map<String, dynamic> toJson() {
return {
'name': ((dynamic v) => v)(name),
'ads': ((dynamic v) => v.map((v) => v.toJson()).cast<Ad>().toList())(ads),
};
}

factory AdResponse.fromJson(Map<String, dynamic> map) {
return AdResponse(
name: ((dynamic v) => v)(map['name']), ads: ((dynamic v) => v.map((v) => Ad.fromJson(v)).cast<Ad>().toList())(map['ads']),
);
}
}


class AdClient {
final FTLHttpClient ftlClient;

AdClient({required this.ftlClient});


Future<AdResponse> get(
AdRequest request, {
Map<String, String>? headers,
}) async {
final response = await ftlClient.get(
'/ad',
requestJson: json.encode(request.toJson()),
headers: headers,
);
if (response.statusCode == 200) {
final body = json.decode(utf8.decode(response.bodyBytes));
return AdResponse.fromJson(body);
} else {
throw Exception('Failed to get get response');
}
}
}