1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.adservices.data.adselection;
18 
19 import static androidx.room.ForeignKey.CASCADE;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.net.Uri;
24 
25 import androidx.room.ColumnInfo;
26 import androidx.room.Embedded;
27 import androidx.room.Entity;
28 import androidx.room.ForeignKey;
29 import androidx.room.Index;
30 import androidx.room.TypeConverters;
31 
32 import com.android.adservices.data.common.FledgeRoomConverters;
33 
34 import com.google.auto.value.AutoValue;
35 
36 @AutoValue
37 @AutoValue.CopyAnnotations
38 @Entity(
39         tableName = "reporting_computation_info",
40         primaryKeys = {"ad_selection_id"},
41         indices = {@Index(value = {"ad_selection_id"})},
42         foreignKeys =
43                 @ForeignKey(
44                         entity = DBAdSelectionInitialization.class,
45                         parentColumns = "ad_selection_id",
46                         childColumns = "ad_selection_id",
47                         onDelete = CASCADE))
48 @TypeConverters({FledgeRoomConverters.class})
49 public abstract class DBReportingComputationInfo {
50     /** The id associated with this auction. */
51     @AutoValue.CopyAnnotations
52     @ColumnInfo(name = "ad_selection_id")
getAdSelectionId()53     public abstract long getAdSelectionId();
54 
55     /** Uri to fetch the bidding logic from */
56     @AutoValue.CopyAnnotations
57     @ColumnInfo(name = "bidding_logic_uri")
58     @NonNull
getBiddingLogicUri()59     public abstract Uri getBiddingLogicUri();
60 
61     /** Buyers javascript, which contains {@code reportWin} */
62     @AutoValue.CopyAnnotations
63     @ColumnInfo(name = "buyer_decision_logic_js")
64     @NonNull
getBuyerDecisionLogicJs()65     public abstract String getBuyerDecisionLogicJs();
66 
67     /** Contextual signals used in {@code reportResult} */
68     @AutoValue.CopyAnnotations
69     @ColumnInfo(name = "seller_contextual_signals")
70     @Nullable
getSellerContextualSignals()71     public abstract String getSellerContextualSignals();
72 
73     /** Contextual signals used in {@code reportWin} */
74     @AutoValue.CopyAnnotations
75     @ColumnInfo(name = "buyer_contextual_signals")
76     @Nullable
getBuyerContextualSignals()77     public abstract String getBuyerContextualSignals();
78 
79     /** The Custom Audience signals of the ad which won the ad selection run. */
80     @AutoValue.CopyAnnotations
81     @Embedded(prefix = "custom_audience_signals_")
82     @Nullable
getCustomAudienceSignals()83     public abstract CustomAudienceSignals getCustomAudienceSignals();
84 
85     /** The winning ad bid for this ad selection run. */
86     @AutoValue.CopyAnnotations
87     @ColumnInfo(name = "winning_ad_bid")
getWinningAdBid()88     public abstract double getWinningAdBid();
89 
90     /** The winning ad render uri for this ad selection run. */
91     @AutoValue.CopyAnnotations
92     @ColumnInfo(name = "winning_ad_render_uri")
93     @Nullable
getWinningAdRenderUri()94     public abstract Uri getWinningAdRenderUri();
95 
96     /** Returns an AutoValue builder for a {@link DBReportingComputationInfo} entity. */
97     @NonNull
builder()98     public static DBReportingComputationInfo.Builder builder() {
99         return new AutoValue_DBReportingComputationInfo.Builder();
100     }
101 
102     /**
103      * Creates a {@link DBReportingComputationInfo} object using the builder.
104      *
105      * <p>Required for Room SQLite integration.
106      */
107     @NonNull
create( long adSelectionId, @NonNull Uri biddingLogicUri, @NonNull String buyerDecisionLogicJs, @Nullable String sellerContextualSignals, @Nullable String buyerContextualSignals, @Nullable CustomAudienceSignals customAudienceSignals, double winningAdBid, @NonNull Uri winningAdRenderUri)108     public static DBReportingComputationInfo create(
109             long adSelectionId,
110             @NonNull Uri biddingLogicUri,
111             @NonNull String buyerDecisionLogicJs,
112             @Nullable String sellerContextualSignals,
113             @Nullable String buyerContextualSignals,
114             @Nullable CustomAudienceSignals customAudienceSignals,
115             double winningAdBid,
116             @NonNull Uri winningAdRenderUri) {
117 
118         return builder()
119                 .setAdSelectionId(adSelectionId)
120                 .setBiddingLogicUri(biddingLogicUri)
121                 .setBuyerDecisionLogicJs(buyerDecisionLogicJs)
122                 .setSellerContextualSignals(sellerContextualSignals)
123                 .setBuyerContextualSignals(buyerContextualSignals)
124                 .setCustomAudienceSignals(customAudienceSignals)
125                 .setWinningAdBid(winningAdBid)
126                 .setWinningAdRenderUri(winningAdRenderUri)
127                 .build();
128     }
129 
130     /** Builder class for a {@link DBReportingComputationInfo}. */
131     @AutoValue.Builder
132     public abstract static class Builder {
133         /** Sets the adSelectionId */
setAdSelectionId(long value)134         public abstract Builder setAdSelectionId(long value);
135 
136         /** Sets the biddingLogicUri */
setBiddingLogicUri(@onNull Uri biddingLogicUri)137         public abstract Builder setBiddingLogicUri(@NonNull Uri biddingLogicUri);
138 
139         /** Sets the buyerDecisionLogicJs */
setBuyerDecisionLogicJs(@onNull String buyerDecisionLogicJs)140         public abstract Builder setBuyerDecisionLogicJs(@NonNull String buyerDecisionLogicJs);
141 
142         /** Sets the sellerContextualSignals */
setSellerContextualSignals( @ullable String sellerContextualSignals)143         public abstract Builder setSellerContextualSignals(
144                 @Nullable String sellerContextualSignals);
145 
146         /** Sets the buyerContextualSignals */
setBuyerContextualSignals(@ullable String buyerContextualSignals)147         public abstract Builder setBuyerContextualSignals(@Nullable String buyerContextualSignals);
148 
149         /** Sets the custom audience signals */
setCustomAudienceSignals( @ullable CustomAudienceSignals customAudienceSignals)150         public abstract Builder setCustomAudienceSignals(
151                 @Nullable CustomAudienceSignals customAudienceSignals);
152 
153         /** Sets the winning ad's bid */
setWinningAdBid(double winningAdBid)154         public abstract Builder setWinningAdBid(double winningAdBid);
155 
156         /** Sets the winning ad's render uri */
setWinningAdRenderUri(@onNull Uri winningAdRenderUri)157         public abstract Builder setWinningAdRenderUri(@NonNull Uri winningAdRenderUri);
158 
159         /** Builds a {@link DBAdSelectionResult} object. */
build()160         public abstract DBReportingComputationInfo build();
161     }
162 }
163