001// --------------------------------------------------------------------------------
002// Copyright 2002-2026 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.party.server.graphql;
018
019import com.echothree.model.control.geo.server.control.GeoControl;
020import com.echothree.model.control.geo.server.graphql.GeoCodeDateTimeFormatObject;
021import com.echothree.model.control.geo.server.graphql.GeoSecurityUtils;
022import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject;
023import com.echothree.model.control.graphql.server.graphql.count.Connections;
024import com.echothree.model.control.graphql.server.graphql.count.CountedObjects;
025import com.echothree.model.control.graphql.server.graphql.count.CountingDataConnectionFetcher;
026import com.echothree.model.control.graphql.server.graphql.count.CountingPaginatedData;
027import com.echothree.model.control.graphql.server.util.BaseGraphQl;
028import com.echothree.model.control.graphql.server.util.count.ObjectLimiter;
029import com.echothree.model.control.party.server.control.PartyControl;
030import com.echothree.model.control.user.server.control.UserControl;
031import com.echothree.model.data.geo.common.GeoCodeDateTimeFormatConstants;
032import com.echothree.model.data.party.server.entity.DateTimeFormat;
033import com.echothree.model.data.party.server.entity.DateTimeFormatDetail;
034import com.echothree.util.server.persistence.Session;
035import graphql.annotations.annotationTypes.GraphQLDescription;
036import graphql.annotations.annotationTypes.GraphQLField;
037import graphql.annotations.annotationTypes.GraphQLName;
038import graphql.annotations.annotationTypes.GraphQLNonNull;
039import graphql.annotations.connection.GraphQLConnection;
040import graphql.schema.DataFetchingEnvironment;
041import java.util.ArrayList;
042import java.util.stream.Collectors;
043
044@GraphQLDescription("date time format object")
045@GraphQLName("DateTimeFormat")
046public class DateTimeFormatObject
047        extends BaseEntityInstanceObject {
048    
049    private final DateTimeFormat dateTimeFormat; // Always Present
050    
051    public DateTimeFormatObject(DateTimeFormat dateTimeFormat) {
052        super(dateTimeFormat.getPrimaryKey());
053        
054        this.dateTimeFormat = dateTimeFormat;
055    }
056
057    private DateTimeFormatDetail dateTimeFormatDetail; // Optional, use getDateTimeFormatDetail()
058    
059    private DateTimeFormatDetail getDateTimeFormatDetail() {
060        if(dateTimeFormatDetail == null) {
061            dateTimeFormatDetail = dateTimeFormat.getLastDetail();
062        }
063        
064        return dateTimeFormatDetail;
065    }
066    
067    @GraphQLField
068    @GraphQLDescription("date time format name")
069    @GraphQLNonNull
070    public String getDateTimeFormatName() {
071        return getDateTimeFormatDetail().getDateTimeFormatName();
072    }
073
074    @GraphQLField
075    @GraphQLDescription("java short date format")
076    @GraphQLNonNull
077    public String getJavaShortDateFormat() {
078        return getDateTimeFormatDetail().getJavaShortDateFormat();
079    }
080    
081    @GraphQLField
082    @GraphQLDescription("java abbrev date format")
083    @GraphQLNonNull
084    public String getJavaAbbrevDateFormat() {
085        return getDateTimeFormatDetail().getJavaAbbrevDateFormat();
086    }
087    
088    @GraphQLField
089    @GraphQLDescription("java abbrev date format weekday")
090    @GraphQLNonNull
091    public String getJavaAbbrevDateFormatWeekday() {
092        return getDateTimeFormatDetail().getJavaAbbrevDateFormatWeekday();
093    }
094    
095    @GraphQLField
096    @GraphQLDescription("java long date format")
097    @GraphQLNonNull
098    public String getJavaLongDateFormat() {
099        return getDateTimeFormatDetail().getJavaLongDateFormat();
100    }
101    
102    @GraphQLField
103    @GraphQLDescription("java long date format weekday")
104    @GraphQLNonNull
105    public String getJavaLongDateFormatWeekday() {
106        return getDateTimeFormatDetail().getJavaLongDateFormatWeekday();
107    }
108    
109    @GraphQLField
110    @GraphQLDescription("java time format name")
111    @GraphQLNonNull
112    public String getJavaTimeFormat() {
113        return getDateTimeFormatDetail().getJavaTimeFormat();
114    }
115    
116    @GraphQLField
117    @GraphQLDescription("java time format seconds")
118    @GraphQLNonNull
119    public String getJavaTimeFormatSeconds() {
120        return getDateTimeFormatDetail().getJavaTimeFormatSeconds();
121    }
122    
123    @GraphQLField
124    @GraphQLDescription("unix short date format")
125    @GraphQLNonNull
126    public String getUnixShortDateFormat() {
127        return getDateTimeFormatDetail().getUnixShortDateFormat();
128    }
129    
130    @GraphQLField
131    @GraphQLDescription("unix abbrev date format")
132    @GraphQLNonNull
133    public String getUnixAbbrevDateFormat() {
134        return getDateTimeFormatDetail().getUnixAbbrevDateFormat();
135    }
136    
137    @GraphQLField
138    @GraphQLDescription("unix abbrev date format weekday")
139    @GraphQLNonNull
140    public String getUnixAbbrevDateFormatWeekday() {
141        return getDateTimeFormatDetail().getUnixAbbrevDateFormatWeekday();
142    }
143    
144    @GraphQLField
145    @GraphQLDescription("unix long date format")
146    @GraphQLNonNull
147    public String getUnixLongDateFormat() {
148        return getDateTimeFormatDetail().getUnixLongDateFormat();
149    }
150    
151    @GraphQLField
152    @GraphQLDescription("unix long date format weekday")
153    @GraphQLNonNull
154    public String getUnixLongDateFormatWeekday() {
155        return getDateTimeFormatDetail().getUnixLongDateFormatWeekday();
156    }
157    
158    @GraphQLField
159    @GraphQLDescription("unix time format")
160    @GraphQLNonNull
161    public String getUnixTimeFormat() {
162        return getDateTimeFormatDetail().getUnixTimeFormat();
163    }
164    
165    @GraphQLField
166    @GraphQLDescription("unix time format seconds")
167    @GraphQLNonNull
168    public String getUnixTimeFormatSeconds() {
169        return getDateTimeFormatDetail().getUnixTimeFormatSeconds();
170    }
171    
172    @GraphQLField
173    @GraphQLDescription("short date separator")
174    @GraphQLNonNull
175    public String getShortDateSeparator() {
176        return getDateTimeFormatDetail().getShortDateSeparator();
177    }
178    
179    @GraphQLField
180    @GraphQLDescription("time separator")
181    @GraphQLNonNull
182    public String getTimeSeparator() {
183        return getDateTimeFormatDetail().getTimeSeparator();
184    }
185    
186    @GraphQLField
187    @GraphQLDescription("is default")
188    @GraphQLNonNull
189    public boolean getIsDefault() {
190        return getDateTimeFormatDetail().getIsDefault();
191    }
192    
193    @GraphQLField
194    @GraphQLDescription("sort order")
195    @GraphQLNonNull
196    public int getSortOrder() {
197        return getDateTimeFormatDetail().getSortOrder();
198    }
199    
200    @GraphQLField
201    @GraphQLDescription("description")
202    @GraphQLNonNull
203    public String getDescription(final DataFetchingEnvironment env) {
204        var partyControl = Session.getModelController(PartyControl.class);
205        var userControl = Session.getModelController(UserControl.class);
206
207        return partyControl.getBestDateTimeFormatDescription(dateTimeFormat, userControl.getPreferredLanguageFromUserVisit(BaseGraphQl.getUserVisit(env)));
208    }
209
210    @GraphQLField
211    @GraphQLDescription("geo code date time formats")
212    @GraphQLNonNull
213    @GraphQLConnection(connectionFetcher = CountingDataConnectionFetcher.class)
214    public CountingPaginatedData<GeoCodeDateTimeFormatObject> getGeoCodeDateTimeFormats(final DataFetchingEnvironment env) {
215        if(GeoSecurityUtils.getHasGeoCodeDateTimeFormatsAccess(env)) {
216            var geoControl = Session.getModelController(GeoControl.class);
217            var totalCount = geoControl.countGeoCodeDateTimeFormatsByDateTimeFormat(dateTimeFormat);
218
219            try(var objectLimiter = new ObjectLimiter(env, GeoCodeDateTimeFormatConstants.COMPONENT_VENDOR_NAME, GeoCodeDateTimeFormatConstants.ENTITY_TYPE_NAME, totalCount)) {
220                var entities = geoControl.getGeoCodeDateTimeFormatsByDateTimeFormat(dateTimeFormat);
221                var items = entities.stream().map(GeoCodeDateTimeFormatObject::new).collect(Collectors.toCollection(() -> new ArrayList<>(entities.size())));
222
223                return new CountedObjects<>(objectLimiter, items);
224            }
225        } else {
226            return Connections.emptyConnection();
227        }
228    }
229
230}