package com.twilio.jwt.client;
import com.google.common.base.Joiner;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Scope token for Outgoing Clients.
*/
public class OutgoingClientScope implements Scope {
private static final String SCOPE = Joiner.on(':').join("scope", "client", "outgoing");
private final String applicationSid;
private final String clientName;
private final Map<String, String> params;
private OutgoingClientScope(Builder b) {
this.applicationSid = b.applicationSid;
this.clientName = b.clientName;
this.params = b.params;
}
@Override
public String getPayload() throws UnsupportedEncodingException {
List<String> queryArgs = new ArrayList<>();
queryArgs.add(Joiner.on('=').join(
URLEncoder.encode("appSid", "UTF-8"),
URLEncoder.encode(this.applicationSid, "UTF-8")
));
if (this.clientName != null) {
queryArgs.add(Joiner.on('=').join(
URLEncoder.encode("clientName", "UTF-8"),
URLEncoder.encode(this.clientName, "UTF-8")
));
}
if (!this.params.isEmpty()) {
queryArgs.add(Joiner.on('=').join(
URLEncoder.encode("appParams", "UTF-8"),
URLEncoder.encode(this.getAppParams(), "UTF-8")
));
}
String queryString = Joiner.on('&').join(queryArgs);
return Joiner.on('?').join(SCOPE, queryString);
}
private String getAppParams() throws UnsupportedEncodingException {
List<String> queryParams = new ArrayList<>();
for (Map.Entry<String, String> param : params.entrySet()) {
queryParams.add(Joiner.on('=').join(
URLEncoder.encode(param.getKey(), "UTF-8"),
URLEncoder.encode(param.getValue(), "UTF-8")
));
}
return Joiner.on('&').join(queryParams);
}
public static class Builder {
private String applicationSid;
private String clientName;
private Map<String, String> params = new HashMap<>();
public Builder(String applicationSid) {
this.applicationSid = applicationSid;
}
public Builder clientName(String clientName) {
this.clientName = clientName;
return this;
}
public Builder params(Map<String, String> params) {
this.params.putAll(params);
return this;
}
public OutgoingClientScope build() {
return new OutgoingClientScope(this);
}
}
}